OSError が発生するようになった
webdriver_manager のバージョン 4.0.1、chrome のバージョン 127.0.6533.72 現在で以下のコードが OSError を吐くようになった。
追記:バージョン 4.0.2 で対応されました
chrome_service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=chrome_service, options=options)
OSError: [WinError 193] %1 is not a valid Win32 application
chromedriver のバージョン 127.0.6533.72 には
- chromedriver.exe
- LICENSE.chromedriver
- THIRD_PARTY_NOTICES.chromedriver
の 3 ファイルが含まれており、実行可能ファイルを探す際に LISENCE は無視しているが THIRD_PARTY_NOTICES は無視されない ことにより、chromedriver.exe ではなく THIRD_PARTY_NOTICES.chromedriver が返されてしまうことが原因らしい。
回避策
webdriver_manager のバージョンアップで対応されると思われるが、それまでは下記のように直接 .exe を指定することで回避することにした。
webdriver_path = ChromeDriverManager().install()
if os.path.splitext(webdriver_path)[1] != '.exe':
webdriver_dir_path = os.path.dirname(webdriver_path)
webdriver_path = os.path.join(webdriver_dir_path, 'chromedriver.exe')
chrome_service = Service(executable_path=webdriver_path)
driver = webdriver.Chrome(service=chrome_service, options=options)
2024/08/01 追記
バージョン 4.0.2 が 2024/07/25 にリリースされて修正された。
ただ、修正内容としてはバイナリを取得する際に LICENSE のほかに THIRD_PARTY_NOTICES も対象外とするというものなので今後おなじように何かファイルが追加されれば同じ現象が再発しそう。
直ぐに対応できるように以下の形は残しておくのが良いのかも?
(これはこれで名前が chromedriver から変更されたらエラーになるけれど......)
import os
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
webdriver_path = ChromeDriverManager().install()
expect_binary_name = 'chromedriver'
if os.name == 'nt':
# windows の場合は拡張子 .exe を付ける
expect_binary_name += '.exe'
actual_binary_name = os.path.basename(webdriver_path)
if actual_binary_name != expect_binary_name:
webdriver_dir_path = os.path.dirname(webdriver_path)
webdriver_path = os.path.join(webdriver_dir_path, expect_binary_name)
chrome_service = Service(executable_path=webdriver_path)
driver = webdriver.Chrome(service=chrome_service, options=options)