WSL2 (Ubuntu) で System Spec (RSpec, Capybara) を実行しようとすると Webdrivers::BrowserNotFound: Failed to find Chrome binary と出るときの対処方法

結論

1. google-chrome をインストールします

  • 詳細は割愛します*1
  • 配置場所は /opt/google/chrome 配下になるかと思います

2. chromedriver をインストールします

3. spec/rails_helper.rb に記述を追加します

spec/rails_helper.rb に以下の記述を追加します。/usr/bin/chromedriver の部分は chromedriver がインストールされている場所です。

Selenium::WebDriver::Chrome::Service.driver_path = '/usr/bin/chromedriver'

4. RSpec (System Spec) を実行します

これで、System Spec が正しく実行できるはずです。ただ、ヘッドレスではない Chrome の動作には VcXsrc X Server の設定が必要になります*3

注意点

Chrome を Headless モードで実行したい場合は /opt/google/chrome/google-chrome を編集します*4

最終行の以下の部分を編集します。

exec -a "$0" "$HERE/chrome" "$@"v

上記の部分に対して以下のように --headless オプションを付与すると、ヘッドレスモードで起動できます。他に --disable-setuid-sandbox オプションなどを付与することも出来ます。

exec -a "$0" "$HERE/chrome" --headless "$@"

上記の書き方だとすべての場合に --headless になってしまうので、以下のように書くのも良いです。

if [[ $RAILS_ENV = "test" ]]; then
  exec -a "$0" "$HERE/chrome" --headless "$@"
else
  exec -a "$0" "$HERE/chrome" "$@"
fi

補足

共同開発をしている場合には、自分だけ WSL2 で開発しているときは spec/rails_helper.rb を変更してしまうことになります。

それを避けるためには、たとえば spec/support 配下に上記の一行だけを書いたコードを置き、それを .git/info/exclude で自分だけ無視すればうまくいくことでしょう*5

*1:Ubuntu ならば apt や dpkg で入れるといいでしょう

*2:パスが通っているならばどこでも良いです

*3:詳細は割愛します

*4:このファイルは実行のためのスクリプトファイルですので、編集ができます

*5:Docker で開発するとこのような悩みは無くなりそうです

Powered by はてなブログ