Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 水豚在发现和填充第一个表单元素时有困难_Ruby On Rails_Ruby_Rspec_Capybara_Rspec Rails - Fatal编程技术网

Ruby on rails 水豚在发现和填充第一个表单元素时有困难

Ruby on rails 水豚在发现和填充第一个表单元素时有困难,ruby-on-rails,ruby,rspec,capybara,rspec-rails,Ruby On Rails,Ruby,Rspec,Capybara,Rspec Rails,通过在表单元素标签中显示的文本,Capybara似乎无法找到页面上的第一个表单元素 然而,水豚可以通过标签的for值找到第一个表单元素,这看起来很奇怪。我认为DOM还没有加载,Capybara可以连续搜索中的值,但不能搜索标签中显示的文本 以下是我的相关表单元素的外观: 因此,我应该能够通过显示的标签文本抓住这些元素中的每一个,方法是: fill_in "First Name", with: "foo" fill_in "Last Name", with: "bar" fill_in "Tit

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

然而,水豚可以通过标签的
for
值找到第一个表单元素,这看起来很奇怪。我认为DOM还没有加载,Capybara可以连续搜索
中的
值,但不能搜索
标签中显示的文本

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

因此,我应该能够通过显示的标签文本抓住这些元素中的每一个,方法是:

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
它找不到
名字
表单元素,因此没有填充它。它可以找到lastname元素和Title元素,因为我假设DOM在那时已完全加载:

这是html:

然而,奇怪的是:当我把名字的填写改为:

fill_in "First Name, with: "foo"
致:

它现在可以工作了,但我不想使用
contact\u first\u name
for
值来获取表单元素。我想将显示的标签文本与
标题
姓氏
一起使用

我错过了什么?为什么我不能使用“firstname”来获取firstname表单元素

更新:事实证明,如果我把
sleep 1
放在“First Name”之前,加上“foo”,那么它就工作了!根据@TomWalpole在下面的评论,似乎有一个javascript库挡住了去路?下面是我包含的所有Java脚本:

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require twitter/typeahead.min
//= require nested_form_fields

如果页面加载速度较慢,特别是涉及一些Javascript和/或CSS动画,则尝试将
Capybara.default\u max\u wait\u time
提高到例如30秒(默认值为2秒)。而
填充
应该开始工作

fill_in
和大多数其他水豚方法都是“同步”的,即在默认的最大等待时间内,它会重试搜索字段,只有在这段时间后没有找到字段,它才会失败


请参阅。

水豚实际上正在查找输入并填充它,但随后该值被删除。这是因为您有一些JS库,在Capybara填充元素之后,它正在向输入添加功能/行为。一旦JS增加了输入,它就会将其值重置为inputs value属性(与已更改的value属性相反),最终将其设置回空白。在第一次填充之前睡觉是一种解决方法,而不是说它意味着在调用填充之前要弄清楚元素上运行的是什么JS,并等待可检测的更改(如果有)。

不幸的是,问题似乎不是等待时间。很明显,Capybara无法通过标签中显示的文本找到表单上的第一个元素。我找到的唯一解决方法是显示标签的
属性值。因此,对于名字,它将从:
填写“名字”,加上:“foo”
,改为:
填写“联系人的名字”,加上:“foo”
。不管怎样,还是用身份证给我比较好。但让我来做最后一个疯狂的猜测:如果你搜索“*名字”,这个领域会被找到吗?我知道星号是在CSS中定义的,而不是HTML,但仍然。。。您可以使用以下命令打印所有标签的文本:
put page.all('label').map(&:text)。在测试中检查
。也许你会发现水豚对标签的看法不同。谢谢你的提示。它带着这个
“[\“名字\”,“姓氏\”]”
返回。我不认为这对我有帮助,但很高兴知道它的存在。你用的是什么驱动程序?你到底犯了什么错误?@TomWalpole我一直在尝试selenium和webkit。该错误只是我的验证错误,即名字不能为空。这样做是因为在capybara提交页面后:提交无效,因为capybara没有提交名字。好吧——这告诉我,capybara实际上正在查找元素并填充它,否则会引发ElementNotFound错误。最有可能的原因是某种JS库(验证?)在capybara实际填充字段并最终清除capybara放入的内容后增加输入并运行,你可以通过在第一次填写前放置一个
sleep 10
来测试这一点——如果是这样的话,那么我们需要找出它对可检测页面的任何库所做的更改,并在填写之前等待in@TomWalpole哇,好吧,就像你建议的那样,我把
sleep 5
放在
填写“First Name”之前,有了“foo”,它就成功了!您能否再次解释一下,为什么在填写第一个表单元素之前放入
sleep 5`会使capybara正确地填写第一个表单元素?因为您有一些JS库正在向输入添加功能/行为。Capybara正在查找元素并在运行的JS将其功能添加到输入之前填充它。一旦JS增加了输入,它就会将其值重置为inputs value属性(与已更改的value属性相反),最终将其设置回空白。您在页面上使用了哪些库?我对Rails 5和Turbolinks 5有完全相同的问题,使用capybara webkit 1.11进行测试。当我启用TurboLink时,密码重置页面上的电子邮件字段的填充不再可靠,这是非常重要的unfortunate@cseelus您需要查看附加到该字段的JS小部件,看看它们是否添加了类、数据属性、,或者对字段进行任何其他可检测的更改,然后等待该更改存在,然后调用fill_inThanks以获得快速回复。我看了单独的stackoverflow聊天光盘
//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require twitter/typeahead.min
//= require nested_form_fields