はじめに
RailsのSystem TestやFeature Spec、System SpecとChromeを組み合わせて動かしたい場合は、ChromeDriverのインストールが別途必要になります。
このインストールを簡便化(勝手にインストール)するために、chromedriver-helperというgemが提供されていました。
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の記述を書き換えます。
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.rb
やtest_helper.rb
などで、webdriversをrequireします。
(訂正)通常のRailsアプリケーションであれば、config/application.rb
でBundler.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にすると、アップデートの実行状況がターミナルに出力されます。
# 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に移行する際の参考になれば幸いです。