Capybara has_field找不到has_selector找到的字段

Ric*_*kes 5 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
Run Code Online (Sandbox Code Playgroud)

第一个断言通过,但第二个断言失败.当我检查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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jus*_* Ko 13

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

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

expect(page).to have_field(id, :type => 'textarea', :disabled => true)
Run Code Online (Sandbox Code Playgroud)

注意:

  • 当您包含时:disabled => true,必须禁用该字段.默认值为:disabled => false,仅匹配未禁用的字段.
  • 那个:type值应该是一个字符串.如上所述,它是:type => 'textarea').使用符号:type => :textarea将无法正常工作.