为了减少使用 selenium 的页面访问次数,我想从 before :all
调用访问方法。使用单个页面加载 Hook 并运行我的所有示例。但是,当我指定 before :all
时对比 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
时,它可以工作,但页面加载了两次。这是 capybara 的限制吗?
最佳答案
问题原因
第二个示例不起作用,因为 Capybara 在每个 RSpec 示例之后重置 session ;您所在的页面visit
-ed 在您的 before :all
此时块不再打开。这是 capybara 的显性行为。它在 capybara
gem ,下 /lib/capybara/rspec.rb
:
config.after do
if self.class.include?(Capybara::DSL)
Capybara.reset_sessions!
Capybara.use_default_driver
end
end
我在谷歌上搜索了几个小时,发现其他几个人都在为此苦苦挣扎,但实际上无济于事。
我还发现了一个 patch这将允许 Capybara 被配置为在每个示例被提出后不重置 session ......但是 Capybara 创建者 jnicklas declined the pull request .
解决方案
我(到目前为止)找到的最快的——虽然可能不是最好的——可行的解决方案是 monkey-patch capybara 因此:
module Capybara
class << self
alias_method :old_reset_sessions!, :reset_sessions!
def reset_sessions!; end
end
end
这只是让
reset_sessions!
当它被调用时什么都不做。注意:谨防意外的副作用! (如果您需要再次发生默认重置行为,您可以随时在代码中恢复 alias_method
。)
关于selenium - 在 :all hook 之前带有 rspec 的 capybara / Selenium ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9630170/