2013-06-25 6 views
5

Wir verwenden Watir zum Testen und fragte uns, wie man eine Gruppe von Divs, die ein bestimmtes Kriterium erfüllen? In unserem Fall sieht der (vereinfacht) html wie folgt aus:Looping durch eine Sammlung von Divs in Watir

<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> 

Wir möchten durch alle divs Schleife mit einer ID mit ‚Monat‘ beginnend in month_cell Eltern divs enthalten sind, die auch Klassen von OverridenDay haben. Gibt es einen Xpath- oder regulären Ausdruck, den wir in Verbindung mit der Watir-Browser-Klasse verwenden können?

Antwort

10

Allgemeine

Sie können eine Sammlung von Elementen in einer ähnlichen Art und Weise erhalten, um ein einzelnes Element zu bekommen. Sie müssen die Elementartmethode grundsätzlich pluralieren. Beispiel:

#Singular method returns first matching div 
browser.div 

#Pluralized method returns all matching divs 
browser.divs 

Sammlungen können mit denselben Lokatoren wie einzelne Elemente verwendet werden.

Lösung

Für Ihr Problem, können Sie tun:

#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" 

Wenn Sie eine einzelne Sammlung erstellen, die alle die passenden divs enthält, müssen Sie eine CSS verwenden oder Xpath-Selektor

Mit einem CSS-Selektor (beachten Sie, dass in watir-WebDriver nur die Elemente Methode unterstützt 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" 
+0

Vielen Dank für diese sehr hilfreich. – larryq