[Rails5.2]Rspecでエラー

環境

Rails 5.2.2
Ruby 2.6.3
Rspec 3.8.0
ChromeDriver 75.0.3770.140
Google Chrome 75.0.3770.142

エラーの内容

Dockerを使っていて、久々に docker-compose build をしたら、Rspecの実行で下記のエラーが出た。

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

解消方法

元々のrails_helper.rb

  Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, {
      browser: :chrome,
      desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(
        chrome_options: {
          # NOTE: ここでno-sandboxオプション追加する
          args: %w[no-sandbox headless disable-gpu window-size=1680,1050],
        }
      )
    })
  end
  Capybara.javascript_driver = :selenium

修正後のrails_helper.rb

Capybara.register_driver :selenium do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new

  options.add_argument('--no-sandbox')
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1680,1050')

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
Capybara.javascript_driver = :selenium

optionの渡し方が悪かった。仕様が変わったのだと思われる。
どのタイミングからエラーになったのかなど、特にそこに関しては調査していない。

試したこと

最初は見当がつかなかったので、手当たり次第にググった。なんとなく、引数に問題がある気がした。なので、オプションの引数の書き方を変更してみた。
→成功するが、非推奨の警告が出る

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome, args: %w[no-sandbox headless disable-gpu window-size=1680,1050])
end
Capybara.javascript_driver = :selenium
2019-07-30 10:50:06 WARN Selenium [DEPRECATION] :args or :switches is deprecated. Use Selenium::WebDriver::Chrome::Options#add_argument instead.
Successfully ***********

オプションの引数に–を渡してみる。変化なし。
→成功するが、非推奨の警告が出る

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome, args: %w[--no-sandbox --headless --disable-gpu --disable-dev-shm-usage --window-size=1680,1050])
end
Capybara.javascript_driver = :selenium
2019-07-30 10:52:23 WARN Selenium [DEPRECATION] :args or :switches is deprecated. Use Selenium::WebDriver::Chrome::Options#add_argument instead.
  Successfully ***********

Selenium::WebDriver::Chrome::Options#add_argument instead. と言っているので、ググった。

[Ruby]Selenium::WebDriverでHeadless Chromeを起動したときのChromeのオプション設定 - Qiita
Selenium::WebDriverを使ってHeadless Chromeを起動したときのオプション設定について調べてみました。 Selenium::WebDriverでHeadless Chromeを起動するには 通常のCh...

上記のサイトを参考にSelenium::WebDriver::Chrome::Optionsを使ってみる。
→ エラー

Capybara.register_driver :selenium do |app|  
  options = Selenium::WebDriver::Chrome::Options.new
    
  options.add_argument('--no-sandbox')
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1680,1050')

  Capybara::Selenium::Driver.new(app, browser: :chrome, args: options)
end
Capybara.javascript_driver = :selenium
ArgumentError:
       :args must be an Array of Strings

よくサイトを見たら、optionsを渡しているのは、:argsではなく:optionsだった
→ 成功

Capybara.register_driver :selenium do |app|  
  options = Selenium::WebDriver::Chrome::Options.new

  options.add_argument('--no-sandbox')
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1680,1050')

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
Capybara.javascript_driver = :selenium
Successfully ***********

各オプションの–を削除してやってみる

Capybara.register_driver :selenium do |app|  
  options = Selenium::WebDriver::Chrome::Options.new

  options.add_argument('--no-sandbox')
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1680,1050')

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
Capybara.javascript_driver = :selenium
Successfully ***********

Dockerだったり、Rspecの設定周りというのをあまりいじってなかったので、時間がかかったが、無事できてよかった。

コメント