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()
結果は次のように期待通りに検索できた。
こんにちは
返信削除ラズパイから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'
=====
でした。
ラズパイ万年初心者で、エラーの解釈と
対応が出来ません。
解決のヒントがあれば、宜しくご教授下さい。
なお、一旦書込ましたが、「コメントが長すぎる」と判定されてので後でカットしました。
ただ今、別のページのソースコードで
返信削除成功しました。
https://wiki.chobits.com/index.php?%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%A7Selenium
に有る、ソースコードで
スクリーンショットが取れている事を確認しました。
解決されたということで良かったです。
削除お使いのseleniumのバージョンが4.0以上なら、seleniumのバージョンが違うことが原因かもしれません。新しいバージョンで、エラーメッセージにあるexecutable_pathが廃止されたようです。
はい。
返信削除実際やりたいことは、あるページ内の「ボタンを
scriptで押し」、結果 相手の動作を引き出す事なのですが
それ程難しくないだろうと思いましたが
なかなか、難しいです。
『検証』で当該の要素を見つけて、scriptで指定しようとしていますが解っていません:)
キーボード・マウスで出来ることは
selenimで可能とありました。なんとかなると思うのですが
まだ、時間が掛かりそうです。:)