Capybara - 应用has_xpath的用法?在变异的途中

时间:2018-01-08 02:17:49

标签: capybara

有如下结构:

<div class="parent">
  <div>
    <div class="fieldRow">...</div>
  </div>
  <div>
    <div class="fieldRow">
      <div class="CheckBox">
    </div>
  </div>
  <div>
    <div class="fieldRow">...</div>
  </div>
  <div>
    <div class="fieldRow">...</div>
  </div>
</div>

在我的剧本中,我正在为div [@class =&#39; parent&#39;]下的4个div中的每一个写一个循环,并且如果有,则点击复选框,即 members = page.all(:xpath,&#39; // div [@class =&#39; parent&#39;])

members.each do |a|
  if **page.has_xpath?(a).find(:xpath, "div[@class='fieldRow']/div[@class='CheckBox']")**
    a.find(:xpath, "div[@class='fieldRow']/div[@class='CheckBox']").click
  end
end

但是,我无法找到has_xpath的正确用法?使用xpath包含变量。 请指教?谢谢!

1 个答案:

答案 0 :(得分:0)

has_xpath?接受XPath表达式(不是元素)并根据当前作用域内是否存在与该表达式匹配的元素 - http://www.rubydoc.info/gems/capybara/Capybara/Node/Matchers#has_xpath%3F-instance_method返回布尔值(true / false)。由于它返回true / false,因此您无法在其上调用find。对于您发布的示例,不需要XPath或检查元素是否存在,只需找到所有匹配的元素并调用它们即可。像

这样的东西
page.all('div.parent div.fieldRow div.Checkbox').each { |cb| cb.click }

page.all('div.parent div.Checkbox').each { |cb| cb.click }

如果fieldRow类不是您真正需要检查的内容。

注意:这假设单击元素不会使任何其他匹配的元素无效/更改页面。

如果您真的需要使用整个members并使用XPath进行循环,并检查是否存在,那么它将类似于

members = page.all(:xpath, './/div[@class='parent'])
members.each do |a|
  if a.has_xpath?(:xpath, ".//div[@class='fieldRow']/div[@class='CheckBox']")
    a.find(:xpath, ".//div[@class='fieldRow']/div[@class='CheckBox']").click
  end
end

注意:需要在XPath表达式开头的.//才能使作用域正常工作 - 请参阅https://github.com/teamcapybara/capybara#beware-the-xpath--trap - 这是使用CSS选择器没有的问题,所以你应该更喜欢尽可能使用CSS选择器。