似乎Capybara无法通过该表单元素标签中的显示文本在页面上找到第一个表单元素。
然而, Capybara可以通过该标签的for
值找到第一个表单元素,这似乎很奇怪。我认为DOM尚未加载,而且Capybara可以持续搜索for
值但不会搜索labels
中显示的文字?
以下是我的相关表单元素:
所以我应该能够通过显示的标签文本抓住每个元素:
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已经完全加载了时间:
这是html:
然而,奇怪的是:当我更改第一个名字的填写时:
fill_in "First Name, with: "foo"
要:
fill_in "contact_first_name, with: "foo"
现在可以使用,但我不想使用for
的{{1}}值来获取该表单元素。我希望使用显示的标签文字,因为我可以使用contact_first_name
和Title
。
我错过了什么?为什么我不能使用"名字"抓住First Name表单元素?
更新:事实证明,如果我将Last Name
放在`fill_in" First Name"之前,用:" foo"然后它的作品!根据@TomWalpole的评论,似乎有一个javascript库正在阻碍?以下是我所包含的所有javascripts:
sleep 1
答案 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。