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から起動したプロセスはもう実行されていないので、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에 대한 지식이나 드라이버의 이해 등, 공부할 필요가 있다고 느꼈습니다.

좋은 웹페이지 즐겨찾기