确保Capybara不存在元素

时间:2011-05-06 01:51:09

标签: ruby capybara

使用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的新手,所以我可能会遗漏一些明显的东西。

7 个答案:

答案 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

的RSpec语法取得了成功
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