Web開発やWebアプリを利用する上で、コマンドラインからブラウザを操作したい。
実現方法を教えて欲しい。
こんなお悩みを解決します。
今回は、Raspberry Pi、Docker、seleniumを用いて、PythonによるGoogle Chromeブラウザの操作環境を構築します。
前提条件
まず、前提条件を揃えるために、私が利用しているハードウェアやソフトウェアのバージョンを示しておきます。
Raspberry Pi
Raspberry Piは、「Raspberry Pi 4 Model B 8GB」を利用します。
OS
OSは、「Raspberry Pi OS Lite 64bit版」を利用します。
uname -a
Linux raspberrypi 5.15.32-v8+ #1538 SMP PREEMPT Thu Mar 31 19:40:39 BST 2022 aarch64 GNU/Linux
cat /etc/issue
Debian GNU/Linux 11 \n \l
cat /etc/debian_version
11.3
Docker
Dockerは、rootlessバージョンを利用します。
docker --version
Docker version 20.10.14, build a224086
docker-compose
docker-composeは、バージョン1.29.2を利用します。
docker-compose version
docker-compose version 1.29.2, build unknown
docker-py version: 5.0.3
CPython version: 3.9.2
OpenSSL version: OpenSSL 1.1.1n 15 Mar 2022
環境構築
ここでは、以下のような構成を考えます。
それぞれのコンテナと使用するポートの関係は以下のようになります。
コンテナ名 | 説明 | 使用するポート番号 |
---|---|---|
selenium | seleniumで操作するブラウザが起動するコンテナ 使用するブラウザ:Google Chrome | 4444(appコンテナ用) 5900(VNC client用) 7900(noVNC client用) |
app | seleniumコンテナで起動しているブラウザを制御するためのコンテナ | 4444(seleniumコンテナ用) |
ここで、Port 5900とPort 7900は、それぞれHost OSと共有するポートで、5900がVNC client用、7900がブラウザ用となります。
また、7900にアクセスする際はsecret
というパスワードを入力する必要があります。
すなわち、VNC clientで宛先をRaspberry Pi、ポート番号として5900を指定すると、seleniumコンテナ上で起動しているGoogle Chromeブラウザにアクセスできます。
また、ブラウザからhttp://raspberrypi-ip-address:7900/
にアクセスした場合もseleniumコンテナ上で起動しているGoogle Chromeブラウザにアクセスできます。
実装結果は、以下に格納してあります。
https://github.com/yuruto-free/docker-selenium-raspberrypi/tree/master
動作確認
今回は、Googleで「wikipedia」と検索し、最初に表示される検索結果の情報を取得してみたいと思います。
該当する部分の実装は以下のようになります。
def test_func(driver, wait):
# access to google
driver.get('https://google.com')
# search "wikipedia"
driver.find_element(By.NAME, 'q').send_keys('wikipedia' + Keys.RETURN)
# wait until the search results are displayed
result = wait.until(presence_of_element_located(
(By.CSS_SELECTOR, 'h3')
))
text = result.get_attribute('textContent')
print(text)
実行結果は、以下のようになります。期待通り、「ウィキペディア」という出力結果が得られています。
PythonでGoogle Chromeを操作しよう!
Raspberry Pi、Docker、seleniumを用いて、PythonによるGoogle Chromeブラウザの操作環境を構築しました。
Dockerを使っているので、ホスト環境に影響しない形式でPythonスクリプトを動かすことができます。
今後、今回構築した環境をベースに、ブラウザで定期的に実行したいコードを実装していこうと思います。