有如下结构:
<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包含变量。 请指教?谢谢!
答案 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选择器。