TypeError: WebDriver.init() got an unexpected keyword argument 'executable_path' in Selenium Python
主要ポイント
このエラーはSelenium 4.10.0での変更により発生します。最新バージョンではexecutable_path
引数が廃止され、代わりにService
オブジェクトを使用します。
問題の原因
Selenium 4.10.0(2023年6月リリース)で以下のような変更が導入されました:
# 旧コード(4.10.0以前)
driver = webdriver.Chrome(executable_path='./chromedriver.exe', options=option)
# エラーメッセージ
TypeError: WebDriver.__init__() got an unexpected keyword argument 'executable_path'
このエラーが発生する直接的な原因は、Selenium 4.10.0でexecutable_path
パラメータがWebDriver.__init__()
メソッドから削除されたためです。公式ドキュメントでも明確にこの変更が示されており、代わりの方法が推奨されています。
解決方法
方法1: Serviceオブジェクトを使用する(推奨)
最新のSelenium(4.10.0以降)ではService
クラスを使ってドライバーの実行パスを指定します:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# Serviceオブジェクトを作成
service = Service(executable_path='./chromedriver.exe')
# Chromeオプションの設定
options = webdriver.ChromeOptions()
# WebDriverの初期化 (service引数を使用)
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.google.com/')
# 終了処理
driver.quit()
この方法が推奨される理由
Service
オブジェクトはドライバーの実行パスだけでなく、ポート設定やログ出力など、ドライバーに関連する高度な設定も一括で管理できます。Selenium公式でもこの方法が推奨されています。
方法2: Selenium Managerを活用する(設定不要)
Selenium 4.6.0以降ではSelenium Managerという自動ドライバ管理機能が導入されており、明示的なパス指定が不要になりました:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# オプション設定
options = Options()
# executable_pathなしで初期化
driver = webdriver.Chrome(options=options)
driver.get('https://www.google.com/')
注意点
この方法はシステムに適切なブラウザドライバーがインストールされている場合のみ機能します。初回実行時に自動的に必要なドライバーがダウンロードされます。
方法3: webdriver-managerを使う(プロジェクト別管理)
プロジェクトごとに異なるドライババージョン管理が必要な場合、webdriver-manager
パッケージが便利です:
pip install webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
service = ChromeService(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
webdriver-managerのメリット
- 自動で最新の互換ドライバーをダウンロード
- プロジェクトごとに独立したドライバー管理が可能
- 環境差異による問題を軽減
方法4: ブラウザプロファイル設定を含む高度な使用法
Firefoxでプロファイル設定が必要な場合の例:
from selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService
# Firefoxプロファイル設定
firefox_profile = webdriver.FirefoxProfile()
firefox_profile.set_preference("browser.download.folderList", 2)
firefox_profile.set_preference("browser.download.manager.showWhenStarting", False)
# Service設定
service = FirefoxService()
driver = webdriver.Firefox(service=service, options=firefox_options)
変更の背景とベストプラクティス
この変更はSelenium APIの設計を改善するために実施されました:
- サービスのカプセル化: WebDriver初期化から実行パス設定を分離
- 拡張性の向上: Serviceクラスによりポート設定やログ管理等を一元化
- 自動化: Selenium Managerによるドライバー自動管理
バージョン互換性
異なる環境間ではSeleniumのバージョン食い違いによる問題が発生する可能性があります。プロジェクトごとにrequirements.txt
でバージョンを固定すると良いでしょう:
selenium==4.15.1 # 2024年1月時点の安定バージョン
webdriver-manager==4.0.1
まとめ
アプローチ | 使用ケース | メリット |
---|---|---|
Serviceオブジェクト | カスタムパス指定が必要 | 公式推奨・設定柔軟 |
Selenium Manager | 迅速なセットアップ | 設定不要・自動管理 |
webdriver-manager | 複数プロジェクト・チーム開発 | バージョン管理容易 |
最新のSelenium開発においては、Service
オブジェクトの使用を推奨します。これはAPI変更に対する将来の互換性を確保しつつ、WebDriverの設定を柔軟に管理できる堅牢なソリューションです。