seleniumで、「selenium.common.Exceptions.NoSuchDriverException」が出た時の「WebDriverのパスを指定」の対処

# 環境
>macOS ventura 13.2
python 3.10
selenium 4.0


# seleniumで必須の、GoogleChrome_Driverがversion115になってから、Errorが出るようになった。

><font color="red">「WebDriverのパスを指定」して実行すると以下のメーセージがでてseleniumができない。</font>（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

<img title="Error Message" alt="Error Message" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/56fb7b11-7047-1e10-45e6-620e686be56e.png">

>**原因はGoogleChromeのdriverが115になってから**のようです。
「webdriver_manager」については既に対応されており、現在は正常に動いているが、「WebDriverのパスを指定」する場合は、対応が必要とのこと。

このページを参考にしました。

https://javeo.jp/error_webdriver_manager/

<img title="原因を探ってみる" alt="原因を探ってみる" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/e9b1b846-812e-203a-c762-23b2d4894a49.png">

>管理しているページをクリックすると下記のサイトが開きます。
<img title="管理しているページ" alt="管理しているページ" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/9eb5ebc1-7171-b368-c2b9-9efd8570ac33.png">

>次に赤枠のリンクをクリックすると<font color="brown">「Chrome for Testing availability」</font>のサイトが開きます。
**問題はここからどうやっていいのか解らなかったので、色々調べてつなぎ合わせたところ、出来たのでここに記録しておきます。**


# ここからのフロー
>「Chrome for Testing availability」のサイトを開きます

https://googlechromelabs.github.io/chrome-for-testing/


>### 1、「Chrome for Testing availability」のサイトで、Stable(安定)の中から、**自分に合った「chromedriver**」を探します。
<img title="「Chrome for Testing availability」のサイト" alt="「Chrome for Testing availability」のサイト" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/63740ac8-9019-b5d4-91bf-339383e2708f.png">

>私の場合は、iMacでプロセッサが**Intel core i3なので64ビット**と言うことから「mac-x64」を選択しました。（ちなみに、arm64は、2020年後半以降に出荷されている**Apple Siliconを搭載した新型Mac**で採用されているアーキテクチャです。）
＜参考＞

https://support.apple.com/ja-jp/HT201948

>**chromedriver　mac-x64にあるURL**をクリックすると“edgedl.me.gvt1.com”でのダウンロードを許可しますか?”となるので「許可」をクリックするとダウンロードがはじまります。
<img title="Finder_Download" alt="Finder_Download" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/7f9dfa43-9a40-d064-9192-5b38253211a6.png">

>### 2、Finderを開いて、アプリケーションの中から<font color="red">「Google Chrome.app」</font>を右クリック「パッケージの内容を表示」をクリック
<img title="Finder_Application" alt="Finder_Application" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/4da6520f-e760-4d1b-a5eb-5a740239535b.png">

>ダウンロードした下記ファイルを<font color="red">「/Applications/Google Chrome.app/Contents/MacOS」</font>へ貼り付ける（以前からある「Google Chrome」は削除しない。削除したら動かなかった）
<img title="Finder_Application" alt="Finder_Application" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/a8cd9281-fb54-5f95-0bc3-f3d6b6f5317a.png">

>これで完了です。

### 試しに、次のtestprogram.pyで試してみてください。
**＜参考＞driver_pathの調べ方は**

```python
# Chrome WebDriverのパスを指定してServiceオブジェクトを作成（GoogleChromeのアドレスバーへ「chrome://version」と入力）
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
```

>１、GoogleChromeのアドレスバーに<font color="red">「chrome://version」</font>と入力
<img title="Error Message" alt="Error Message" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/b1b8ee34-9d9f-bb93-d3b4-3ce90e3059bd.png"> ２、<font color="red">実行ファイルのパス</font>をCopy & Pasteして、/Applications/Google Chrome.app/Contents/MacOS/の次の<font color="red">Google Chrome</font>を<font color="red">chromedriver</font>に書き換えます。（理由はわかりません）
以上です。

>また通常は「ChromeDriverManager」を使用する方が一般的ですが、今回はこれが一時期使えなかったため、「Chrome WebDriverのパスを指定」する方法を試してみました。後で触れますが、codeの違いは以下の部分だけです。
><font color="brown">(ChromeDriverManagerを使用した場合のcode)</font>
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
<font color="brown">(Chrome WebDriverのパスを指定した場合のcode)</font>
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
driver = webdriver.Chrome(service=ChromeService(driver_path))


では、試してみてください。

```python
# 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を書き換えるだけです。
><font color="brown">(Chrome WebDriverのパスを指定した場合のcode)</font>
```python
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
driver = webdriver.Chrome(service=ChromeService(driver_path))

```
><font color="brown">(ChromeDriverManagerを使用した場合のcode)</font>
```python
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
```
なお、通常は「ChromeDriverManager」を使用する方が一般的ですが、今回はこれが使えない時があった為、「Chrome WebDriverのパスを指定」する方法を試すために試行錯誤した結果を記録しました。

### 下記は、ChatGPTに質問した回答です。
<img title="ChatGPTに質問した回答" alt="ChatGPTに質問した回答" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/f7791b5e-87a3-4800-e8d3-f80dac98794b.png">