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 件のコメント:
コメントを投稿