2013-06-25 15 views
5

Stiamo utilizzando watir per i test e ci chiediamo come selezionare un gruppo di div che soddisfano un particolare criterio? Nel nostro caso la (semplificato) html si presenta così:looping attraverso una raccolta di div 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> 

Vorremmo scorrere tutti i div con un ID che iniziano con 'mese' che sono contenute in month_cell div genitori che hanno anche classi di OverridenDay. Esiste un Xpath o un'espressione regolare che possiamo usare insieme alla classe del browser Watir per fare ciò?

risposta

10

generale

È possibile ottenere un insieme di elementi in un modo simile a ottenere un singolo elemento. Fondamentalmente hai bisogno di pluralizzare il metodo del tipo di elemento. Ad esempio:

#Singular method returns first matching div 
browser.div 

#Pluralized method returns all matching divs 
browser.divs 

Le raccolte possono essere utilizzate utilizzando gli stessi locatori dei singoli elementi.

Soluzione

per il vostro problema, si può fare:

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

Se è necessario creare una singola collezione che include tutti i div di corrispondenza, è necessario utilizzare un CSS o selettore xpath.

Utilizzando una css-selettore (si noti che in watir-WebDriver, solo il metodo elementi supporta css-localizzatori):

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

Uso 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

Grazie tanto per questo, molto utile. – larryq

Problemi correlati