Python Selenium – SessionNotCreatedException

python

SessionNotCreatedException 対処方法

■ 主の PC環境一覧

OS:Windows11
CPU:Intel® Core™ i9 13900KF
Memory:64GB

Python:3.9.4
pip:20.3.4
Chrome

■ 初めに

Seleniumを使用したスクレイピングもしくはクローリングで、以下のようなエラーが発生した場合に webdriverのアップデートを行い対応していませんか?

$ python main.py


---
# エラーログ
Traceback (most recent call last):
File "/workspace/main.py", line 4, in <module>
driver = webdriver.Chrome()
--- 省略 ---
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 83

■ 原因

恐らく、実行時に上記のようなエラーログが出力されている方は、以下に示すような実装になっていると思います。

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

本エラーは、指定するブラウザ(ここでは Chrome)のバージョンがアップデートされた際に引き起こされるエラーとなります。
厳密にいうと、Chromeのバージョンと webdriverのバージョンで整合性が取れない場合に発生します。

具体的に?

スクレイピングやクローリングを行うには webdriverパッケージを使用します。
それに伴い、ブラウザを操作と webdriverは依存関係にあると言えます。

故に、ブラウザのバージョンが更新されると、必然的に webdriverのバージョンも更新されるわけです。

しかし、開発時点でインストールされた webdriverは、Chromeのバージョンが更新されても自動的に更新されません。
そのため、Chromeのバージョン更新に伴い、手動的に webdriverを更新してあげないと整合性が取れず、この度のエラーが発生します。


■ 解決

前述までの説明を理解していただけたら、ブラウザのバージョンが更新されるごとに、毎回、webdriverを更新してあげればよいと考える方がほとんどだと思います。

そのようなことをしなくても、便利な方法があります。

□ ChromeDriverManager

ChromeDriverManagerwebdriberと同じく Pythonのパッケージです。
では、前述の方法(webdriverの手動更新)と変わって何が便利なのかを簡単に説明いたします。

ChromeDriverManagerとは?

Seleniumを使う場合、ブラウザ(Chromeや Edgeなど)のドライバが必要ですが、ChromeDriverManagerは実行時に、毎回、適切なドライバを自動的にダウンロードやインストール、管理を行ってくれる優れものです。

webdriverは、事前に用意したブラウザのドライバを処理の中で読み込んで実行しているので、用意したブラウザのバージョン依存した処理となります。

故に、ChromeDriverManagerは実行時に都度都度その時の最新バージョンを取得し処理が実行されるので、ブラウザのバージョン更新に依存しない能動的は処理を実現することができます。

[1]webdriver-managerパッケージをインストール

ChromeDriverManagerwebdriver-managerの中に内包されています。

$ pip install webdriver-manager

[2]実装修正

以下に示すように、「before」だった処理を「after」の処理に置き換えてください。

before
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.get('https://google.com')
after
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
 
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://google.com')

[3]実行確認

実行後、Chromeのバージョンと webdriverのバージョンが一致していることを確認できます。

# 実行
$ python main.py


---
====== WebDriver manager ======
Current google-chrome version is 98.0.4758
Get LATEST chromedriver version for 98.0.4758 google-chrome
Trying to download new driver from https://chromedriver.storage.googleapis.com/98.0.4758.102/chromedriver_mac64.zip
Driver has been saved in cache [/Users/username/.wdm/drivers/chromedriver/mac64/98.0.4758.102]
/workspace/main.py:28: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(ChromeDriverManager().install())

□ 最後に

スクレイピングやクローリングは作業の自動化において代表的な手段の 1つです。

開発したツールをユーザーに配布して使用していただく際、ブラウザの更新がある度に不具合改修として対応していませんでしたか?
本記事で説明した対応を行えば保守やメンテナンスなども容易になりますので、是非、この機会に導入してみてはいかがでしょうか。

はい、「開発したツールをユーザーへ配布」というワードが出てきたので、ここで宣伝をねじ込みたいと思います。

玄人級の方は既にご存知だとは思いますが、初学者の方は必見です。
これまで開発した Pythonスクリプトをユーザーへ配布する際、スクリプトファイル一式を譲渡していませんでしたか?

ユーザーが使用する PC(OS)に応じて、Pythonスクリプトを実行ファイルに変換することができます。

□ 他にも Pythonを使用した開発で便利な記事一覧

comment 📝

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