Raspberry Pi上のDockerでSeleniumを使う場合、Doker Hubにはselenium/standalone-chromeをforkしてRaspberry PiのCPUアーキテクチャであるARMに対応したseleniarm/standalone-chromiumがある。ただ、selenium/standalone-chromeのイメージにインストールされているPythonのバージョンは3.8と少し古い。そこで、今回はSeleniumと最新バージョンのPythonがインストールされたDockerコンテナを作成して、Raspberry Piで起動してみる。
環境
Raspberry Pi OS(64bit)。Raspberry Pi OS(64bit)にDockerとComposeをインストールする方法はRaspberry Pi OS 64bitでDockerを使うを参照。
$ lsb_release -dr Description: Raspbian GNU/Linux 11 (bullseye) Release: 11 $ docker --version Docker version 20.10.21, build baeda1f $ docker-compose --version docker-compose version 1.29.2, build unknown
Dockerfileの作成
Seleniumと最新Pythonが使えるDockerイメージを作成するためのDockerfileを用意する。ベースとなるDockerイメージとしてDocker Hubにある公式のPyrthonイメージの3.11-bullseyeを使う。Seleniumを使うにはブラウザとドライバが必要だが、今回はFirefoxとそのドライバであるgeckodriverをインストールする。Firefoxで日本語を表示できるように、日本語フォントの googlefonts / noto-cjkもインストールする。
FROM python:3.11-bullseye WORKDIR /app # Firefoxと日本語フォントインストール RUN apt update \ && apt -y install --no-install-recommends \ # 日本語フォントインストール # 日本語フォントをインストールしておかないとFirefoxの表示が文字化けする fonts-noto-cjk \ firefox-esr \ && apt clean # SeleniumのPythonバインディングインストール RUN pip install selenium --no-cache-dir # geckodriverインストール RUN curl -LO https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-linux-aarch64.tar.gz \ && tar xzvf geckodriver-v0.32.0-linux-aarch64.tar.gz \ && mv geckodriver /usr/bin/ \ && rm geckodriver-v0.32.0-linux-aarch64.tar.gz
docker-composeファイルとSeleniumを使うサンプルスクリプトの用意
Dockerfileのほかに、docker-compose.ymlとSeleniumを使うPythonサンプルスクリプトを用意する。
version: '3' services: selenium: build: context: . dockerfile: ./Dockerfile tty: true environment: - TZ=Asia/Tokyo volumes: - ./app:/app
以下のPythonスクリプトでは、Firefoxを起動してGoogleで「Raspberry Pi」を検索し、結果のスクリーンショットを保存する。
import os from selenium.webdriver import Firefox, FirefoxOptions from selenium.webdriver.firefox.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions url = 'https://www.google.com' # ブラウザーをヘッドレスで起動 options = FirefoxOptions() options.add_argument('-headless') service = Service( executable_path='/usr/bin/geckodriver', log_path=os.devnull ) with Firefox(service=service, options=options) as driver: driver.get(url) # 画面表示を最大5秒まで待つ driver.implicitly_wait(5) # 検索ボックスのエレメントを取得(inputタグのname属性はq) elem = driver.find_element(By.NAME, 'q') # 検索ボックス内のテキストをクリア elem.clear() # 検索ワードを入力 elem.send_keys('Raspberry Pi') # 検索ボタンがクリックできるようになるまで最大10秒待つ wait = WebDriverWait(driver, 10) input = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, "//input[@value='Google 検索']"))) if input.get_attribute('type') == 'submit': input.click() else: print('Failed to find submit button.') # 検索結果がなければ「No results found.」と表示する assert 'No results found.' not in driver.page_source # スクリーンショットを保存 driver.save_screenshot('firefox_search.png')
ファイル配置は以下のようになる。
|-- Dockerfile
|-- app
| `-- sample.py
`-- docker-compose.yml
コンテナ上でSeleniumを使う
ファイルの準備ができたら、Dockerイメージを作成してSeleniumをPythonで使ってみる。まずはイメージをビルドする。
$ docker-compose build
続いて、コンテナ上で、作成したPythonスクリプトを実行する。
$ docker-compose run selenium python sample.py
スクリプトを実行すると、以下のようなfirefox_search.pngというFirefoxのスクリーンショットファイルが保存される。
0 件のコメント:
コメントを投稿