Подтвердить что ты не робот

Capybara/selenium с rspec до: все крючки

В попытке уменьшить количество посещений страниц с помощью selenium я хотел вызвать метод посещения с помощью before :all hook и запустить все мои примеры с загрузкой одной страницы. Однако, когда я указываю before :all vs before :each, браузер открывается, но URL-адрес никогда не посещается. Ниже приведен упрощенный и надуманный пример...

describe 'foobar', :js => true do
  before :all do
    Capybara.default_wait_time = 10
    obj = Factory(:obj)
    visit obj_path(obj)
  end

  it 'should have foo' do
    page.should have_content('foo')
  end

  it 'should have bar' do
    page.should have_content('bar')
  end
end

Когда я устанавливаю его на before :each, он работает, но страница загружается дважды. Это ограничение Капибары?

4b9b3361

Ответ 1

Причина проблемы

Второй пример не работает, потому что Capybara сбрасывает сеанс после каждого примера RSpec; страница visit -ed в вашем блоке before :all больше не открывается в этот момент. Это явное поведение Капибары. Это в камне capybara, под /lib/capybara/rspec.rb:

config.after do
  if self.class.include?(Capybara::DSL)
    Capybara.reset_sessions!
    Capybara.use_default_driver
  end
end

Я отправился в путь на пару часов и обнаружил, что некоторые другие борются с этим, но безуспешно.

Я также обнаружил, что патч который позволит Capybara быть настроен не на reset сеанс после каждого примера. но создатель Capybara jnicklas отклонил запрос на перенос.

Решение

Самое быстрое - хотя, возможно, не лучшее - работоспособное решение, которое я нашел (до сих пор) - обезьяна-патч Capybara таким образом

module Capybara                                                                                                                                                                                  
  class << self                                                                                                                                                                                  
    alias_method :old_reset_sessions!, :reset_sessions!                                                                                                                                          
    def reset_sessions!; end                                                                                                                                                                     
  end                                                                                                                                                                                            
end

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