環境
macOS ventura 13.2
python 3.10
selenium 4.0
seleniumで必須の、GoogleChrome_Driverがversion115になってから、Errorが出るようになった。
「WebDriverのパスを指定」して実行すると以下のメーセージがでてseleniumができない。(webdriver-manager を使用する場合はメッセージは出ず、通常通りseleniumは使用できる)
selenium.common.exceptions.NoSuchDriverException: Message: Unable to locate or obtain driver for chrome; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location
原因はGoogleChromeのdriverが115になってからのようです。
「webdriver_manager」については既に対応されており、現在は正常に動いているが、「WebDriverのパスを指定」する場合は、対応が必要とのこと。
このページを参考にしました。
管理しているページをクリックすると下記のサイトが開きます。
次に赤枠のリンクをクリックすると「Chrome for Testing availability」のサイトが開きます。
問題はここからどうやっていいのか解らなかったので、色々調べてつなぎ合わせたところ、出来たのでここに記録しておきます。
ここからのフロー
「Chrome for Testing availability」のサイトを開きます
1、「Chrome for Testing availability」のサイトで、Stable(安定)の中から、自分に合った「chromedriver」を探します。
私の場合は、iMacでプロセッサがIntel core i3なので64ビットと言うことから「mac-x64」を選択しました。(ちなみに、arm64は、2020年後半以降に出荷されているApple Siliconを搭載した新型Macで採用されているアーキテクチャです。)
<参考>
chromedriver mac-x64にあるURLをクリックすると“edgedl.me.gvt1.com”でのダウンロードを許可しますか?”となるので「許可」をクリックするとダウンロードがはじまります。
2、Finderを開いて、アプリケーションの中から「Google Chrome.app」を右クリック「パッケージの内容を表示」をクリック
ダウンロードした下記ファイルを「/Applications/Google Chrome.app/Contents/MacOS」へ貼り付ける(以前からある「Google Chrome」は削除しない。削除したら動かなかった)
これで完了です。
試しに、次のtestprogram.pyで試してみてください。
<参考>driver_pathの調べ方は
# Chrome WebDriverのパスを指定してServiceオブジェクトを作成(GoogleChromeのアドレスバーへ「chrome://version」と入力)
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
1、GoogleChromeのアドレスバーに「chrome://version」と入力
2、実行ファイルのパスをCopy & Pasteして、/Applications/Google Chrome.app/Contents/MacOS/の次のGoogle Chromeをchromedriverに書き換えます。(理由はわかりません)
以上です。
また通常は「ChromeDriverManager」を使用する方が一般的ですが、今回はこれが一時期使えなかったため、「Chrome WebDriverのパスを指定」する方法を試してみました。後で触れますが、codeの違いは以下の部分だけです。
(ChromeDriverManagerを使用した場合のcode)
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
(Chrome WebDriverのパスを指定した場合のcode)
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
driver = webdriver.Chrome(service=ChromeService(driver_path))
では、試してみてください。
# testprogram.py
# Chrome WebDriverのパスを指定してServiceオブジェクトを作成
# ------------------------------------------------------
# seleniumオブジェクト
# さまざまなブラウザを制御するためのクラスを提供(主にWebアプリケーションのテストやスクレイピングなどに使用するモジュール)
from selenium import webdriver
# Serviceクラスは、ブラウザのドライバーを実行するためのサービスを管理するためのクラス
# find_element() メソッドを呼び出す際に要素を見つける方法を指定するために使用
from selenium.webdriver.common.by import By
# 要素が特定の条件を満たすまで待機するために使用
from selenium.webdriver.support.ui import WebDriverWait
# WebDriverWait と組み合わせて、要素が特定の条件を満たすまで待機するために使用
from selenium.webdriver.support import expected_conditions
# Serviceクラスは、ブラウザのドライバーを実行するためのサービスを管理するためのクラス
# 通常、直接使用することはありませんが、カスタム設定が必要な場合に便利
from selenium.webdriver.chrome.service import Service as ChromeService
# -----------------------------------------------------------
import time
# -----------------------------------------------------------
# Chrome WebDriverのパスを指定してServiceオブジェクトを作成(GoogleChromeのアドレスバーへ「chrome://version」と入力)
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
# Serviceを使用してWebDriverを起動
driver = webdriver.Chrome(service=ChromeService(driver_path))
# ------------------------------------------------------
# ヘッドレスモード設定
options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver.get('https://google.com')
# ------------------------------------------------------
# 検索文字を入力するためのxpath
xpath = '//*[@id="APjFqb"]'
search = "python"#input('検索する内容:')
# タイムアウトを10秒に設定
wait = WebDriverWait(driver, 10)
# 検索文字列を入力
input = driver.find_element(By.XPATH,xpath)#<-selenium3以降
input.send_keys(search + 'について')
input.submit()
# すべてのページが表示されるまで2秒待機
time.sleep(2)
#ターミナルへ表示
for elem_h3 in driver.find_elements(By.XPATH,'//a/h3'):
elem_a = elem_h3.find_element(By.XPATH,'..')
print(elem_h3.text)
print(elem_a.get_attribute('href'))
print('')
print('-'*50)
# このドライバを終了し、開かれていたすべての関連ウィンドウを閉じる
driver.quit()
ちなみに上記codeを、通常使用している「ChromeDriverManager」へ変更する場合は、testprogram.pyの次の部分のCodeを書き換えるだけです。
(Chrome WebDriverのパスを指定した場合のcode)
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
driver = webdriver.Chrome(service=ChromeService(driver_path))
(ChromeDriverManagerを使用した場合のcode)
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
なお、通常は「ChromeDriverManager」を使用する方が一般的ですが、今回はこれが使えない時があった為、「Chrome WebDriverのパスを指定」する方法を試すために試行錯誤した結果を記録しました。