如何使用capybara检查表单字段是否已正确预填?

Mar*_*une 141 forms rspec capybara

我有一个带有适当标签的字段,我可以用水豚填写没有问题:

fill_in 'Your name', with: 'John'
Run Code Online (Sandbox Code Playgroud)

我想在填写它之前检查它的值,但无法弄明白.

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

find_field('Your name').should have_content('John')
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么?

fqx*_*qxp 296

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

page.should have_field('Your name', with: 'John')
Run Code Online (Sandbox Code Playgroud)

要么

expect(page).to have_field('Your name', with: 'John')
Run Code Online (Sandbox Code Playgroud)

分别.

另见参考资料.

注意:对于禁用的输入,您需要添加该选项disabled: true.

  • 比选定的答案好多了! (20认同)
  • 也许错误信息已经改进,因为答案是第一次写的,但我现在得到'预期[...]但没有匹配.还找到了"",它匹配选择器,但不是所有过滤器..`在一个非常接近非常好的错误消息的空字段上. (4认同)
  • 我仍然更喜欢所选的答案,因为错误消息显示了预期的和实际的字符串.这给无用的"预期字段"我的字段"返回一些东西"错误.但是这个确实更好地阅读并更好地遵循页面匹配器API.全方位投票!!! (3认同)

DVG*_*DVG 177

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

expect(page).to have_xpath("//input[@value='John']")
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅http://www.w3schools.com/xpath/xpath_syntax.asp.

也许是一个更漂亮的方式:

expect(find_field('Your name').value).to eq 'John'
Run Code Online (Sandbox Code Playgroud)

编辑:现在我可能会使用have_selector

expect(page).to have_selector("input[value='John']")
Run Code Online (Sandbox Code Playgroud)

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

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"
Run Code Online (Sandbox Code Playgroud)

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