2013-06-25 18 views
5

Używamy watir do testowania i zastanawialiśmy się, jak wybrać grupę elementów div spełniających określone kryteria? W naszym przypadku (uproszczony) html wygląda następująco:Zapętlając kolekcję elementów div w 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> 

Chcielibyśmy pętli wszystkich div z id zaczynające się od „miesiąc”, które są zawarte w month_cell div dominujących, które również mają klasy OverridenDay. Czy istnieje Xpath lub wyrażenie regularne, które możemy użyć w połączeniu z klasą przeglądarki Watir, aby to zrobić?

Odpowiedz

10

Ogólne

Możesz otrzymać zbiór elementów w podobny sposób do uzyskania pojedynczego elementu. Zasadniczo potrzebujesz pluralizować metodę typu elementu. Na przykład:

#Singular method returns first matching div 
browser.div 

#Pluralized method returns all matching divs 
browser.divs 

Kolekcje mogą być używane przy użyciu tych samych lokalizatorów, co pojedyncze elementy.

Rozwiązanie

Dla Twojego problemu, można to zrobić:

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

Jeśli trzeba utworzyć jeden zbiór, który zawiera wszystkie div dopasowania, trzeba będzie użyć css lub selektor xpath.

Korzystanie z CSS-selektor (zauważ, że w Watir-webdriver, tylko metoda elementów obsługuje CSS-lokalizatory):

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

Korzystanie 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

Dzięki tak dużo za to bardzo pomocny. – larryq

Powiązane problemy