2019年10月3日木曜日

Raspberry Piにターミナルで接続してブラウザをPythonで操作する

Pythonでブラウザを操作するではSeleniumのPythonバインディングでUbuntuのChromeを操作してみた。SeleniumはWebサイトのUIテストを自動化するツールで、GUIがないヘッドレスブラウザも利用できるので、GUIが使えないターミナルでも使用できる。そこで、SeleniumのPythonバインディングを使って、Raspberry Piにターミナルで接続してヘッドレスブラウザを操作してみる。

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

コメントを投稿