在使用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_visible
或expect(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
因此,我将对其他元素使用类似的内容。
答案 0 :(得分:1)
我不知道您在哪里遇到了这个建议(也许它真的很老了),但是对于使用“水豚”提供的匹配器的任何“最新”版本的水豚(至少最近四年),这是不正确的。< / p>
假设have_button
和have_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秒已过去并且按钮仍在页面上可见,它们将检查按钮是否存在并在按钮不存在时返回或引发异常。