Capybara无法找到并填写第一个表单元素

时间:2016-03-21 13:51:18

标签: ruby-on-rails ruby rspec capybara rspec-rails

似乎Capybara无法通过该表单元素标签中的显示文本在页面上找到第一个表单元素。

然而,

Capybara可以通过该标签的for值找到第一个表单元素,这似乎很奇怪。我认为DOM尚未加载,而且Capybara可以持续搜索for值但不会搜索labels中显示的文字?

以下是我的相关表单元素:

relevant form elements

所以我应该能够通过显示的标签文本抓住每个元素:

fill_in "First Name", with: "foo"
fill_in "Last Name", with: "bar"
fill_in "Title", with: "some title"

这是我的规格:

scenario "with minimum fields while passing validations", js: true do
  visit "/"
  click_link "New Contact"
  fill_in "First Name", with: "foo"
  fill_in "Last Name", with: "bar"
  fill_in "Title", with: "some title"

  click_button "Create Contact"
  expect(page).to have_content "Success."
  expect(page).to have_content "foo bar"
end

找不到First Name表单元素,因此它不会填充它。它找到Last Name元素和Title元素就好了,因为我假设DOM已经完全加载了时间:

not filling in first name

这是html:

the html

然而,奇怪的是:当我更改第一个名字的填写时:

fill_in "First Name, with: "foo"

要:

fill_in "contact_first_name, with: "foo"

现在可以使用,但我不想使用for的{​​{1}}值来获取该表单元素。我希望使用显示的标签文字,因为我可以使用contact_first_nameTitle

enter image description here

我错过了什么?为什么我不能使用"名字"抓住First Name表单元素?

更新:事实证明,如果我将Last Name放在`fill_in" First Name"之前,用:" foo"然后它的作品!根据@TomWalpole的评论,似乎有一个javascript库正在阻碍?以下是我所包含的所有javascripts:

sleep 1

2 个答案:

答案 0 :(得分:2)

Capybara实际上是在找到输入并将其填入,但随后该值将被删除。这是因为你有一些JS库在Capybara填充元素后向输入添加功能/行为。一旦JS增加了输入,它就会将其值重置为输入值属性(与已更改的值属性相反),最终将其设置为空白。在第一次fill_in之前休眠是一种解决方法,除此之外,它意味着在调用fill_in之前确定在元素上运行JS并等待可检测的更改(如果有的话)。

答案 1 :(得分:0)

如果是慢速页面加载,特别是如果涉及一些Javascript和/或CSS动画,那么尝试将Capybara.default_max_wait_time提升到例如30秒(默认为2秒)。 fill_in应该开始工作了。

fill_in以及大多数其他Capybara方法是“同步的”,即它重试搜索字段直到默认的最大等待时间,并且只有在此时间之后找不到它,它才会失败

请参阅Capybara readme