6

我目前正在为 Rails 应用程序中的消息传递系统编写 Cucumber 功能。这是我的步骤之一。

Then(/^they should see the message displayed in their language$/) do
  id = "message_to_#{@family.id}"
  expect(page).to have_selector("textarea##{id}")
  save_and_open_page
  expect(page).to have_field(id, type: :textarea)
end

第一个断言通过,但第二个断言失败。当我检查 save_and_open_page 创建的标记时,存在以下元素:

<textarea cols="22" disabled="disabled" id="message_to_13" name="body" placeholder="Hallo, Ich bin sehr interessiert an deinem Profil. Würdest du gerne mit mir in Kontakt treten?" rows="7"></textarea>

第二次测试显示的错误消息是:

expected to find field "message_to_13" but there were no matches. Also found "", which matched the selector but not all filters. (Capybara::ExpectationNotMet)

我在这里扯了扯头发,以了解为什么 Capybara 可以找到使用 have_selector 明显存在的这个元素,但不能使用 have_field?

4

3 回答 3

14

问题是 textarea 具有该disabled="disabled"属性,这意味着它是一个禁用的字段。默认情况下,Capybara 会忽略禁用的字段。Capybara 2.1 中的新功能是查找禁用字段的选项。

添加disabled: true选项将解决您的问题:

expect(page).to have_field(id, type: 'textarea', disabled: true)

笔记:

  • 当您包含 时disabled: true,必须禁用该字段。默认值为disabled: false,仅匹配未禁用的字段。
  • :type 值应该是一个字符串。如上图所示,是type: 'textarea')。使用符号,type: :textarea将不起作用。
于 2013-08-26T01:32:36.693 回答
0

有可能,您有一些其他元素的 id、名称或标签与“message_to_13”匹配?

因为这就是错误消息所表明的 - 它找到了带有“message_to_13”的东西,但它不是文本区域。您也可以尝试将 :textarea 作为字符串而不是符号传递。

于 2013-08-25T19:03:42.010 回答
0

您的测试正在寻找 textarea 类型的输入字段。文本区域不是输入字段,它们是文本区域。尝试删除type: :textarea.

见这里:https ://github.com/jnicklas/capybara/issues/978

于 2013-08-25T19:12:22.993 回答