試した環境:
- rails 5.1.6.2
- rspec-rails 3.8.2
- capybara 3.26.0
- selenium-webdriver 3.142.3
- webdrivers 4.1.1
- Google Chrome 75
Gemfile
group :test do
gem 'rspec-rails'
gem 'capybara'
gem 'webdrivers'
end
spec_helper.rb
Capybara.register_driver :headless_chrome do |app|
chrome_options = Selenium::WebDriver::Chrome::Options.new
chrome_options.args << '--headless'
driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: chrome_options)
driver.browser.manage.window.size = Selenium::WebDriver::Dimension.new(2000, 3000)
driver
end
Capybara.javascript_driver = :headless_chrome
Capybara.default_max_wait_time = 5
Capybara.server = :puma, { Silent: true }
2019年5月以降、Rspecのfeature specがまともに動かないことで悩まされてきました。Chrome 74では謎のネットワークエラーが発生し、Chrome 75ではブラウザーがヘッドレスにならない、というものです。上記の設定により無事動くようになりました。
参考にしたのは、Rails 5.2のsystem testのソースコードです。
- https://github.com/rails/rails/blob/5-2-stable/actionpack/lib/action_dispatch/system_testing/driver.rb
- https://github.com/rails/rails/blob/5-2-stable/actionpack/lib/action_dispatch/system_testing/browser.rb
Rails 5.1.7と5.2以降 1 では、feature specではなく system spec を使うほうがよいと思いますが、なかなかRailsをバージョンアップできない環境もありますので。
Rails 5.0 でも動く
Rails 5.0のアプリケーションでも試してみたところうまくいきました。
- rails 5.0.7.2
- rspec-rails 3.5.2
- capybara 2.16.0
- selenium-webdriver 3.14.0
- webdrivers 4.1.1
- Google Chrome 75
Cannot call non W3C standard command while in W3C mode というエラーが出る場合は、上記の chrome_options にオプションを加えます。
spec_helper.rb
chrome_options.add_option(:w3c, false)
-
これより前では、system testでCapybara 3が使えない。 ↩