Rspec+Capybara опционально меняют драйвер JS

Я использую poltergeist/phantomjs для CI, но я хочу иметь возможность при желании изменить драйвер JS на selenium для локального просмотра моих тестов. В идеале я хотел бы иметь флаг командной строки для этого полтергейста по умолчанию, но иметь возможность запустить rspec --driver=selenium (или что-то подобное)

Есть идеи?

4 ответа

Решение

Никогда не заканчивал тем, что нашел ответ для этого, так вот хакерское решение, которое я придумал:

Единственное, что я смог надежно изменить, - это система тегов. Поэтому я вызываю с помощью -t визуальный тег, а затем убираю его.

В 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~

Теперь вы можете запустить свои тесты с rspec (tests to run) -t visual
Основная проблема заключается в том, что это не позволит вам запускать определенные тесты. Вы все еще можете сделать один файл с rspec spec/features/signup_spec.rb -t visual но вы не можете добавить :54 бежать по определенному номеру строки.

Вы можете установить переменную окружения из командной строки, которую можно использовать в 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

Который затем можно запустить из командной строки следующим образом:

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

Это позволит вам указать конкретный номер строки.

Возможно, вам также придется изменить свою стратегию очистки в зависимости от используемого драйвера капибары (т.е. с очистителем базы данных):

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

    DatabaseCleaner.clean_with(:truncation)
  end
end

Если вы хотите стать модным, вы можете объединить его с ответом stackru: /questions/830462/kak-ya-mogu-zapustit-selenium-ispolzuemyij-cherez-capybara-na-bolee-nizkoj-skorosti/830466#830466 чтобы замедлить скорость, с которой селен запускает спецификации, когда они работают в режиме отладки:

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

У меня есть то, что я думаю, может быть менее хакерским решением. Я в основном отрываю решение Джеффа Перрина, но делаю его менее сложным.

мой DatabaseCleaner просто установлен, чтобы всегда использовать усечение, поэтому нет необходимости условно настраивать эту часть.

Установите свой javascript_driver сюда:

# spec/spec_helper.rb

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

Я не вижу необходимости устанавливать драйвер по умолчанию для Capybara, если мы всегда устанавливаем явно javascript_driver к чему-то. (Возможно, что Джефф знает что-то об этом, что я не знаю.)

Это будет использовать Webkit в качестве драйвера, если у вас нет USE_SELENIUM_FOR_CAPYBARA установить в вашей среде.

Конечно, вы также должны иметь гемы Selenium и Webkit в вашем Gemfile, если вы хотите, чтобы RSpec мог работать с любым драйвером.

Это решение отлично сработало для меня. Я устанавливаю переменную окружения и проверяю ее значение. Добавьте это в ваш файл spec_helper.rb

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

А затем на консоли запустите эту команду

DRIVER=poltergeist rspec // для запуска теста на poltergeist

rspec // для работы на селене

Другие вопросы по тегам