8

The documentation for Rails 5.1 system tests is a bit sparse. I'm unable to get headless tests that execute javascript running. I think one approach entails installing and running xvf. But this is more manual setup than I'm used to when running capybara in other versions of rails.

What's the most straightforward way to achieve this?

John Bachir
  • 22,495
  • 29
  • 154
  • 227

1 Answers1

10

In Rails 5.1 system tests the driver used is set by the driven_by call in ApplicationSystemTestCase (test/application_system_test_case.rb). Assuming you have registered your capybara-webkit driver as 'webkit' you should be able to do

driven_by :webkit

Another potential option if you use Chrome 59+ on linux/mac is to use headless chrome

Capybara.register_driver :headless_chrome do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome, :args => ['headless'])
end

and then in your test case class

driven_by :headless_chrome

That gives you a headless version of chrome so none of the issues of capybara-webkit/poltergeist not supporting current web standards. Unfortunately currently chromedriver has issues with JS system modals (alert, confirm, prompt - workaround in capybara master branch) and hangs if you attempt to close windows during your tests. Hopefully those 2 issues will be fixed soon.

Also note that rails 5.1 should have removed the need for database_cleaner for most peoples testing since it already handles sharing of a single database connection between multiple threads in test mode.

Thomas Walpole
  • 48,548
  • 5
  • 64
  • 78
  • 1
    thanks! "Assuming you have registered your capybara-webkit driver as 'webkit' " — how do I do this? – John Bachir May 05 '17 at 20:58
  • 1
    @JohnBachir using `Capybara.register_driver` - when you include capybara-webkit in your project there will be one auto registered - you'd only need to change that if you need to change settings that can only be configured through driver registration - https://github.com/teamcapybara/capybara#configuring-and-adding-drivers – Thomas Walpole May 05 '17 at 22:20
  • To avoid a deprecation message, you're going to need to use the [`add_argument` syntax of `Selenium::WebDriver::Chrome::Options`](https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/Chrome/Options.html#add_argument-instance_method). – croceldon Mar 08 '18 at 21:32