水豚RSpec匹配器正在等待元素?

时间:2019-04-09 15:16:14

标签: rspec capybara

在使用Capybara + RSpec编写测试框架/测试时,我遇到了有关测试不存在的元素的建议:

expect(page).to have_no_button('Save')   # OK
expect(page).not_to have_button('Save')  # Bad

我很困惑为什么,直到我看到这句话:

  

与RSpec匹配器一起使用应具有版本号*,因为should_not   have_ *不会等待驱动程序超时。

这是真的吗?如果不是...从页面对象模型的角度来看,有一种方法可以检查并返回是否存在<element>(我通常使用.visible?),那么这样做就更有意义了。 rspec匹配器执行expect(page_object).to be_method_visibleexpect(page_object).not_to be_method_visible吗?

与必须在页面对象中编写2个单独的方法相反(除非not_to确实不会等待)

对于我的页面对象模型中的断言方法的示例,这是我检查“注销链接”的操作

def logged_in?
    logout_text.visible?
end

private
def logout_text
    find 'a', text: 'Log Out'
end

然后在规范中我会说: expect(page_object).to be_logged_in

因此,我将对其他元素使用类似的内容。

1 个答案:

答案 0 :(得分:1)

我不知道您在哪里遇到了这个建议(也许它真的很老了),但是对于使用“水豚”提供的匹配器的任何“最新”版本的水豚(至少最近四年),这是不正确的。< / p>

假设have_buttonhave_no_button是Capybara提供的匹配器(不是RSpecs内置的have_xxx => has_xxx?匹配器调用您在页面对象上定义的has_button?方法),你举两个例子

expect(page).to have_no_button('Save')
expect(page).not_to have_button('Save')

将表现相同。如果Capybara.default_max_wait_time秒已过去并且按钮仍在页面上可见,它们将检查按钮是否存在并在按钮不存在时返回或引发异常。