【Selenium】ChromeDriverを自動更新するPythonライブラリが便利

- Python -
2020.10.05
Python[パイソン]

Python × Seleniumでブラウザ操作自動化をしてるけど、ブラウザバージョン更新があるたびにChromeDriverやGeckoDriver等のWebDriverも手作業でインストールし直すのが面倒くさすぎる...

そんな悩みを抱えていました。たとえばGoogle Chromeだと...

Pythonfrom selenium import webdriver
import chromedriver_binary

driver = webdriver.Chrome()
driver.get('https://google.com')

しばらくはこれで動き続けますが、数週間も経てばGoogle Chromeが自動的にアップデートされてしまい、結果SessionNotCreatedException例外に遭遇し動かなくなってしまいます。

$ python test.py
Traceback (most recent call last):
File "/Users/me/Desktop/test.py", line 5, in <module>
driver = webdriver.Chrome()
File "/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
・・・省略・・・
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 83

この例外対処のために、

  1. 現在のブラウザバージョンを確認する
  2. ブラウザバージョンに適合したWebDriverをダウンロード/インストールする

という地味に面倒なチマチマ手作業が発生。

これがもう面倒くさすぎるのでなんとかしたいんだよなぁ...と思っていたら、やっぱり世界のどこかの誰かがすでに解決してくれていました。

結論、webdriver_managerというライブラリを使えば面倒な手作業から永遠に開放されます

インストール後に既存コードをほんの少し書き換えるだけなので簡単便利。

公式GitHub:SergeyPirogov/webdriver_manager

ChromeDriverなどWebDriverを自動更新するwebdriver_manager

タイトルでは"ChromeDriverを自動更新"と書きましたが、webdriver_managerは以下5つのブラウザをサポートしています。

  1. Google Chrome / ChromeDriver
  2. Firefox / GeckoDriver
  3. Internet Explorer / IEDriver
  4. Microsoft Edge / MicrosoftWebDriver(EdgeChromiumDriver)
  5. Opera / OperaDriver

まず、webdriver_managerをインストール

pip install webdriver_managerでインストールします。

ChromeDriverを自動更新

以下、ブラウザにGoogle Chromeを使う場合です。

Pythonfrom selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://google.com')

これを実行すると、もし現Google ChromeバージョンとChromeDriverがサポートするバージョンが異なる場合は、以下赤字部分にあるように現Chromeバージョンに適合するChromeDriverを自動的にダウンロードしてくれます。

$ python test.py

[WDM] - Current google-chrome version is 85.0.4183
[WDM] - Get LATEST driver version for 85.0.4183
[WDM] - Trying to download new driver from http://chromedriver.storage.googleapis.com/85.0.4183.87/chromedriver_mac64.zip
[WDM] - Driver has been saved in cache [/Users/me/.wdm/drivers/chromedriver/mac64/85.0.4183.87]

$

2度目の実行以降、ブラウザとDriverのバージョンチェックの結果そろっている時にはキャッシュから実行されます。

$ python test.py

[WDM] - Current google-chrome version is 85.0.4183
[WDM] - Get LATEST driver version for 85.0.4183
[WDM] - Driver [/Users/me/.wdm/drivers/chromedriver/mac64/85.0.4183.87/chromedriver] found in cache

$

これでChromeDriverの手動更新作業から開放されます。

ちなみに...
ヘッドレスモードで実行したい時はwebdriver_managerを使おうが使うまいが書き方は変わりません。以下4, 5, 6行目のようにwebdriver.Chrome()options引数を放り込むだけです。

Pythonfrom selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://google.com')

FirefoxのGeckoDriverを自動更新

以下、ブラウザにFirefoxを使う場合です。

Pythonfrom selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager

driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
driver.get('https://google.com')

これを実行すると、もし現FirefoxバージョンとGeckoDriverがサポートするバージョンが異なる場合は、以下赤字部分にあるように現Firefoxバージョンに適合するGeckoDriverを自動的にダウンロードしてくれます。

$ python test.py

[WDM] - There is no [macos] geckodriver for browser in cache
[WDM] - Getting latest mozilla release info for v0.27.0
[WDM] - Trying to download new driver from https://github.com/mozilla/geckodriver/releases/download/v0.27.0/geckodriver-v0.27.0-macos.tar.gz
[WDM] - Driver has been saved in cache [/Users/me/.wdm/drivers/geckodriver/macos/v0.27.0]

$

これでGeckoDriverの手動更新作業から開放されます。

Internet ExplorerのIEDriverを自動更新

以下、ブラウザにInternet Explorerを使う場合。

Pythonfrom selenium import webdriver
from webdriver_manager.microsoft import IEDriverManager

driver = webdriver.Ie(IEDriverManager().install())
driver.get('https://google.com')

EdgeのMicrosoftWebDriver(EdgeChromiumDriver)を自動更新

以下、ブラウザにMicrosoft Edgeを使う場合。

Pythonfrom selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(EdgeChromiumDriverManager().install())
driver.get('https://google.com')

OperaのOperaDriverを自動更新

以下、ブラウザにOperaを使う場合。

Pythonfrom selenium import webdriver
from webdriver_manager.opera import OperaDriverManager

driver = webdriver.Opera(executable_path=OperaDriverManager().install())
driver.get('https://google.com')

まとめ:webdriver_managerのdriver自動更新処理、便利すぎる

複数プログラムを稼働させていて、Google Chromeバージョンアップで全部死ぬという目に何度も合っていましたが、webdriver_managerのおかげで動かなくなる時間も更新の手間もゼロになりました。

また、unknown error: unable to discover open pagesというエラーが以前は散発していましたが、このライブラリ利用を機になくなり安定稼働するようになりました。

WebDriverの手動更新にわずらわしさを感じたことがあれば、ぜひ利用してみてください。

↑TOP