【Python】webdriver_managerがエラーを起こすようになったので修正した

まずwebdriver_managerとは

Python+Seleniumを使うなら必須で入れておきたいライブラリでChromeDriverのバージョンを勝手に上げてくれる便利なやつ

これがないとSelenium特有のバージョン不一エラーが不定期に訪れてイラっと来る日もしばしば

使い方は立ち上げの”executable_path”部分を”ChromeDriverManager().install()”にするだけの簡単仕様

すごーく簡単な使い方サンプルはコチラ

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://javeo.jp/')
'''
メイン処理
'''
driver.close()
driver.quit()

ある日急に実行メッセージがおかしくなった

論より証拠と言うことでVSCodeで実行した時にこうなりました


※需要は無いかもだけどコピペ用↓

====== WebDriver manager ======
Could not get version for google-chrome with the command: powershell “$ErrorActionPreference=’silentlycontinue’ ; (Get-Item -Path “$env:PROGRAMFILES\Google\Chrome\Application\chrome.exe”).VersionInfo.FileVersion ; if (-not $? -or
$? -match $error) { (Get-Item -Path “$env:PROGRAMFILES(x86)\Google\Chrome\Application\chrome.exe”).VersionInfo.FileVersion } if (-not $? -or $? -match $error) { (Get-Item -Path “$env:LOCALAPPDATA\Google\Chrome\Application\chrome.exe”).VersionInfo.FileVersion } if (-not $? -or $? -match $error) { reg query “HKCU\SOFTWARE\Google\Chrome\BLBeacon” /v version } if (-not $? -or $? -match $error) { reg query “HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome” /v version }”
Current google-chrome version is UNKNOWN
Get LATEST chromedriver version for UNKNOWN google-chrome
Trying to download new driver from https://chromedriver.storage.googleapis.com/99.0.4844.51/chromedriver_win32.zip
Driver has been saved in cache [C:\Users\thosh.wdm\drivers\chromedriver\win32\99.0.4844.51]


明らかにいつもと違うメッセージが出ていたので英語は苦手だがなんとか解読してみる

どうもpowershellでChromeのバージョンを取得しようとしたのにUNKNOWNになって取得できませんと

結果、適切なchromedriverがわからないのでとりあえず最新版を取得するようになっているっぽい

これだといつか不一致起こすんじゃないかと修正を試みた次第です

powershell実行箇所を突き止めて修正

まずはエラーも何も実行ソース調べる必要があるので探ってみる

VSCodeを使ってるとctr押しながらクリックすることで対象モジュールに飛ぶことができるので

「ChromeDriverManager → utils」に飛ぶ ※なぜutilsとわかったかはここでは割愛

で、問題のソース

    cmd = cmd_mapping[browser_type][os_name()]
    version = read_version_from_cmd(cmd, pattern)

    if not version:
        log(f'Could not get version for {browser_type} with the command: {cmd}')

    current_version = version.group(0) if version else 'UNKNOWN'

    log(f"Current {browser_type} version is {current_version}")

    return current_version

確かにUNKNOWNを出力する箇所がある

ここからさらに遡って調べていくとどうやらpowershellを実行するコマンドがまずいらしい(日頃powershell使わないからここに辿り着くの滅茶苦茶大変だった、、、)

結論からに言うと修正箇所は2箇所

    powershell = determine_powershell()
    return (
        f" {powershell} \"$ErrorActionPreference='silentlycontinue' ; "
        + f'{apps[0]}{ignore_errors_cmd_part} ;'
        + ''.join(f" if (-not $? -or $? -match $error) {{ {i}{ignore_errors_cmd_part} }}" for i in apps[1:])
        + '"'
    )
    return (
        f"$ErrorActionPreference='silentlycontinue' ; "
        + f'{apps[0]}{ignore_errors_cmd_part} ;'
        + ''.join(f" if (-not $? -or $? -match $error) {{ {i}{ignore_errors_cmd_part} }}" for i in apps[1:])
        + ''
    )

    cmd = cmd_mapping[browser_type][os_name()]
    version = read_version_from_cmd(cmd, pattern)
    powershell = determine_powershell()
    cmd = [f'{powershell}', f'{cmd_mapping[browser_type][os_name()]}']
    version = read_version_from_cmd(cmd, pattern)

つまりコマンド実行する時に1文にするんじゃなくてpowershellコマンドと引数部分に分けて実行しなさいと

言われてみればそりゃそうだって気がしながら今回は解決

あとがき

修正したはいいけど急にエラーになった原因はわからず。。。

何せつい最近まではエラーにならず正常に使えてたわけでコマンド自体が絶対にダメってわけじゃないと思うわけで

(powershell詳しくないのでこの辺りは想像です)

考えられる根本原因の選択肢として

  • webdriver_managerが誤アップデートしたものをインストールした
  • 私のpowershell環境が変わった
  • 私のPC環境が変わった

ぐらいかな、、、

Pythonでモジュールのアップデートした記憶もないしWindowsアップデートした影響とも思えないし真実は闇の中

コメント

タイトルとURLをコピーしました