如何检查表单域是不是使用 capybara 正确预填?

Posted

技术标签:

【中文标题】如何检查表单域是不是使用 capybara 正确预填?【英文标题】:How can I check that a form field is prefilled correctly using capybara?如何检查表单域是否使用 capybara 正确预填? 【发布时间】:2012-05-17 05:49:58 【问题描述】:

我有一个带有适当标签的字段,我可以毫无问题地用 capybara 填写:

fill_in 'Your name', with: 'John'

我想在填写之前检查它的值,但无法弄清楚。

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

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

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

我错过了什么?

【问题讨论】:

【参考方案1】:

您可以使用 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 位。谢谢! 我遇到了同样的问题,但使用的是 div 而不是表单字段。对于遇到同样问题的其他人,请使用 find_by_id().text 而不是 find_field().value。我花了 ages 才发现该值仅适用于表单字段...... 后一种方式的问题是它不使用Capybara的轮询周期,因此如果该字段是由运行时间较长的JS代码设置的,则会立即失败。除非您在静态生成的表单上尝试此方法,否则首选第一种方法。 我认为@fqxp 有一个更好的答案,它使用 RSpec 匹配器和新的期望语法。从我在文档中看到的,find_field 和其他Node::Finders 用于查找节点并对它们执行操作,而不是期望。当然,这不是一个规则,但对于像这样简单的事情,使用内置解决方案是一个更好的主意。只是说! 没错,expect 将是现在的首选方式,但是该语法是在这个问题后大约一个月发布的。【参考方案2】:

另一个很好的解决方案是:

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

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

分别。

另见reference。

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

【讨论】:

比选择的答案好多了! 我仍然更喜欢选择的答案,因为错误消息显示了预期和实际的字符串。这给出了无用的“预期字段”我的字段“返回某些东西”错误。但是这个确实读得更好,并且更好地遵循了页面匹配器 API。到处点赞!!! 据我所知,这实际上并不能确认字段的值,只是字段的存在而不管值。我猜这是一个错误,因为文档说它应该根据值进行过滤。 传入with 肯定只有在值匹配时才返回true,对我来说,这是预期的结果。 也许自从第一次写答案以来错误消息已经得到改进,但我现在在一个空字段上得到expected […] but there were no matches. Also found "", which matched the selector but not all filters..,这非常接近一个非常好的错误消息。【参考方案3】:

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

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")

【讨论】:

【参考方案4】:

我想知道如何做一些稍微不同的事情:我想测​​试该字段是否具有 some 值(同时使用Capybara's ability to re-test the matcher until it matches)。事实证明,可以使用“过滤块”来做到这一点:

expect(page).to have_field("field_name")  |field|
  field.value.present?

【讨论】:

【参考方案5】:

如果该字段是隐藏字段,ID 为“some_field”,则可以使用

expect(find("input#somefield", :visible => false).value).to eq 'John'

【讨论】:

以上是关于如何检查表单域是不是使用 capybara 正确预填?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Capybara 使用正确的错误消息断言元素数量?

使用 RSpec + capybara-webkit 检查 JS 框是不是存在

如何在 HTML 表单中“预填充”文本区域的值? [复制]

如何正确检查所有表单元素是不是都用 JavaScript 填充

一些JS运行后如何让Capybara检查可见性?

如何正确预填充颤振表单字段?