問題
Capybara と Headless Chrome で e2e テストを走らせてる時、以下のような例外がたまに起きて困っていた。CIとかVMで走らせてる時に起きがちだった。
Selenium::WebDriver::Error::UnknownError:
unknown error: session deleted because of page crash
from unknown error: cannot determine loading status
from tab crashed
こんなんとか
Selenium::WebDriver::Error::NoSuchDriverError:
invalid session id
こんなん。
解決策(対症療法だけど)
同じ問題になってる方がいた。 Selenium::WebDriver::Error::NoSuchDriverError - Today I Learned
Finally, after spotting this comment we’ve reduced chrome window size from
1920,1200
to1440,900
and the problem is no longer present.
「テストに使うブラウザのサイズを小さくしたら起きなくなった」とのこと。上記のリンクを辿って Chromium のバグリポート読むと、原因不明だけどメモリーが切れ気味になると起こる、みたいな報告がいくつか。Issue 1884: headless : session deleted because of page crash
じゃあそうしてみよう。このあたりを参考に
- Capybara.register_driver
- Capybara::Selenium::Driver#initialize
- Selenium::WebDriver::Chrome::Options#add_argument
-
List of Chromium Command Line Switches - Peter Beverloo
- Chromium の開発されてる方のページ。個人サイトっぽいが公式からもここにリンクしてたので公式ドキュメント扱いなのだろう
Capybara.register_driver :selenium_chrome do |app|
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('headless')
options.add_argument('window-size=1440,990')
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
で、なんとなく起きなくなった。また起きたらもうちょっとウィンドウサイズを小さくしよう。
TODO: 根本解決の方法がわかったら更新する。
追記(結論)
CIのスペックをあげるのが正解だと思う。メモリ盛ると起こらないです。