使用Capybara,我需要声明表单元素不存在,例如,'然后我不应该看到“用户名”文本字段'。如果找不到元素,find会抛出异常,这是我提出的最好的。还有更好的方法吗?
Then /^I should not see the "([^\"]+)" ([^\s]+) field$/ do |name, type|
begin
# Capybara throws an exception if the element is not found
find(:xpath, "//input[@type='#{type}' and @name='#{name}']")
# We get here if we find it, so we want this step to fail
false
rescue Capybara::ElementNotFound
# Return true if there was an element not found exception
true
end
end
我是Capybara的新手,所以我可能会遗漏一些明显的东西。
答案 0 :(得分:51)
你可以通过使用capybaras has_no_selector来做到这一点吗?方法结合rspecs魔术匹配器。然后您可以这样使用它:
page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")
您可以在标题查询
部分的capybara文档页面here上查看可以执行的断言的更多详细信息。答案 1 :(得分:24)
您实际上可以使用Capybara匹配器定义的现有方法。
assert has_no_field?('Username')
此外,还有其他方法可以帮助您在页面中找到不同类型的元素
has_link? , has_no_link?
has_button?, has_no_button?
has_field?, has_no_field?
has_checked_field?, has_no_checked_field?
has_select?, has_no_select?
还有更多。 。 。
答案 2 :(得分:9)
以下是我正在使用的内容:
expect(page).to have_no_css('.test')
答案 3 :(得分:3)
我尝试了Derek建议的解决方案,然而,我遇到了一些漏报。
那是
page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")
即使因某种原因失败也会通过。
我发现使用raise_error
expect { find(:xpath, "//input[@type='#{type}' and @name='#{name}']") }.to raise_error
我认为这更接近你所要求的。所以我把这个作为答案。
答案 4 :(得分:1)
执行此操作的最佳方法是查找元素和断言不存在的断言。这不仅会创建可重用的代码,而且如果无法找到它,整个测试也不会爆炸。
这就是我做的......
定义你的对象
def username
page.find('.username')
end
然后与spec文件中的对象进行交互
username.should be_true
你真的不应该关心元素是否在页面上(大多数时候)。你在编写测试时关心的是你是否可以与该元素进行交互......这就是我首先定义对象然后使用'username'与之交互的原因...看看有多少可重用的代码你可以生成?现在,您可以单击,悬停,断言元素存在,向元素填写文本等。
另外,你应该尽可能考虑在xpath上使用css。 xpath更容易破解,更难阅读。
答案 5 :(得分:0)
我遇到了同样的问题。但由于我使用Capybara和Minitest,所接受的解决方案对我不起作用。我想我应该补充一下,如果遇到与我相同情况的人会发现这个问题。
也可以使用:
assert page.has_no_xpath?('//input[@type='#{type}' and @name='#{name}'"]')
答案 6 :(得分:0)
在规格文件中
expect(@app.some_page_name.is_visible?('search_button')) == true
页面文件中
element :search_button, :xpath, "//div[@class='dummy']"
在base_page文件中
def is_visible?(value)
begin
eval(value).visible?
return true
rescue => e
p e.message
return false
end
end