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を使うを参照。
1 2 3 4 5 6 7 | $ 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もインストールする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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サンプルスクリプトを用意する。
1 2 3 4 5 6 7 8 9 10 11 | version: '3' services: selenium: build: context: . dockerfile: . / Dockerfile tty: true environment: - TZ = Asia / Tokyo volumes: - . / app: / app |
以下のPythonスクリプトでは、Firefoxを起動してGoogleで「Raspberry Pi」を検索し、結果のスクリーンショットを保存する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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 # ブラウザーをヘッドレスで起動 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で使ってみる。まずはイメージをビルドする。
1 | $ docker-compose build |
続いて、コンテナ上で、作成したPythonスクリプトを実行する。
1 | $ docker-compose run selenium python sample.py |
スクリプトを実行すると、以下のようなfirefox_search.pngというFirefoxのスクリーンショットファイルが保存される。
0 件のコメント:
コメントを投稿