※この記事は、個人技術ブログ CodeArchPedia.com の技術メモ(要約)です。
Seleniumを使った自動テスト環境で、突然 TypeError: WebDriver.__init__() got an unexpected keyword argument 'executable_path' が出てきて、環境構築が止まってしまった。いつも通りにChromeDriverをパス指定で初期化しようとしたら発生したので、なぜエラーが出たのか調査した。
何が起きたか(課題)
遭遇したエラーは、Selenium 4.0以降へのバージョンアップが主な原因だった。具体的には以下の問題が発生していた。
- Selenium 3.x世代の古い初期化構文(
executable_path引数)が4.xで廃止された。 - エラーメッセージが示す通り、
webdriver.Chrome()のコンストラクタが予期しない引数を受け取ってしまった。 - これにより、既存のテストコードが動作しなくなり、プロジェクトの進行がストップした。
どう解決したか(概要)
このTypeErrorを解消し、Selenium 4に対応させるアプローチは主に2つあった。古いコードでは以下のように直接パスを指定していた。
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
推奨される解決策は、Service オブジェクトを経由してドライバーを初期化する方法だ。selenium.webdriver.chrome.service.Service をインポートし、そのインスタンスをWebDriverのコンストラクタに service= 引数として渡す必要がある。
あるいは、パス管理の手間を完全に無くすため、webdriver-manager を導入し、ChromeDriverManager().install() を使って適切なドライバーパスを自動解決する方法を採用した。これにより、環境差異に起因する問題を予防できる。
また、オプション引数も chrome_options から単なる options に変更されていたため、併せて修正が必要だった。
効果(Before/After)
手動でのパス指定や古いAPI呼び出しを廃止した結果、コードがW3C WebDriver仕様に準拠し、今後のバージョンアップに対する耐性が向上した。
| 項目 | 旧式 (Selenium 3.x) | 現行 (Selenium 4+) |
|---|---|---|
| パス指定 | executable_path=PATH |
service=Service(PATH) または webdriver-manager
|
| オプション指定 | chrome_options=OPTIONS |
options=OPTIONS |
これにより、実行環境が変わってもドライバーのパスについて悩む必要がなくなり、テストコードの可搬性が高まった。
🚀 詳細な設定とコードはこちら
具体的なWAFのルール設定や、より詳細なログ解析データは元のブログで公開しています。