Selenium::WebDriver::Error::UnknownError : (selenium 대신 rack을 지정하여 테스트 실행)

환경



Rails5.2
Ruby2.5
rspec-rails 3.7
도커

상황



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から起動したプロセスはもう実行されていないので、ChromeDriverはChromeがクラッシュしたと仮定しています)


조사해 보면이 오류의 대처법이 기재되어있는 기사는
고맙게도 비교적 다양한 것을 찾을 수있었습니다.
(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에 대한 지식이나 드라이버의 이해 등, 공부할 필요가 있다고 느꼈습니다.

좋은 웹페이지 즐겨찾기