2012-08-03 10 views
9

Sto provando a fare clic su tutti i collegamenti sul menu orizzontale stackoveflow (Domande, Tag, Utenti, Badge, senza risposta). Ho questo codice ma questo clicca sul primo link (questo link è Domande), quindi stampa 1, e dopo questo genera un errore. Quale potrebbe essere un problema con questo?Elemento non trovato nella cache - forse la pagina è cambiata da quando è stata cercata (Selenium :: WebDriver :: Errore :: StaleElementReferenceError)

require 'watir-webdriver' 

class Stackoverflow 
    def click_all_nav_links 
    b = Watir::Browser.new 
    b.goto "http://stackoverflow.com" 

    counter = 0 
    b.div(:id => 'hmenus').div(:class => 'nav mainnavs').ul.lis.each do |li| 
     li.a.click 
     puts counter += 1 
    end 
    end 
end 

stackoverflow = Stackoverflow.new 
stackoverflow.click_all_nav_links 

messaggio di errore è: https://gist.github.com/3242300

risposta

15

Lo StaleElementReferenceError si verifica spesso quando la memorizzazione di elementi e poi cercando di accedervi dopo essere andato a un'altra pagina. In questo caso, il riferimento alla lis diventa obsoleto dopo aver fatto clic sui collegamenti e navigare in una nuova pagina.

È necessario memorizzare prima gli attributi o l'indice della lis. Ciò ti consentirà di ottenere un nuovo riferimento a ciascun li dopo aver fatto clic su un link.

Prova questo:

class Stackoverflow 
    def click_all_nav_links 
     b = Watir::Browser.new 
     b.goto "http://stackoverflow.com" 

     #Store the text of each locate so that it can be located later 
     tabs = b.div(:id => 'hmenus').div(:class => 'nav mainnavs').ul.lis.collect{ |x| x.text } 

     #Iterate through the tabs, using a fresh reference each time 
     tabs.each do |x| 
      b.div(:id => 'hmenus').div(:class => 'nav mainnavs').ul.li(:text, x).a.click 
     end 
    end 
end 

stackoverflow = Stackoverflow.new 
stackoverflow.click_all_nav_links 
Problemi correlati