gpt4 book ai didi

selenium - 在 :all hook 之前带有 rspec 的 capybara / Selenium

转载 作者:行者123 更新时间:2023-12-03 23:57:49 27 4
gpt4 key购买 nike

为了减少使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com