我目前正在为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?
答案 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 => 'textarea')
。使用符号:type => :textarea
将不起作用。答案 1 :(得分:0)
您可能有一些其他元素的ID,名称或标签与“message_to_13”匹配吗?
因为这是错误消息所指示的内容 - 它找到了'message_to_13'的内容,但它不是textarea。您也可以尝试传递:textarea作为字符串而不是符号。
答案 2 :(得分:0)
您的测试正在寻找textarea类型的输入字段。 Textareas不是输入字段,它们是textareas。尝试删除type: :textarea
。