循环遍历Watir中的div集合

时间:2013-06-25 20:07:45

标签: xpath watir

我们正在使用watir进行测试,并想知道如何选择符合特定条件的一组div?在我们的例子中,(简化的)html看起来像这样:

<div class="month_main>
 <div class="month_cell">
   some divs
 </div>
 <div class="month_cell">
   some_other_divs
 </div>
 <div class = "month_cell OverridenDay">
   <div id = "month-2013-05-04"/>
 </div>
</div>

我们希望遍历所有包含在month_cell父div中的id为'month'的div,这些div也包含OverridenDay类。是否有我们可以与Watir浏览器类一起使用的Xpath或正则表达式来执行此操作?

1 个答案:

答案 0 :(得分:12)

常规

您可以通过与获取单个元素类似的方式获取元素集合。您基本上需要复数元素类型方法。例如:

#Singular method returns first matching div
browser.div

#Pluralized method returns all matching divs
browser.divs

可以使用与单个元素相同的定位符来使用集合。

<强>解决方案

对于您的问题,您可以这样做:

#Iterate over divs that have the class 'month_cell OverridenDay'
browser.divs(:class => 'month_cell OverridenDay').each do |overridden_div|

    #Within each div with class 'month_cell OverridenDay',
    #  iterate over any children divs where the id starts with month
    overridden_div.divs(:id => /^month/).each do |div|

        #Do something with the div that has id starting with month
        puts div.id

    end
end
#=> "month-2013-05-0"

如果您需要创建包含所有匹配div的单个集合,则需要使用css或xpath选择器。

使用css-selector(注意在watir-webdriver中,只有elements方法支持css-locators):

divs = browser.elements(:css => 'div.month_cell.OverridenDay div[id^=month]')
divs.each do |e|
    puts e.id
end 
#=> "month-2013-05-0"

使用xpath:

divs = browser.divs(:xpath => '//div[@class="month_cell OverridenDay"]//div[starts-with(@id, "month")]')
divs.each do |e|
    puts e.id
end
#=> "month-2013-05-0"