Contents
はじめに
本記事では、Python、Docker、Seleniumを組み合わせてブラウザの自動化環境を構築し、VNCを使ってリアルタイムで動作を確認する方法を紹介します。Seleniumを使用することで、ブラウザの操作を自動化し、テストやスクレイピングを効率的に行うことができます。Dockerを使用することで、環境依存を排除し、どのマシン上でも同じ環境で実行することが可能です。
具体的にはPython実行環境とSeleniumHQ/docker-seleniumはDocker Composeを利用して別のコンテナとして立てます。そしてSeleniumHQ/docker-seleniumを通じてVNC接続することで、簡単にクローラの挙動をチェックできます。
構築環境はWindowsのdocker for desktopを想定しています
環境構築
必要なツールとライブラリ
- Docker(docker for desktop)
- Python
- Selenium(4.14)
- VNC Viewer(Realvnc)
Docker
・Dockerのインストール
https://www.docker.com/products/docker-desktop/
VNC
Docker環境は完全に閉じた環境なので、ホストマシンのブラウザを見ながらのデバッグができません。
そこで、Docker環境内にあるLinux上のデスクトップ画面をリモートアクセスして表示するために、VNCツールを使います。VNCソフトは色々ありますが自分はRealvncを使用しています
・Realvncのダウンロード
https://www.realvnc.com/en/connect/download/viewer/
Dockerイメージの準備
以下のGITのリポジトリを手動かgit cloneでダウンロードしてください
イメージの中身は有志の方が作成してくださったサンプルを一部改良しています
GITのURL:https://github.com/beginerSE/docker_python_selenium_test
ディレクトリ構成
.devcontainer devcontainer.json app\ .vscode\ launch.json settings.json src\ test.py Dockerfile requirements.txt build.sh docker-compose.yml
<Dockerfile>
FROM python:3.7-slim-buster ENV PYTHONIOENCODING utf-8 ENV TZ="Asia/Tokyo" ENV LANG=C.UTF-8 ENV LANGUAGE=en_US:en WORKDIR /app COPY ./requirements.txt ./requirements.txt RUN \ pip install -r requirements.txt
<requirements.txt>
autopep8==1.5.7 pycodestyle==2.7.0 selenium==4.11.0 toml==0.10.2 urllib3==1.26.5
<docker-compose.yml>
version: "3" services: selenium: container_name: python-selenium-on-docker_selenium image: selenium/standalone-firefox-debug:3.141.59 ports: - 4444 - 5901:5900 volumes: - /dev/shm:/dev/shm app: container_name: python-selenium-on-docker_app depends_on: - selenium build: ./app volumes: - ./app:/app environment: SELENIUM_URL: http://selenium:4444/wd/hub tty: true
設定確認
ダウンロードしたらDOCKERのホーム画面から「setting」→「Resources」→「File sharing」にリポジトリのフォルダのパスを追加して「apply&restart」を押して設定を反映させてください
これを行わないと「Docker : Error response from daemon: user declined directory sharing」というエラーが発生することがあります。
またアイコンの部分を右クリックして以下のようにswitch to linux containerが表示されている場合はこれをクリックしてください
コンテナの起動&環境構築
次は実際に環境構築を行います。具体的にはcdコマンドで「docker-compose.yml」がある直下のディレクトリにアクセスして以下のコマンドでコンテナを起動します
cd C:\Users\xxxx\ダウンロード\python-selenium-on-docker-master ←PATHは環境に合わせて変更 docker-compose build --no-cache docker-compose up -d docker-compose exec app bash
実行するとコンソールの画面の左端が ~~>から
root@<コンテナID>:/app# に代わっていればコンテナ起動&コンテナ内へのアクセスが成功しています
VNC Viewerの起動
VNC Viewerを使用して、ブラウザの操作をリアルタイムで確認します。具体的にはVNC Viewerを開き
接続先にlocalhost:5900を入力して接続をクリックします。(パスワードはデフォルトでsecretです。)
以下の画像のような画面が表示されていればアクセス成功です。これで、Dockerコンテナ内で実行されているブラウザの操作をリアルタイムで確認することができます。
Seleniumのスクリプトを実行して動作確認
コンテナ内のBASHにアクセスしている状態で以下のコマンドを実行しSeleniumを起動します
(root@<コンテナID>:/app#) python /app/src/test.py
<test.py>
import os from selenium.webdriver.common.by import By from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import selenium print("seleniumのバージョン",selenium.__version__) from selenium.webdriver.firefox.options import Options as FirefoxOptions options = FirefoxOptions() cloud_options = {} cloud_options['build'] = "build_1" cloud_options['name'] = "test_abc" options.set_capability('cloud:options', cloud_options) driver = webdriver.Remote( command_executor=os.environ["SELENIUM_URL"], options=options ) driver.implicitly_wait(5) # ここからコーディング driver.get("https://www.time-j.net/worldtime/country/jp") print(driver.find_element(By.XPATH, "/html/body/div/div[6]/div[1]/div/p[5]").text) driver.quit()
<出力結果(例)>
PCの内蔵時計は、0.2秒遅れています。
Seleniumの動作確認用プログラムです。
実行するとVNC Viewerでブラウザが起動しサイトにアクセスが始まります
コンテナの終了
Dockerコンテナ内で起動したBashから抜けるためには、以下のコマンドを使用します。
(root@<コンテナID>:/app#)exit
このコマンドを実行すると、現在のBashセッションが終了し、元のホストマシンのシェルに戻ります。
もしexit
コマンドがうまく機能しない場合は、Ctrl + D
を押すことでBashセッションを終了することもできます。これはBashセッションの終了と同様の効果を持ちます。
またバックグラウンドで起動しているコンテナをシャットダウンするには以下のコマンドを実行します
$ docker-compose down
pyファイルやモジュール更新を反映させる
requirement.txtへのモジュールの追加やPYファイルの記述を変更した際に変更を反映するにはコンテナをREBUILDする必要があります。実行コマンドは最初に実行した以下の2つです
docker-compose build --no-cache docker-compose up -d
まとめ
この記事では、DockerとSeleniumを使用してブラウザの自動化環境を構築し、VNCを使って操作を視覚的に確認する方法を紹介しました。これにより、開発環境の差異を気にせず、安定した自動化テストやスクレイピングを行うことが可能です。
参考:https://qiita.com/ryoheiszk/items/93b2d52eec370c09a22e
コメント
[…] 前回の記事:【Python】Docker+Seleniumで自動化環境を構築してVNCでブラウザの動作確認 […]
[…] 前回の記事:【Python】Docker+Seleniumで自動化環境を構築してVNCでブラウザの動作確認 […]