Edited at

サポートが終了したchromedriver-helperからwebdrivers gemに移行する手順


はじめに

RailsのSystem TestやFeature Spec、System SpecとChromeを組み合わせて動かしたい場合は、ChromeDriverのインストールが別途必要になります。

このインストールを簡便化(勝手にインストール)するために、chromedriver-helperというgemが提供されていました。


Gemfile

group :test do

# chromedriver-helperをインストールすると、必要に応じてChromeDriverをインストールしてくれる
gem 'chromedriver-helper'
end

しかし、このgemは2019年3月31日にサポートが終了します。

NOTICE: Ending support for this gem · Issue #83 · flavorjones/chromedriver-helper

chromedriver-helper gemの作者はwebdriversというgemへの移行を推奨しています。

titusfortner/webdrivers: Keep your Selenium WebDrivers updated automatically

ちなみに、chromedriver-helperのインストール完了時にも次のようなメッセージが標示されます。

Post-install message from chromedriver-helper:

+--------------------------------------------------------------------+
| |
| NOTICE: chromedriver-helper is deprecated after 2019-03-31. |
| |
| Please update to use the 'webdrivers' gem instead. |
| See https://github.com/flavorjones/chromedriver-helper/issues/83 |
| |
+--------------------------------------------------------------------+

そこでこの記事ではchromedriver-helperからwebdrivers gemへの移行方法を説明します。


手順


1. Gemfileのchromedriver-helperをwebdriversに切り替える

まずGemfileの記述を書き換えます。


Gemfile

 group :test do

# ...
- gem 'chromedriver-helper'
+ gem 'webdrivers'

Gemfileを書き換えたらbundle installしてください


2. chromedriver-helperに依存しているコードの削除(オプション)

Chromedriver.set_version "2.24"のように、chromedriver-helperに依存したコードがあれば削除します。

(そうしたコードを書いている人はあまりいないと思いますが)


3. webdriversをrequireする → 不要です

rails_helper.rbtest_helper.rbなどで、webdriversをrequireします。

(訂正)通常のRailsアプリケーションであれば、config/application.rbBundler.requireを実行するため、webdriversを明示的にrequireする必要はありません。


4. 動作確認する

テストを実行して問題なく動作することを確認します。

手順は以上です。


備考:ChromeDriverの自動アップデートとパフォーマンス問題

この記事を書いている時点では、webdrivers gemのバージョンは3.7.0です。

chromedriver-helperは初回のみ最新のChromeDriverを自動でインストールし、それ以降は明示的にアップデート用のコマンドを叩いてChromeDriverをアップデートする必要がありました。

一方、webdrivers gemはインストールされているChromeのバージョンとネット上で配布されているChromeDriverのバージョンを比較して、自動的にChromeDriverをアップデートしようとします。

いちおう、適切なバージョンのChromeDriverがインストール済みであればダウンロードはしない、という仕組みにはなっているのですが、この記事を書いている僕の環境ではChromeのバージョンが73.0.3683.86、ChromeDriverのバージョンが73.0.3683.68になっていて、バージョンが完全一致しないせいか、テストを起動するたびに毎回ChromeDriverの再インストールが実行されます。

そのため、chromedriver-helperに比べてテストの実行時間が4秒ほど遅くなってしまいます。

この問題は以下のissueで対応が議論されているため、もしかすると次のバージョンでは状況が改善するかもしれません。

Cache Binaries · Issue #29 · titusfortner/webdrivers


再インストールされているかどうか確認する方法

rails_helper.rbなどでWebdrivers.loggerのログレベルをDEBUGにすると、アップデートの実行状況がターミナルに出力されます。


rails_helper.rb

# rspec-rails(System specやFeature spec)の場合

require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
# ...
# アップデートの実行状況をターミナルに出力する
Webdrivers.logger.level = ::Logger::Severity::DEBUG

以下は実際にテストを実行して出力されたログのサンプルです。

2019-03-26 07:11:37 DEBUG Webdrivers Looking for Site: https://chromedriver.storage.googleapis.com

2019-03-26 07:11:38 DEBUG Webdrivers Get response: #<Net::HTTPOK 200 OK readbody=true>
# ...
2019-03-26 07:11:40 DEBUG Webdrivers Checking current version
2019-03-26 07:11:40 DEBUG Webdrivers File is already downloaded: true
2019-03-26 07:11:40 DEBUG Webdrivers Current version of /Users/jnito/.webdrivers/chromedriver is ChromeDriver 73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72)

2019-03-26 07:11:40 DEBUG Webdrivers Deleting /Users/jnito/.webdrivers/chromedriver
2019-03-26 07:11:40 DEBUG Webdrivers Looking for Site: https://chromedriver.storage.googleapis.com
2019-03-26 07:11:40 DEBUG Webdrivers Get response: #<Net::HTTPOK 200 OK readbody=true>
2019-03-26 07:11:40 DEBUG Webdrivers Found Site: https://chromedriver.storage.googleapis.com
2019-03-26 07:11:41 DEBUG Webdrivers Get response: #<Net::HTTPOK 200 OK readbody=true>
2019-03-26 07:11:41 DEBUG Webdrivers Versions now located on downloads site: [#<Gem::Version "2.0">, #<Gem::Version "2.1">, #<Gem::Version "2.10">, #<Gem::Version "2.11">, #<Gem::Version "2.12">, #<Gem::Version "2.13">, #<Gem::Version "2.14">, #<Gem::Version "2.15">, #<Gem::Version "2.16">, #<Gem::Version "2.17">, #<Gem::Version "2.18">, #<Gem::Version "2.19">, #<Gem::Version "2.2">, #<Gem::Version "2.20">, #<Gem::Version "2.21">, #<Gem::Version "2.22">, #<Gem::Version "2.23">, #<Gem::Version "2.24">, #<Gem::Version "2.25">, #<Gem::Version "2.26">, #<Gem::Version "2.27">, #<Gem::Version "2.28">, #<Gem::Version "2.29">, #<Gem::Version "2.3">, #<Gem::Version "2.30">, #<Gem::Version "2.31">, #<Gem::Version "2.32">, #<Gem::Version "2.33">, #<Gem::Version "2.34">, #<Gem::Version "2.35">, #<Gem::Version "2.36">, #<Gem::Version "2.37">, #<Gem::Version "2.38">, #<Gem::Version "2.39">, #<Gem::Version "2.4">, #<Gem::Version "2.40">, #<Gem::Version "2.41">, #<Gem::Version "2.42">, #<Gem::Version "2.43">, #<Gem::Version "2.44">, #<Gem::Version "2.45">, #<Gem::Version "2.46">, #<Gem::Version "2.5">, #<Gem::Version "2.6">, #<Gem::Version "2.7">, #<Gem::Version "2.8">, #<Gem::Version "2.9">, #<Gem::Version "70.0.3538.16">, #<Gem::Version "70.0.3538.67">, #<Gem::Version "70.0.3538.97">, #<Gem::Version "71.0.3578.137">, #<Gem::Version "71.0.3578.30">, #<Gem::Version "71.0.3578.33">, #<Gem::Version "71.0.3578.80">, #<Gem::Version "72.0.3626.69">, #<Gem::Version "72.0.3626.7">, #<Gem::Version "73.0.3683.20">, #<Gem::Version "73.0.3683.68">, #<Gem::Version "74.0.3729.6">]
2019-03-26 07:11:41 DEBUG Webdrivers Looking for Site: https://chromedriver.storage.googleapis.com
2019-03-26 07:11:42 DEBUG Webdrivers Get response: #<Net::HTTPOK 200 OK readbody=true>
2019-03-26 07:11:42 DEBUG Webdrivers Found Site: https://chromedriver.storage.googleapis.com
2019-03-26 07:11:42 DEBUG Webdrivers Get response: #<Net::HTTPOK 200 OK readbody=true>
2019-03-26 07:11:42 DEBUG Webdrivers Get response: #<Net::HTTPOK 200 OK readbody=true>
2019-03-26 07:11:42 DEBUG Webdrivers Successfully downloaded chromedriver_mac64.zip
2019-03-26 07:11:42 DEBUG Webdrivers Decompressing zip
2019-03-26 07:11:42 DEBUG Webdrivers Decompression Complete
2019-03-26 07:11:42 DEBUG Webdrivers Deleting chromedriver_mac64.zip
2019-03-26 07:11:42 DEBUG Webdrivers Completed download and processing of /Users/jnito/.webdrivers/chromedriver

一番最後にCompleted download and processing of /Users/jnito/.webdrivers/chromedriverというメッセージが表示されていることから、ChromeDriverが実際にインストールされたことがわかります。


まとめ

というわけでこの記事ではchromedriver-helperからwebdrivers gemへの移行方法を説明しました。

みなさんが実際にchromedriver-helperからwebdrivers gemに移行する際の参考になれば幸いです。