水豚为什么不填写我的文本字段?

时间:2018-12-12 14:59:43

标签: ruby forms capybara

当我抓取一个文本字段时,fill_in不起作用。它说即使它似乎知道它是一个字段并且似乎知道它的价值,也找不到该字段?我在这里做什么错了?

f = page.all('input[type=text]').first
f
=> #<Capybara::Node::Element tag="input" path="/html/body/form/ol/li[1]/input">
f.value
=> "parsley"
fill_in f, with: 'paprika'
Capybara::ElementNotFound: Unable to find field #<Capybara::Node::Element tag="input" path="/html/body/form/ol/li[1]/input">
from /Users/test/.rvm/gems/ruby-2.3.3/gems/capybara-3.12.0/lib/capybara/node/finders.rb:301:in `block in synced_resolve'

3 个答案:

答案 0 :(得分:2)

@bott的答案正确指出了fill_in会使用一个定位符,它是您要填写的输入的名称,id或关联的标签文本,而不是元素或CSS选择器。另外,自Capybara 3.7.0起,您可以在可填充元素上调用fill_in并跳过传递定位符(如文档中所述-“如果没有提供定位符,它将对自身或后代进行操作”)-会是

f.fill_in with: 'paprika'

顺便说一句,无需调用all(...).first,因为如果您想要的只是第一个匹配元素,则有一个first方法,但是在一般用法中,您实际上更希望返回的方法单个唯一元素(查找等),必要时使用作用域来确保唯一性,而不是allfirst

答案 1 :(得分:0)

fill_in使用定位符,而不是元素,您正在使用“ f”,但它是元素。文件参考 https://www.rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Actions#fill_in-instance_method

  

fill_in([locator],with:,** options)

答案 2 :(得分:0)

如果您在f之后不再使用fill_in变量,则在分配变量时没有任何意义。

看看fill_inhttps://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions#fill_in-instance_method

它需要一个字符串,我不确定是否可以使用CSS选择器。

您也可以使用findset

find('#my_container_id #id_of_first_input').set 'capybara'
find('#my_container_id #id_of_datetime_input').set I18n.l(Time.now, format: '%d-%m-%Y, %H:%M')

find('input[type=text]').set 'foo'也应该工作,因为find接受任何有效的CSS,请参阅:https://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Finders#find-instance_method

奖金,以备不时之需:如果有下拉菜单,您可以这样做:find('#my_container_id #my_dropdown_id').find("option[value='#{factory2.id}']").select_option

相关问题