Pythonでブラウザを操作するではSeleniumのPythonバインディングでUbuntuのChromeを操作してみた。SeleniumはWebサイトのUIテストを自動化するツールで、GUIがないヘッドレスブラウザも利用できるので、GUIが使えないターミナルでも使用できる。そこで、SeleniumのPythonバインディングを使って、Raspberry Piにターミナルで接続してヘッドレスブラウザを操作してみる。
aptコマンドでインストールできるChromiumドライバが使えるようになった。
Raspberry PiのPythonとSeleniumでヘッドレスブラウザを操作する
aptコマンドでインストールできるChromiumドライバが使えるようになった。
Raspberry PiのPythonとSeleniumでヘッドレスブラウザを操作する
(2021/2/20追記)
環境
Raspberry Pi(Raspbian Buster) with desktop。
SeleniumのPythonバインディングのインストール
SeleniumのPythonバインディングはpipでインストールできる。
ChromeDriverのダウンロードとChromiumのインストール
Seleniumでブラウザを操作するには、ブラウザごとにドライバが必要になる。Pythonでブラウザを操作するではChromeDriver - WebDriver for ChromeからChromeDriverをダウンロードして使用したが、RaspbianにはChromeはインストールできないので、今回はこのドライバは使えない。代わりに、Chromiumとそのドライバを使う。Chromiumはオープンソースのブラウザで、Raspbian Buster with desktopにはデフォルトでインストールされている。ChromeはオープンソースのChromiumにGoogleが独自の機能を追加したもので、Chromium用のドライバはchromium-chromedriverとなっている。Chromium用のドライバはaptコマンドでインストールできるが、このドライバではSeleniumを使うときにエラーが出てしまった。
そこで、Chromiumとそのドライバを別のところから調達。LaunchpadのリポジトリからUbuntu Xenial用のパッケージをダウンロードしてインストールした。
ただし注意点として、もともとインストールされていたChromiumよりも新しいバージョンをインストールすることになるので、依存関係のためにaptコマンドでufwがインストールできなくなる。
その場合ufw 0.35-0ubuntu2 (armhf binary) in ubuntu xenialをダウンロードしてインストールできるが、他にもこうしたパッケージがあるかもしれない。
ダウンロードするUbuntu Xenial用パッケージはhttps://launchpad.net/ubuntu/xenialから検索できる。Chromiumとそれと依存関係にあるパッケージ2つ、それにChromedriverをダウンロード。
続いて、ダウンロードしたパッケージをインストール。
Chromedriverをインストールしたら、パスを確認しておく。
PythonでヘッドレスChromiumを操作する
SeleniumとPythonでヘッドレスChromiumを操作してみる。Raspberry Piにターミナルで接続し、以下のコードを実行する。ヘッドレスChromiumが起動して、Googleで「Raspberry Pi」を検索し、その結果をスクリーンショットにとる。
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
if __name__ == '__main__':
url = 'https://www.google.com'
# ブラウザーをヘッドレスで起動
options = ChromeOptions()
options.add_argument('-headless')
# Chromedriverのパスを指定
driver = Chrome(executable_path='/usr/bin/chromedriver', options=options)
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('chromium_search.png')
driver.close()
結果は以下の通りで、ちゃんと検索できた。

0 件のコメント:
コメントを投稿