2021年2月20日土曜日

Raspberry PiのPythonとSeleniumでヘッドレスブラウザを操作する

Raspberry Piにターミナルで接続してブラウザをPythonで操作するではRaspberry PiでPythonとSeleniumでヘッドレスブラウザを操作してみたが、このときは他のパッケージの依存関係に影響がでるという副作用があった。

最近Raspberry Pi 4で試したところ簡単にインストールできたので、その手順をまとめておく。

Dockerコンテナを使う方法は以下を参照(2023/1/25追記)。


環境


OSはRaspberry Pi OS(Buster)。


SeleniumのPythonバインディングのインストール

インストールは以前と同じでpipでインストールできる。インストールされたバージョンは3.141.0。


Chromiumドライバのインストール

以前はChromiumドライバのインストールが面倒だったが、今回はaptコマンドでインストールできるドライバが使用できたので簡単になった。

インストールされたドライバのパスを確認しておく。


PythonでヘッドレスChromeを操作する。

試しにPythonでヘッドレス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()


結果は次のように期待通りに検索できた。






4 件のコメント:

  1. こんにちは

    ラズパイからWebブラウザ内のリンクをクリックさせたくて
    検索していたら、どうやら[Selnium]を使うと可能らしいことを
    Webの記事でみました。
    今回、ここの記事をみて初めて実行してみました。
    結論から、上手く行きませんでした。

    installの状態と、実行結果の状態を
    御覧下さい、解決のヒントがあれば
    お願いしたします。

    なお、普段は
    ラズパイはヘッドレス使いで
    Webラジオを楽しんでいます。
    コントロールは、PCからWifi接続Tera Termで、
    或いは、タブレットからSSHアプリ経由で
    ラズパイを使っています。

    尚、ラズパイ4B_2GB
    アップデートは適宜実行しているので、
    ラズパイOSは最新です。
    Linux *** 5.15.32-v8+ #1538 SMP PREEMPT Thu Mar 31 19:40:39 BST 2022 aarch64

    installの状態
    ====
    $ python -V
    Python 3.9.2

    $ pip install selenium

    $ sudo apt install chromium-chromedriver

    エラー無くインストールされました


    $ which chromedriver
    /usr/bin/chromedriver

    ====
    正常にinstall出来た
    ドライバーのPATHも、上記のとおり。
    ドライバのバージョンは、ブラウザのそれと一致している。

    [ 実行結果]
    $ python web_scshot.py
    =====
    /home/pi/selenium1/web_scshot.py:14: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
    driver = Chrome(executable_path='/usr/bin/chromedriver', options=options)
    Traceback (most recent call last):
    File "/home/pi/selenium1/web_scshot.py", line 22, in
    elem = driver.find_element_by_name('q')
    AttributeError: 'WebDriver' object has no attribute 'find_element_by_name'
    =====
    でした。
    ラズパイ万年初心者で、エラーの解釈と
    対応が出来ません。

    解決のヒントがあれば、宜しくご教授下さい。

    なお、一旦書込ましたが、「コメントが長すぎる」と判定されてので後でカットしました。

    返信削除
  2. ただ今、別のページのソースコードで
    成功しました。
    https://wiki.chobits.com/index.php?%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%A7Selenium
    に有る、ソースコードで
    スクリーンショットが取れている事を確認しました。

    返信削除
    返信
    1. 解決されたということで良かったです。
      お使いのseleniumのバージョンが4.0以上なら、seleniumのバージョンが違うことが原因かもしれません。新しいバージョンで、エラーメッセージにあるexecutable_pathが廃止されたようです。

      削除
  3. はい。
    実際やりたいことは、あるページ内の「ボタンを
    scriptで押し」、結果 相手の動作を引き出す事なのですが
    それ程難しくないだろうと思いましたが
    なかなか、難しいです。
    『検証』で当該の要素を見つけて、scriptで指定しようとしていますが解っていません:)
    キーボード・マウスで出来ることは
    selenimで可能とありました。なんとかなると思うのですが
    まだ、時間が掛かりそうです。:)


    返信削除