2012-08-03 15 views
9

Estoy intentando hacer clic en todos los enlaces en el menú horizontal de stackoveflow (Preguntas, Etiquetas, Usuarios, Insignias, sin respuesta). Tengo este código pero hace clic en el primer enlace (este enlace es Preguntas), luego imprime 1, y luego de eso se produce un error. ¿Qué podría ser un problema con esto?Elemento no encontrado en la caché: quizás la página ha cambiado desde que se buscó (Selenium :: WebDriver :: Error :: 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 

mensaje de error es: https://gist.github.com/3242300

Respuesta

15

El StaleElementReferenceError ocurre a menudo cuando el almacenamiento de elementos y luego tratar de acceder a ellos después de ir a otra página. En este caso, la referencia a la lis se vuelve obsoleta después de hacer clic en los enlaces y navegar a una nueva página.

Primero tiene que almacenar los atributos o el índice de la lista. Esto le permitirá obtener una nueva referencia a cada li después de hacer clic en un enlace.

Prueba esto:

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