Capybara has_field找不到has_selector找到的字段

时间:2013-08-25 18:47:48

标签: ruby-on-rails cucumber capybara

我目前正在为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?

3 个答案:

答案 0 :(得分:13)

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

添加:disabled => true选项可以解决您的问题:

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

注意:

  • 当您加入:disabled => true时,必须禁用该字段。默认值为:disabled => false,仅匹配未禁用的字段。
  • :type值应该是一个字符串。如上所述,它是:type => 'textarea')。使用符号:type => :textarea将不起作用。

答案 1 :(得分:0)

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

因为这是错误消息所指示的内容 - 它找到了'message_to_13'的内容,但它不是textarea。您也可以尝试传递:textarea作为字符串而不是符号。

答案 2 :(得分:0)

您的测试正在寻找textarea类型的输入字段。 Textareas不是输入字段,它们是textareas。尝试删除type: :textarea

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