はじめに
WSLでUbutu環境を使いchromedriverでRSpecテストをしたらエラーが発生しましたが、無事に解決できたのでその方法をまとめます。
Railsで有名な参考書「現場で使える Ruby on Rails 5速習実践ガイド」をやっていてぶつかったエラーなので、参考になる方が多いのではと思いQiitaで記事にまとめようと思いました。
おそらく、Windows環境で参考書通りにWSLとUbuntuを使っている人だと、ほぼ確実にぶつかるエラーなので参考になれば嬉しいです。
環境とバージョン
- WSL
- Ubuntu 18.04.2 LTS
- Ruby 2.5.1
- Rails 5.2.3
- RSpec-rails 3.8.2
エラー内容と解決方法
RSpecを記述した後、テストを通すとエラーが発生しました。(現場Rails205p)
エラー内容としては「こちらの記事(teratail)」と全く同じものです。
テスト内容の記述やspec_helper.rb
、rails_helper.rb
のソースコードもこちらの記事と同じなので、必要に応じて参考にしてみてください。
Failures:
1) タスク管理機能 一覧表示機能 ユーザーAがログインしているとき ユーザーAが作成したタスクが表示される
Got 0 failures and 2 other errors:
1.1) Failure/Error: visit login_path
Selenium::WebDriver::Error::WebDriverError:
unable to connect to chromedriver 127.0.0.1:9515
# ./spec/system/tasks_spec.rb:12:in `block (4 levels) in <top (required)>'
1.2) Failure/Error: raise Error::WebDriverError, cannot_connect_error_text
Selenium::WebDriver::Error::WebDriverError:
unable to connect to chromedriver 127.0.0.1:9515
エラーを読むと、どうやらwebdriverにエラーが発生しててchromedriverに接続できないみたいです。
Windows側とは別に、Ubuntu側にもchromeをインストールしないといけないみたいなので、こちらの記事「ubuntuにchromeを簡単にインストールしよう」を参考にchromeをインストールしました。
ちなみに、Ubuntu上で以下のコマンドを入力するとchromeがインストールされているか分かります。
$ google-chrome -version
Google Chrome 74.0.3729.169
さて、Ubuntu上にもchromeがインストールできたということで、もう一度テストを実行すると次は以下のエラーが...。
Failures:
1) タスク管理機能 一覧表示機能 ユーザーAがログインしているとき ユーザーAが作成したタスクが表示される
Got 0 failures and 2 other errors:
1.1) Failure/Error: visit login_path
Net::ReadTimeout:
Net::ReadTimeout
# ./spec/system/tasks_spec.rb:12:in `block (4 levels) in <top (required)>'
1.2) Failure/Error: @io.to_io.wait_readable(@read_timeout) or raise Net::ReadTimeout
Net::ReadTimeout:
Net::ReadTimeout
どうやら、次はchromeに繋がらずにタイムアウトしてしまったようですね。
こちらの記事(WSL Ubuntu 上で chromedriver を使った System Spec を動かす)によれば、
ChromeがインストールされているのはWSLの外のWindows環境。 なのでパスが通っていないし、バイナリも不一致となってしまう。
そのため cannot find Chrome binary のようなエラーが出るなどして System Spec を実行できない。
以下の2種類の対策方法がありそうだ。
A. chromedriver-helper を使わずに、自分で chromedriver を設定する
B. chromedriver-helper を利用しつつ、ChromeをWSL環境にインストールする
対策A. chromedriver-helper を使わずに、自分で chromedriver を設定する
とのこと。WSLでUbuntuを使うとパスが通ってないのでいろいろと設定が追加で必要なようです。
二つの対策方法があるみたいなので、記事を参考に僕もAの「自分でchromedriverを設定する」ことにしました。
結果、無事にテストを通すことができました。
めでたし、めでたし