Capybara / CSS:如何按标签AND值查找输入字段?

时间:2016-10-27 10:12:20

标签: css capybara

我需要填写Capybara / RSpec中的输入字段。

<div class="form-group control_center_operators_name">    
  <label class="control-label"  
         for="control_center_operators_attributes_1477562669357_name">
    Name
  </label>       
  <input class="form-control"
       type="text" value=""          
       name="control_center[operators_attributes][1477562669357][name]" 
       id="control_center_operators_attributes_1477562669357_name" />
</div>

我的问题是,还有更多这样的字段,用户可以在其中编辑现有的运算符。 e.g。

<div class="form-group control_center_operators_name">    
  <label class="control-label"  
         for="control_center_operators_attributes_0_name">
    Name
  </label>
  <input class="form-control" 
         type="text" value="ABC"          
         name="control_center[operators_attributes][0][name]" 
         id="control_center_operators_attributes_0_name" />
</div>

我对该领域的了解:

  • 标有&#34;姓名&#34;
  • 它的价值是&#34;&#34; (空)

更多限制:

  • 此集合中共有4个字段(姓名,电话,电子邮件,主页),这意味着我无法使用value=''的字段,因为有4个输入字段与此查询匹配
  • 我无法使用id和name属性,如您所见。

如何使用Capybara / CSS填写空名称,电话,电子邮件和主页字段?

2 个答案:

答案 0 :(得分:6)

查找字段的Capybara方法是#find_field。您也可以使用:with选项

按值过滤
find_field('Name', with: '').set('new value to set')

请注意,它将与元素的当前值属性匹配,如果自页面加载后字段的值已更改,则该属性可能与value属性不同。另一种选择是将一个包装元素作为范围,使该字段唯一,然后在该元素中找到。例如,如果这些字段集中的每一个都在带有运算符类的div中,并且您想要在最后一个运算符集中填写名称,那么

all('.operator', minimum: 1).last.fill_in('Name', with: 'new value to set')

更新:截至Capybara 3 all默认有等待行为,因此不需要minimum选项

all('.operator').last.fill_in('Name', with: 'new value to set')

答案 1 :(得分:2)

您可以使用xPath查找所需的元素:

find(:xpath, "//label[contains(text(), 'Name')]/../input[@value='']")

如果你想使用css,你可以使用find_all方法查找所有空字段,然后逐个填写。

您也可以尝试:find_field('Name', with: '')。文档(Capybara Docs)说它看标签,但我怀疑它是否有效,因为标签是单独的元素。可能是因为它取决于html结构,至少这对我没用。