【Ruby/Selenium】v115からChromeDriverの配布元が変わったようなので対応した話
こんにちは、しきゆらです。
数年ごとに時たま書いているSeleniumネタ、 今回は久々に大きく動かなくなったので調べつつ対応した記録を残しておきます。
追記: 2023/08/16
確認したところwebdrivers
に更新が入っており、v5.3.1から対応されているようです。webdrivers
を利用している方は、Gemの更新をしてみてください。
webdriversが動かなくなった
これまではwebdrivers
というgemを使い、インストールされているChromeのバージョンにあったChromeDriver良しなに取得するようにしていました。
さっくりwebdrivers
の中身を見てみましたが、インストールしているChromeのバージョンを確認し、必要なDriverがなければ以下のサイトから該当バージョンのものを取得・配置するようです。
「https://chromedriver.storage.googleapis.com/LATEST_RELEASE_114」のようにChromeのバージョン値を指定するとその最新版となるChromeDriverのバージョンを取得できるので、これをもとに取得する感じでした。
ところが、先日Seleniumを動かしたらChromeDriverがない、とエラーが出て動かなくなっていました。 何事かと思って調べてみました。
ChromeDriverの配布元が変わった
ChromeDriverのサイトを見てみると、配布場所が変更されたようです。
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は自動更新なので開発者はテストをするタイミングによって意図しないバージョンになっていたりしてつらい、そうだテスト用に自動更新がないChromeを作ろう、ということのようです。
ということでテスト用Chromeとそのバージョン向けのChromeDriverが以下のサイトで一緒に配布されるようになっていました。
自前でChromeDriverを取得するスクリプトを組んでいる場合は、この辺の対応が必要になりそう。
対応方法 (一部追記あり)
こちら、webdrivers
のGemにあったPRは2023/08/01にマージされていました。
v5.3.1から対応が入っているようです。
暫定対応
。webdrivers
でも対応するPRが上がってますが、記載時点(2023/07/29)ではまだマージされてません
こちらのissueで対応方法が記載されていました。
現在はv114向けのChromeDriverでも動くようなので、コード内でChromeDriverのバージョンを決め打ちすることでその場しのぎをすることができます。 ただ、これもこのバージョンで動作しなくなるのは時間の問題なのでいつまで使えるかは不明です。
Webdrivers::Chromedriver.required_version = "114.0.5735.90"
Selenium Manager
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を使うことで無事動くようになりました。
今回は、ここまで。
おわり
Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)