Seleniumで引数'options'に複数の値が指定されたときの修正
問題
PythonでSeleniumを使用する際、以下のエラーが発生する場合があります:
python
TypeError: WebDriver.__init__() got multiple values for argument 'options'
このエラーは、以下のようなコードを実行したときに発生します:
python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
browser = webdriver.Chrome(r'/usr/bin/chromedriver', options=chrome_options)
原因
Selenium 4.10.0での変更点
このエラーの主な原因は、Selenium 4.10.0以降のバージョンでWebDriver
コンストラクタの引数順序が変更されたことです:
重要な変更点
- 従来の第一引数
executable_path
が削除されました - 代わりに第一引数が
options
になりました - パスを指定するには
service
引数を使用する必要があります
エラーの発生メカニズム
問題のコードでは:
python
browser = webdriver.Chrome(r'/usr/bin/chromedriver', options=chrome_options)
- 第一引数として
/usr/bin/chromedriver
(パス文字列)を渡しています - キーワード引数で
options=chrome_options
も指定しています - Selenium 4.10.0+では第一引数が
options
と解釈されるため、options
が二重に指定されたと判断されます
解決方法
標準的な解決策(推奨)
service
引数を使用してパスを指定し、options
はオプション専用に使用します:
python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# Serviceオブジェクトを使用したパス指定
service = Service(executable_path=r'/usr/bin/chromedriver')
# Chromeオプションの設定
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
# serviceとoptionsを明示的に指定
driver = webdriver.Chrome(service=service, options=options)
# 使い終わったら必ず終了
driver.quit()
Google Colabを使用している場合
Google Colab環境では、chromedriver-autoinstaller
モジュールを使用すると自動セットアップが可能です:
python
!pip install chromedriver-autoinstaller # Colab専用プレフィックス
import sys
sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')
import chromedriver_autoinstaller
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Chromeオプション設定
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# 自動でchromedriverをインストール・設定
chromedriver_autoinstaller.install()
# driver作成
driver = webdriver.Chrome(options=chrome_options)
Google Colabでの注意点
- 必ず
!pip install
でchromedriver-autoinstaller
をインストールしてください /usr/lib/chromium-browser/chromedriver
のPATH設定が必要ですexecutable_path
の明示的な指定は不要になります
旧バージョンとの互換性
コードの互換性を維持したい場合は、以下の方法でバージョンチェックを行うことをお勧めします:
python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import selenium
options = Options()
# ...オプション設定...
if selenium.__version__ >= '4.10.0':
service = Service(executable_path='/path/to/chromedriver')
driver = webdriver.Chrome(service=service, options=options)
else:
driver = webdriver.Chrome('/path/to/chromedriver', options=options)
ベストプラクティス
- 明示的なServiceオブジェクトを使用するとコードの意図が明確になります
options
引数はキーワード引数方式で指定する- リソースリーク防止のため、使用後は必ず
driver.quit()
を呼び出す
まとめ
Seleniumで発生する「引数'options'に複数の値が指定された」エラーは、主にSelenium 4.10.0以降のAPI変更が原因です。修正方法は以下のいずれかを選択します:
- 標準環境:
Service
オブジェクトを使用してドライバーのパスを指定 - Google Colab:
chromedriver-autoinstaller
を使用して自動設定 - 旧バージョン互換:Seleniumのバージョンをチェックして処理を分岐
正しいAPIの使用方法で、Seleniumを最新版でも円滑に利用できます。