Selenium::WebDriver::Error::UnknownError:の対処法(seleniumではなくrackを指定してテストを走らせる)


環境

Rails5.2
Ruby2.5
rspec-rails 3.7
Docker

状況

RspecでSystemSpecを実装中に下記のエラーに悩まされました。。

terminal
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.)

日本語訳

Selenium::WebDriver::Error::UnknownError
            不明なエラーです。Chrome の起動に失敗しました: 異常終了しました。
              (不明なエラー: DevToolsActivePortファイルが存在しない)
              (chromeの場所/usr/bin/google-chromeから起動したプロセスはもう実行されていないので、ChromeDriverChromeがクラッシュしたと仮定しています)

調べてみるとこのエラーの対処法が記載されている記事は
有難いことに比較的色々と見つけることができました。
(chrome-driverをインストールしたり、googlechromeを最新バージョンにアップデートしたり、
rails_helper.rbの記載を修正したり、capybaraのバージョンを変更したりなど、
私も色々試しました・・・)

しかしseleniumを用いずにrackを使って対処している記事は比較的少なかったと感じ、
対処法をまとめさせていただきます。

対象

SystemSpecで同様のエラーが出ており、JavaScriptのテストは不要な方

JavaScriptの動作を確認するテストが必要な方はseleniumを用いる必要があるからです。
私の場合は、JavaScriptの動作確認は不要だった為、
selenium_chrome_headlessはあえて使用しない選択をとりました。
(JavaScriptを検証しないテストの場合、rackの方がテストを走らせる時間を短縮できるという
メリットもあるようです。)

行ったこと

①rails_helper.rbを修正

修正したのは以下になります。

spec/rails_helper.rb

  config.include FactoryBot::Syntax::Methods
  config.before(:each) do |example|
    if example.metadata[:type] == :system
      if example.metadata[:js]
        driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
      else
        driven_by :rack_test
      end
    end
  end
  # Capybara.javascript_driver = :selenium
  ↑ここを記載していましたが、コメントアウトにする
end

②capybara.rbの修正

spec/capybara.rb

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end
end
Capybara.default_driver = :rack_test

rack_testで行うことを明示。

上記を行い、再度

terminal

docker-compose exec 【アプリ名】 bundle exec rspec spec/system

を行うとテストがパスしました!

※念のため

Gemfile

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-byebug'
  gem 'rails-erd'
  gem 'annotate'
  gem 'rails-controller-testing'
  gem 'capybara', '~> 2.15'
  gem 'selenium-webdriver'
end

割と時間をかけて悩まされたのですが解決策は非常にシンプルでした・・・

そもそもの、Rspec、capybaraに対する知識やドライバの理解等、勉強する必要があると感じました。