[Rails5] CentOS7上のRailsのTest中にSelenium,ChromeDriver関連のエラーが出る場合の対処！

# 概要

[こちら](https://railstutorial.jp/chapters/static_pages?version=5.1#sec-guard)に記載されているようなGuard処理というものがあります。

テストの自動化が出来、非常に便利な機能のようですが、

```
bundle exec rails g scaffold User name:string email:string
```

のようなコマンドを実行してサンプルプログラムを作成してから、
[本記事](https://railstutorial.jp/chapters/static_pages?version=5.1#sec-guard)の通りにGuardの設定後、

```
bundle exec guard
```

というコマンドからGuard処理を実行してみると。。。。

**だいたいの人がテスト実行中にSeleniumWebDriverのエラーが出るのではないでしょうか？**

今回はそういったRails上でWebDriverを何とかする対処方法を記載していきます。

# 著者の環境

* CentOS7.6
  * Railsアプリが入っているサーバー
  * VirtualBox上にインストール
* Windows10
  * 普段使ってるPC
  * CentOS7にRemote接続を行う為のOS

* RailsのgemパッケージのVersion一部抜粋
  * Ruby (2.5.5)
  * rails (5.2.3)
  * selenium-webdriver (3.141.0)
  * chromedriver-helper (2.1.1)
  * capybara (3.16.0)

基本的には[この記事](https://qiita.com/takmt/items/0858dbd3c53cabaa4395)の環境で発生した問題の解決方法になりますが、意外と同様の問題で困っている方が多かったので記事にしました。

# 発生する問題の概要

主に発生する問題は下記2点です。

**① ChromeDriverに接続できない。**

```
Selenium::WebDriver::Error::WebDriverError:
Selenium::WebDriver::Error::WebDriverError: 
unable to connect to chromedriver 127.0.0.1:9515
test/system/users_test.rb:26:in `block in <class:UsersTest>'
```

**② ChromeDriverが起動できない。**

```
Selenium::WebDriver::Error::UnknownError:
Selenium::WebDriver::Error::UnknownError: 
unknown error: Chrome failed to start: exited abnormally
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
```

いずれもGoogleChromeとSeleniumWebDriverの問題となっています。

# そもそもSeleniumWebDriverって？

**SeleniumWebDriverはブラウザの動作を自動化するツールです。**
作成した自サイトの動作確認を自動化する為に主に用いられます。
やろうと思えばGoogleホームページから検索フォームに特定の文字を入れて検索ボタンを押下するなども含めて自動化する事も可能です。

そしてSeleniumWebDriverはブラウザの動作自動化の為、
当然何かしらのブラウザがインストールされている必要があります。
SeleniumWebDriver自身、あらゆるブラウザに対応しているのですが、
RailsではChromeが動作するようデフォルトでテストコードやGemfileに設定されていましたので、
次の項目ではChromeを使用して上記2つの問題点を解決する方法を記載します。
※主にCentOS7上の操作となります。

# ①の問題解決方法

私の環境上で①の問題が発生していた原因は、
主にGoogleChromeがインストールされていない為に発生していました。
ですので、CentOS7上にGoogleChromeをインストールします。

#### GoogleChromeのインストール

これはどのサイトを見てもテンプレのようなコマンドを打ち込んでいます。
慣例に倣って同様の手順でChromeをインストールしていきましょう。


CentOSに一般ユーザーでログイン後、

```
sudo vim /etc/yum.repos.d/google-chrome.repo
```

上記ファイル内で

```
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

をコピペし保存します。
その後、

```
sudo yum -y update
sudo yum -y install google-chrome-stable
sudo yum -y install libX11 GConf2 fontconfig libOSMesa google-noto-cjk-fonts
```

を行いChromeとChromeの動作に必要なパッケージのインストールを行います。

上記が終わったあと下記コマンドでVersion情報が出ればChromeのインストールは完了です。

```
google-chrome --version
```

これで動作すれば①の問題は解決できたかと思います。
しかし

```
bundle exec guard
```

としても、次のエラーが出ている事でしょう。

# ②の問題解決方法

一般的にChromeを動かすためにはGUI環境が必要となるようです。

あくまで主観ですが、CentOS系はサーバー機能として使用されている方が多いと思われるため、GUI機能をインストールしていない・サーバー機能として使っているためインストールしたくないという方が多いのではないでしょうか。

そのGUI環境がない状況でChromeを動かそうとすると、
②のエラーが出るようですので、
今回は 非GUI環境でも動作する `headless` , `disable-gpu` を指定してChromeDriverが起動するようにRailsのテストコードを修正していきましょう。

基本的に test/system配下のRubyファイルは下記クラスを継承しており、継承先からChromeの自動化処理を行うという事になります。

```rb:test/application_system_test_case.rb
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
end
```

現在の設定だとただ単にChromeを開こうとしているだけですので、
上記コードを

```rb:test/application_system_test_case.rb
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
    chromeOptions: {
      args: %w( headless disable-gpu window-size=1280x800)
    }
  )

  driven_by :selenium, using: :chrome,options: { desired_capabilities: capabilities } 
end
```

という形に変更する事で、
GUI環境がインストールされていないCentOS上でも、
問題なくテストコードが実行できます。


# ここまで読んでいただきありがとうございます。
もし何かしら間違いや誤りなどありましたらご指摘お願いします。
またコメントやこうしたら良いよみたいなアドバイスがあればコメントいただけると嬉しいです。

# 参考サイト

* https://www.karelie.net/how-to-install-google-chrome-on-centos7/
* https://qiita.com/tetsuyainfra/items/b504510ea9110765e07c