如何在测试之间重复使用Capybara会话?

时间:2012-09-26 15:53:22

标签: ruby-on-rails session cookies capybara

我想继续使用相同的会话,我指的是使用Capybara的各种Test::Unit集成测试之间的Rails会话。 Capybara::Session对象在所有测试中都是相同的,因为它被重用,但当我在另一个测试中访问另一个页面时,我立即退出。

挖掘我发现在一次测试和下次测试之间清除了capybara_session.driver.browser.manage.all_cookies

任何想法如何?或为什么?或者如何避免它?

尝试解决这个问题,我将cookie保存在类变量中,稍后通过运行重新添加:

capybara_session.driver.browser.manage.add_cookie(@@cookie)

它似乎工作,cookie就在那里,但是当有一个请求时,cookie被替换为另一个,所以它没有效果。

还有其他方法可以达到这个目的吗?

4 个答案:

答案 0 :(得分:15)

在与页面交互的水豚代码后添加以下内容:

Capybara.current_session.instance_variable_set(:@touched, false)

or

page.instance_variable_set(:@touched, false)

如果这不起作用,这些可能会有所帮助:

https://github.com/railsware/rack_session_access

http://collectiveidea.com/blog/archives/2012/01/05/capybara-cucumber-and-how-the-cookie-crumbles/

答案 1 :(得分:5)

如果您正在尝试将单个示例串联到一个故事(黄瓜样式,但没有黄瓜),您可以使用名为rspec-steps的gem来实现此目的。例如,通常这不起作用:

describe "logging in" do
  it "when I visit the sign-in page" do 
    visit "/login"
  end
  it "and I fill in my registration info and click submit" do
    fill_in :username, :with => 'Foo'
    fill_in :password, :with => 'foobar'
    click_on "Submit"
  end
  it "should show a successful login" do
    page.should have_content("Successfully logged in")
  end
end

因为rspec会回滚所有实例变量,会话,cookie等等。

如果你安装了rspec-steps(注意:目前与rspec比2.9不兼容),你可以用'steps'替换'describe',Rspec和capybara将保留示例之间的状态,让你建立一个更长的故事,例如:

steps "logging in" do
  it "when I visit the sign-in page" #... etc.
  it "and I fill in" # ... etc.
  it "should show a successful" # ... etc.
end

答案 2 :(得分:2)

您可以通过猴子修补@browser.manage.delete_all_cookies方法阻止对测试之间发生的Capybara::Selenium::Driver#reset!的调用。这不是一个干净的方式,但它应该工作......

将以下代码添加到项目中,以便在 require 'capybara'之后执行:

class Capybara::Selenium::Driver < Capybara::Driver::Base
  def reset!
    # Use instance variable directly so we avoid starting the browser just to reset the session
    if @browser
      begin
        #@browser.manage.delete_all_cookies <= cookie deletion is commented out!
      rescue Selenium::WebDriver::Error::UnhandledError => e
        # delete_all_cookies fails when we've previously gone
        # to about:blank, so we rescue this error and do nothing
        # instead.
      end
      @browser.navigate.to('about:blank')
    end
  end
end

为了感兴趣,可以在Capybara的代码库中查看违规行:https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L71

答案 3 :(得分:0)

可能值得发布您需要此类行为的原因。通常,需要猴子补丁Capybara,表明你试图将它用于它不适合的东西。通常可以重新构建测试,这样您就不需要在集成测试中保持cookie。