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

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

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

```rb: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](https://github.com/flavorjones/chromedriver-helper/issues/83)

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

[titusfortner/webdrivers: Keep your Selenium WebDrivers updated automatically](https://github.com/titusfortner/webdrivers)

ちなみに、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の記述を書き換えます。

```diff: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](https://github.com/titusfortner/webdrivers/issues/29)

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

`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に移行する際の参考になれば幸いです。