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

标签 selenium capybara rspec2

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

相关文章:

python - 单击selenium python后从菜单中选择

google-chrome - Google Chrome中的弹出窗口阻止功能导致Capybara/Rspec测试出现问题

ruby - Capybara 和 Rspec 没有范围界定

ruby-on-rails - Rspec 集成测试不清理数据库

ruby-on-rails - RSpec 在 controller_spec 中将对象作为参数传递

java - 我无法使用 IEDriver 在 IE11 Windows 10 中找到 xpath

java - 在java中使用selenium web驱动程序从div获取文本值

Python webdriver 库未连接到 chromedriver -- "Can not connect to the Service/usr/local/bin/chromedriver"

capybara - 使用 simple_form 时如何在 capybara 测试中选中复选框

ruby-on-rails - 如何在 Capybara 功能规范中设置请求 IP?