Pythonファイルからのスクレイピング時、Seleniumが利用するChromeDriverと、Chromeアプリケーションとのバージョンが異なり「セッションを作成できない」とのエラー表示が出ました。ChromeDriver側のアップデートを行い、アップデートしたChromeDriverへとバージョンを切り替えることでエラーが解決。方法を記載します。
なお、自動的にChromeDriverのバージョンをブラウザのものと合わせてくれるライブラリがあるようです。 webdriver_managerで自動的にSeleniumとChromeバージョンを一致させる の記事をご参照ください。
目次:
- Seleniumが利用するChromeDriverと、Chromeアプリケーションとのバージョンが異なりセッションを作成できないエラー
- Chromeブラウザに合ったChromeDriverをインストール
- 実行pythonファイル内でchromedriver_binaryをインポート
- chromedriver-binary-autoでパス指定も含めてインストール実行してくれる?(誤情報にご注意)
- ChromeDriverManager(webdriver_manager)で自動的にバージョンを一致させる【推奨】
- (参考) 手動でChromeDriverバージョンを指定してインストールする場合: chromedriver-pyの場合
Seleniumが利用するChromeDriverと、Chromeアプリケーションとのバージョンが異なりセッションを作成できないエラー
ローカルでSeleniumを利用したPythonファイルを実行しようとしたところ、下記エラーが発生。
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 99 Current browser version is 101.0.4951.54 with binary path /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
Seleniumが利用するChromedriverがサポートしているバージョンが99のみで、現在の実Chromeのバージョンが101。
現行のChrome安定版では最新版でした。
ChromedriverとChromeとでバージョンの互換性が合わず、Seleniumがセッションを作成できないというエラーのようです。
Chromeブラウザに合ったChromeDriverをインストール
ChromeDriverと、インストールされているChromeとのバージョンを合わせます。
私の場合はエラーメッセージのとおり、ChromeDriver側のサポートバージョンが古かったので、ChromeDriverのほうをアップデートします。
私のインストール済Chromeのバージョンは101で最新版でしたので、最新版のChromeDriverをインストールすれば良さそう。
ChromeDriverには -pyや -binaryなどがありますが、Sleleniumなどのテスト自動化ツールから利用したい場合にはchromedriver-binaryのものを利用する必要があるようです。
chromedriver-binary · PyPI にしたがって、下記コマンドで「最新版の」chromedriver-binaryをpipでインストール。
$ pip install chromedriver-binary
下記メッセージが表示されれば成功。
仮想環境などで実行している場合には、再度activateさせる必要があります。
Downloading chromedriver-binary-102.0.5005.27.0.tar.gz (4.9 kB)
Preparing metadata (setup.py) ... done
Using legacy 'setup.py install' for chromedriver-binary, since package 'wheel' is not installed.
Installing collected packages: chromedriver-binary
Running setup.py install for chromedriver-binary ... done
Successfully installed chromedriver-binary-102.0.5005.27.0
ただし、上記メッセージ内にもあるとおり、「wheelパッケージが未インストールのため、古いバージョンのsetup.pyを利用しています。とあります。
wheelパッケージをインストールして、その後色々と試してみたのですが、結局古いバージョンへの指定が変えられず。
参考: python - Could not build wheels since package wheel is not installed - Stack Overflow
そこで下記の方法で、インストールしたchromedriver-binaryを明示的にファイルにインポートします。
実行pythonファイル内でchromedriver_binaryをインポート
下記の例のように、seleniumからwebdriverをインポートした後にchromedriver_binaryをインポートします。
import chromedriver_binary の一文を追加。
この記述によって、chromedeiver binaryへのパスが設定されるとのこと。
from selenium import webdriver
import chromedriver_binary # Adds chromedriver binary to path
driver = webdriver.Chrome()
driver.get("http://www.python.org")
assert "Python" in driver.title
これで完了です!
問題なく、インストールしたchromedriver-binaryのバージョンのものでSeleniumが実行されるようになりました。
chromedriver-binary-autoでパス指定も含めてインストール実行してくれる?(誤情報にご注意)
下記の記事内と掲載されているツイートで、パス指定も含めてインストール実行してくれるとの記述がありましたが、私の場合はパス指定が自動化されることはありませんでした。
pip install時に「pip install chromedriver-binary-auto」とするだけでこれらのエラーをパス指定無しで解決できるとのこと。
公式Docsによると、-autoの意味は、”Automatically detected versions” とのことです。「利用しているChromeブラウザと整合するバージョンのChromeDriverを自動検知してインストールする」ということで、パス指定が自動化されるわけではないと思われます。
公式: chromedriver-binary-auto · PyPI
既出の $ pip install chromedriver-binary では最新版がインストールされてしまうので、Chromeアプリのバージョンが最新版でない場合などに有用。
「解決した!」と言っている方々は単純にブラウザChromeバージョンが最新版でなかっただけなのでは…?
公式に「パスを環境変数にエクスポートする方法」が挙げられていたので、こちらの方がまだ可能性がありそうです。(自分はこちらでも上手く通らず)
Exporting chromedriver binary path
This package installs a small shell script chromedriver-path to easily set and export the PATH variable:
$ export PATH=$PATH:chromedriver-path
chromedriver-binary-auto · PyPI
参考: ChromeDriver 利用中のChromeのバージョンに合わせ変更する - Lowaivill Tech Blog
ChromeDriverManager(webdriver_manager)で自動的にバージョンを一致させる【推奨】
なんと自動的にバージョンを揃えてくれる、ChromeDriverManager(webdriver_manager)というライブラリがあるとのこと…!
具体的には、プログラム実行時に現在のGoogle Chromeのバージョンを確認し、自動で適切なChrome Driverを当てたうえで実行するようになるよう。
一度webdriver_managerを導入してしまえば、その後はプログラムを立ち上げるたびに自動的にChromeバージョンを確認し、適切なChrome Driverを割り当ててくれるようになるため、大変便利です。
詳細は webdriver_managerで自動的にSeleniumとChromeバージョンを一致させる の記事からご確認ください。インストール方法とエラー解消方法を合わせてご紹介しています。
ライブラリは他にもwebdrivermanagerやwebdriver-managerなど類似のライブラリがあるようなのですが、webdriver_managerがライブラリの充実さからよく使われていそうです。
(参考) 手動でChromeDriverバージョンを指定してインストールする場合: chromedriver-pyの場合
以下はchromedriver-binaryではなく、chromedriver-pyの場合です。ご注意ください。
ChromeDriverのリストは下記のChromeDriver公式ページから。
ChromeDriver - WebDriver for Chrome - Downloads
pipコマンドを利用してアップデート・アップグレードさせることができます。
ただし試したのはchromedriver-pyの方のみ。chromedriver-binaryでも同様にインストールできるかは未検証。
== で指定するバージョンは各自がインストールしているChromeブラウザのバージョンにより異なるので、Chrome > Help > About Google Chrome から確認してください。
$ pip install chromedriver-py==101.0.4951.41
下記メッセージが表示されればインストールは成功です。
Downloading chromedriver_py-101.0.4951.41-py3-none-any.whl (28.4 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 28.4/28.4 MB 53.5 MB/s eta 0:00:00
Installing collected packages: chromedriver-py
Successfully installed chromedriver-py-101.0.4951.41
参考: 【Python/Selenium】ChromeDriverバージョンエラー対処法 - ゆうきのせかい
この記事の気になった箇所を読み返す:
- Seleniumが利用するChromeDriverと、Chromeアプリケーションとのバージョンが異なりセッションを作成できないエラー
- Chromeブラウザに合ったChromeDriverをインストール
- 実行pythonファイル内でchromedriver_binaryをインポート
- chromedriver-binary-autoでパス指定も含めてインストール実行してくれる?(誤情報にご注意)
- ChromeDriverManager(webdriver_manager)で自動的にバージョンを一致させる【推奨】
- (参考) 手動でChromeDriverバージョンを指定してインストールする場合: chromedriver-pyの場合
category: 開発・プログラミング | エンジニアリング