こんにちは、しきゆらです。
数年ごとに時たま書いているSeleniumネタ、 今回は久々に大きく動かなくなったので調べつつ対応した記録を残しておきます。
これまではwebdrivers
というgemを使い、インストールされているChromeのバージョンにあったChromeDriver良しなに取得するようにしていました。
GitHub - titusfortner/webdrivers: Keep your Selenium WebDrivers updated automatically
さっくりwebdrivers
の中身を見てみましたが、インストールしているChromeのバージョンを確認し、必要なDriverがなければ以下のサイトから該当バージョンのものを取得・配置するようです。
「https://chromedriver.storage.googleapis.com/LATEST_RELEASE_114」のようにChromeのバージョン値を指定するとその最新版となるChromeDriverのバージョンを取得できるので、これをもとに取得する感じでした。
ところが、先日Seleniumを動かしたらChromeDriverがない、とエラーが出て動かなくなっていました。
何事かと思って調べてみました。
ChromeDriverのサイトを見てみると、配布先が変更されたようです。
ChromeDriver - WebDriver for Chrome - Downloads
Latest ChromeDriver Binaries
- Starting with M115 the latest Chrome + ChromeDriver releases per release channel (Stable, Beta, Dev, Canary) are available at the Chrome for Testing availability dashboard. For automated version downloading one can use the convenient JSON endpoints.
- The older releases can be found at the Downloads page.
ということでwebdrivers
が参照していたサイトとは別のところで配布するようになったようです。
ついでに調べていると、Chrome for Testingなるものが出てきました。
Chrome for Testing: reliable downloads for browser automation - Chrome Developers
以前も何かのタイミングでちらっと見た気がするんですが、あまり詳しく見てはいなかったので今回読んでみました。
どうやら、Chromeは自動更新なので開発者はテストをするタイミングによって意図しないバージョンになっていたりしてつらい、そうだテスト用に自動更新がないChromeを作ろう、ということのようです。
ということでテスト用Chromeとそのバージョン向けのChromeDriverが以下のサイトで一緒に配布されるようになっていました。
Chrome for Testing availability
自前でChromeDriverを取得するスクリプトを組んでいる場合は、この辺の対応が必要になりそう。
webdrivers
でも対応するPRが上がってますが、記載時点(2023/07/29)ではまだマージされてません。
こちらのissueで対応方法が記載されていました。
Webdrivers trying to load a Chrome version that doesn't exist · Issue #247 · titusfortner/webdrivers
現在はv114向けのChromeDriverでも動くようなので、コード内でChromeDriverのバージョンを決め打ちすることでその場しのぎをすることができます。
ただ、これもこのバージョンで動作しなくなるのは時間の問題なのでいつまで使えるかは不明です。
Webdrivers::Chromedriver.required_version = "114.0.5735.90"
issueを見ていくと、Selenium Managerなるものが出てきました。
まだBetaのようですが、Selenium自体に含まれる各WebDriverの取得などをしてくれるツールのようです。
これまでは、手動で配布サイトから取得したり上記webdrivers
のような別ツールでWebDriverを取得して使う必要がありましたが、Selenium Managerを使えば外部ツールを使わずにSeleniumだけで完結するようになりますね。
使い方も、以下の3点を満たしていれば勝手に動いてくれるようです。
Service
クラスでWebDriverのパスを指定していないwebdrivers
のような外部のWebDriver管理ツールを使っていないPATH
の中にWebDriverがないということで、webdrivers
が動かないのでこっちを使ってみることにしました。
ここでは、タイトルの通りRuby環境である前提で記載しますが
selenium-webdriver
のgemを最新にしたうえで、上記3点を満たすように環境を整えるだけで勝手に使えるようになります。
なお、selenium-webdriver
のCHANGELOGを見てみると、4.6.0のころからSelenium Managerへ対応が入っているようです。
手元では、webdrivers
のみしか使っていないのでこれを削除するだけで利用できました。
webdrivers
がない状態でSeleniumを使ってブラウザを立ち上げようとするとターミナル上に以下のように記載されてChromeが立ち上がるようになりました。
2023-07-29 20:53:08 WARN Selenium applicable driver not found; attempting to install with Selenium Manager
Selenium Managerが良しなに動いてくれているようです。
これで、対応はおしまいです。
今回はSeleniumを使っていたらChromeDriverを取得できずに死んでしまったので、原因を調べつつ対応してみました。
結果としては、外部ツールに頼ることなくSeleniumが擁してくれているSelenium Managerを使うことで無事動くようになりました。
今回は、ここまで。
おわり
勉強したり手を動かした記録を「しきゆらの備忘録」(http://shikiyura.com)へ投稿している人。 Ruby/JavaScriptをよく書いている。いろんな言語に触れてみたい。新しい物・辛いもの好き。バグは愛すべきもの。一応社会人。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント