如何使用水豚检查表单字段是否正确填充?


145

我有一个带有适当标签的字段,可以毫无问题地用水豚来填充:

fill_in 'Your name', with: 'John'

我想先检查一下它具有的值,然后再弄清楚。

如果我fill_in在以下行之后添加:

find_field('Your name').should have_content('John')

该测试失败了,尽管正如我通过保存页面验证的那样,之前的填充工作正常。

我想念什么?

Answers:


179

您可以使用xpath查询来检查是否存在input具有特定值的元素(例如'John'):

expect(page).to have_xpath("//input[@value='John']")

有关更多信息,请参见http://www.w3schools.com/xpath/xpath_syntax.asp

以更漂亮的方式:

expect(find_field('Your name').value).to eq 'John'

编辑:如今我可能会使用have_selector

expect(page).to have_selector("input[value='John']")

如果您正在使用页面对象模式(应该使用!)

class MyPage < SitePrism::Page
  element :my_field, "input#my_id"

  def has_secret_value?(value)
    my_field.value == value
  end
end

my_page = MyPage.new

expect(my_page).to have_secret_value "foo"

啊,我错过了.value一点。谢谢!
马克-安德烈·Lafortune

我遇到了同样的问题,但是使用了div而不是表单字段。对于其他有相同问题的人,请使用find_by_id()。text而不是find_field()。value。我花了很长时间才发现这种价值仅适用于表格领域…
John Y

8
后一种方法的问题在于它不使用Capybara的轮询周期,因此如果该字段是由运行时间较长的JS代码设置的,则会立即失败。除非您在静态生成的表单上尝试此方法,否则将首选第一种方法。
fqxp

1
我认为@fqxp使用RSpec Matchers和新的期望语法有更好的答案。根据我在文档中看到的内容,find_field其他Node::Finders用于查找节点并对其执行操作而不是期望。当然,这不是规则,但是对于简单的事情来说,采用内置解决方案是一个更好的主意。只是说!
Agent47DarkSoul

的确,期望是现在的首选方式,但是语法在此问题发布后约一个月发布。
DVG 2013年

309

另一个漂亮的解决方案是:

page.should have_field('Your name', with: 'John')

要么

expect(page).to have_field('Your name', with: 'John')

分别。

另请参阅参考资料

注意:对于禁用的输入,您需要添加option disabled: true


23
比所选答案好得多!
Agent47DarkSoul

3
我仍然希望选择答案,因为错误消息会向您显示预期和实际的字符串。这给出了无用的“预期字段“我的字段”以返回某些内容”错误。但是,这绝对可以更好地阅读,并且可以更好地遵循页面匹配器API。到处投票!!!
mraaroncruz 2014年

1
据我所知,这实际上并不能确认字段的值,而只是确认字段的存在而与值无关。我猜这是一个错误,因为文档说它应该基于值进行过滤。
尼克

1
传递with给我的只有在值匹配时才返回true,这对我来说是预期的结果。
Ben Saufley 2014年

4
自从首次编写答案以来,错误消息也许已经得到改善,但是我现在进入expected […] but there were no matches. Also found "", which matched the selector but not all filters..一个空字段,该字段非常接近一个非常好的错误消息。
Patru 2014年

2

如果您特别想测试占位符,请使用:

page.should have_field("some_field_name", placeholder: "Some Placeholder")

要么:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder")

如果要测试用户输入的值:

page.should have_field("some_field_name", with: "Some Entered Value")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.