2023-07-31に更新

【Ruby/Selenium】v115からChromeDriverの配布元が変わったようなので対応した話

こんにちは、しきゆらです。
数年ごとに時たま書いているSeleniumネタ、 今回は久々に大きく動かなくなったので調べつつ対応した記録を残しておきます。

webdriversが動かなくなった

これまでは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のサイトを見てみると、配布先が変更されたようです。

ChromeDriver - WebDriver for Chrome - Downloads

Latest ChromeDriver Binaries

ということで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)ではまだマージされてません。

Fixed Webdrivers::VersionError with chrome version greater than 115 by sadahiro-ono · Pull Request #249 · titusfortner/webdrivers

こちらの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"

Selenium Manager

issueを見ていくと、Selenium Managerなるものが出てきました。

Selenium Manager (Beta)

まだ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を使うことで無事動くようになりました。

今回は、ここまで。

おわり

Originally published at shikiyura.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

しきゆら

勉強したり手を動かした記録を「しきゆらの備忘録」(http://shikiyura.com)へ投稿している人。 Ruby/JavaScriptをよく書いている。いろんな言語に触れてみたい。新しい物・辛いもの好き。バグは愛すべきもの。一応社会人。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント