简体   繁体   中英

Rspec+Capybara optionally change JS driver

I use poltergeist/phantomjs for CI, but I want to be able to optionally change the JS driver to selenium to watch my test runs locally. Ideally I'd like to have a command line flag for this- default poltergeist, but be able to run rspec --driver=selenium (or something similar)

Any ideas?

Never ended up finding an answer for this, so here's the hacky solution I came up with:

The only thing I found that I could reliably change was the tagging system. So I call using -t visual tag and then take it away.

In spec/spec_helper.rb

Rspec.configure do |config|
  if config.filter_manager.inclusions[:visual]
    Capybara.javascript_driver = :selenium
    config.filter_manager.inclusions.delete(:visual)
  else
    Capybara.javascript_driver = :poltergeist
  end

~rest of rspec config code~

Now you can run your tests with rspec (tests to run) -t visual
The main problem with this is that it will prevent you from running specific tests. You can still do a single file with rspec spec/features/signup_spec.rb -t visual but you cannot add a :54 to run at a specific line number.

You can set an environment variable from the command line that can be used in spec/spec_helper.rb:

DEBUG = ENV['DEBUG'] || false
if DEBUG
  Capybara.default_driver = :selenium
else
  Capybara.default_driver = :rack_test
  Capybara.javascript_driver = :poltergeist
end

Which can then be run from the command line like so:

DEBUG=true rspec spec/features/my_spec.rb:35

This will allow you to specify a specific line number.

You may also have to change your cleanup strategy depending on the capybara driver being used (ie; with database cleaner):

RSpec.configure do |config|
  config.before(:suite) do
    if DEBUG
      DatabaseCleaner.strategy = :truncation
    else
      DatabaseCleaner.strategy = :transaction
    end

    DatabaseCleaner.clean_with(:truncation)
  end
end

If you want to get fancy, you can combine it with this stackoverflow answer: https://stackoverflow.com/a/5150855/95683 to slow down the speed at which selenium runs specs when they're running in DEBUG mode:

config.before(:each) do |group|
  set_speed :slow if DEBUG
end

I have what I think might be a less hacky solution. I'm basically ripping off Jeff Perrin's solution but making it less complicated.

My DatabaseCleaner is just set to always use truncation, so no need to conditionally configure that part.

Set your javascript_driver this way:

# spec/spec_helper.rb

Capybara.javascript_driver = ENV['USE_SELENIUM_FOR_CAPYBARA'] ? :selenium : :webkit

I don't see any need to set Capybara's default driver if we're always explicitly setting javascript_driver to something. (It's possible that Jeff knows something about this that I don't.)

This will use Webkit as the driver unless you have USE_SELENIUM_FOR_CAPYBARA set in your environment.

You should also of course have both the Selenium and Webkit driver gems in your Gemfile if you want RSpec to be able to function with either driver.

This solution has perfectly worked for me. I set an environment variable and check for its value. Add this to your spec_helper.rb file

if ENV['DRIVER'] =='poltergeist' //use any driver you want to run on circlci
  Capybara.default_driver = :poltergeist
  URL = // use your own end point like http://www.localhost:8080
else
   Capybara.default_driver = :selenium
   URL = // Use your end point
end 
Capybara.configure do |config|
  config.app_host = URL
end

And then on the console run this command

DRIVER=poltergeist rspec //for running test on poltergeist

rspec //for running on selenium

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM