Skip to content

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での注意点

  1. 必ず!pip installchromedriver-autoinstallerをインストールしてください
  2. /usr/lib/chromium-browser/chromedriverのPATH設定が必要です
  3. 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)

ベストプラクティス

  1. 明示的なServiceオブジェクトを使用するとコードの意図が明確になります
  2. options引数はキーワード引数方式で指定する
  3. リソースリーク防止のため、使用後は必ずdriver.quit()を呼び出す

まとめ

Seleniumで発生する「引数'options'に複数の値が指定された」エラーは、主にSelenium 4.10.0以降のAPI変更が原因です。修正方法は以下のいずれかを選択します:

  1. 標準環境Serviceオブジェクトを使用してドライバーのパスを指定
  2. Google Colabchromedriver-autoinstallerを使用して自動設定
  3. 旧バージョン互換:Seleniumのバージョンをチェックして処理を分岐

正しいAPIの使用方法で、Seleniumを最新版でも円滑に利用できます。