raspberry pi への selenium, chromedriver の動作

すごくハマったのでメモ

システム raspberry pi 4B

RAM 4GB

OS Ubuntu mate 20.04 64bit

通常通りにchromium-browserからインストールしようとすると以下のエラー

$ sudo apt install chromium-browser
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ chromium-chromedriver が見つかりません  

指定したレポジトリにはありそうだが、なぜかインストールできず。

packages.ubuntu.com

packages.ubuntu.com

そのため、手動でインストールする。

ports.ubuntu.com ubuntuのレポジトリから適したソースをダウンロードする。 今回、raspberry piアーキテクチャはarmのため、arm64, armhfが適切だが arm64は動作しなかったのでarmhfをインストールする。 現在(2022/02/05)で最新のversion 80 をインストールする。

$ curl -O http://ports.ubuntu.com/pool/universe/c/chromium-browser/chromium-browser_80.0.3987.163-0ubuntu1_arm64.deb
$ curl -O http://ports.ubuntu.com/pool/universe/c/chromium-browser/chromium-chromedriver_80.0.3987.163-0ubuntu1_arm64.deb

$ ls
chromium-browser_80.0.3987.163-0ubuntu1_arm64.deb  chromium-chromedriver_80.0.3987.163-0ubuntu1_arm64.deb

$ sudo dpkg -i chromium-browser_80.0.3987.163-0ubuntu1_arm64.deb chromium-chromedriver_80.0.3987.163-0ubuntu1_arm64.deb

$ which chromedriver
/usr/bin/chromedriver

$ chromedriver --version
ChromeDriver 98.0.4758.80 (7f0488e8ba0d8e019187c6325a16c29d9b7f4989-refs/branch-heads/4758@{#972})

pythonソースコードで確認した ソースはこちらの方のものを流用して、一部修正しました。 irukanobox.blogspot.com

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.firefox.options import Options
from selenium import webdriver

if __name__ == '__main__':
    url = 'https://www.google.com'

    print('start')
    options = ChromeOptions()
    options.add_argument('-headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-gpu') #このオプションを外すとクラッシュするため必須
    options.add_argument('--disable-dev-shm-usage')
    driver = Chrome(executable_path='/usr/bin/chromedriver', options=options)

    print('get url')
    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()

スクリーンショットが作成されていることを確認して終了。

python3 test.py