当我抓取一个文本字段时,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'
答案 0 :(得分:2)
@bott的答案正确指出了fill_in
会使用一个定位符,它是您要填写的输入的名称,id或关联的标签文本,而不是元素或CSS选择器。另外,自Capybara 3.7.0起,您可以在可填充元素上调用fill_in
并跳过传递定位符(如文档中所述-“如果没有提供定位符,它将对自身或后代进行操作”)-会是
f.fill_in with: 'paprika'
顺便说一句,无需调用all(...).first
,因为如果您想要的只是第一个匹配元素,则有一个first
方法,但是在一般用法中,您实际上更希望返回的方法单个唯一元素(查找等),必要时使用作用域来确保唯一性,而不是all
和first
答案 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
变量,则在分配变量时没有任何意义。
它需要一个字符串,我不确定是否可以使用CSS
选择器。
您也可以使用find
和set
:
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