Skip to content

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月リリース)で以下のような変更が導入されました:

python
# 旧コード(4.10.0以前)
driver = webdriver.Chrome(executable_path='./chromedriver.exe', options=option)
python
# エラーメッセージ
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クラスを使ってドライバーの実行パスを指定します:

python
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という自動ドライバ管理機能が導入されており、明示的なパス指定が不要になりました:

python
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パッケージが便利です:

bash
pip install webdriver-manager
python
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でプロファイル設定が必要な場合の例:

python
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の設計を改善するために実施されました:

  1. サービスのカプセル化: WebDriver初期化から実行パス設定を分離
  2. 拡張性の向上: Serviceクラスによりポート設定やログ管理等を一元化
  3. 自動化: 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の設定を柔軟に管理できる堅牢なソリューションです。