【Selenium】ChromeDriverを自動更新するPythonライブラリが便利
![Python[パイソン]](https://yuki.world/wp-content/uploads/2020/01/python-eyecatch.png)
Python × Seleniumでブラウザ操作自動化をしてるけど、ブラウザバージョン更新のたびにWebDriverも手動で更新するのが面倒すぎる!
ChromeDriverやGeckoDriverを自動更新する方法はないものか...?
そんな悩みを抱えているかたへ。
たとえばGoogle Chromeだと...
Pythonfrom selenium import webdriver
import chromedriver_binary
driver = webdriver.Chrome()
driver.get('https://google.com')
しばらくこれで動いても、数週間も経てばGoogle Chromeが自動的にアップデートされChromeDriverとのバージョンが合わなくなり、結果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
この例外対処のために、
- 現在のブラウザバージョンを確認する
- ブラウザバージョンに適合したWebDriverをダウンロード/インストールする
というチマチマ手作業が面倒くさすぎるんだよなぁ...と思っていたら、やっぱり世界のどこかの誰かがすでに解決してくれていました。
結論、webdriver_managerというライブラリを使えば面倒な手作業から永遠に開放されます。
既に動いているプログラムがあっても、コードをほんの少し書き換えるだけで簡単なので一度試してみてください。
公式GitHub:SergeyPirogov/webdriver_manager
ー もくじ ー
ChromeDriverなどWebDriverを自動更新するwebdriver_manager
タイトルでは"ChromeDriverを自動更新"と書きましたが、webdriver_managerは以下5つのブラウザをサポートしています。
ブラウザ / 対応するWebドライバー
- Google Chrome / ChromeDriver
- Firefox / GeckoDriver
- Internet Explorer / IEDriver
- Microsoft Edge / MicrosoftWebDriver(EdgeChromiumDriver)
- Opera / OperaDriver
以下、それぞれのWebドライバーを自動更新するための手順です。
まず、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引数を放り込むだけです。
Python(ヘッドレスモードで実行)from 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の手動更新にわずらわしさを感じたことがあれば、ぜひ利用してみてください。