Элемент не найден в кэше-возможно, страница изменилась с момента ее поиска (Selenium:: WebDriver:: Error::StaleElementReferenceError)

Я пытаюсь щелкнуть все ссылки в горизонтальном меню stackoveflow (вопросы, Теги, пользователи, значки, без ответа). У меня есть этот код, но это нажимает на первую ссылку (эта ссылка-вопросы), затем печатает 1, и после этого возникает ошибка. Какие могут быть проблемы?

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

сообщение об ошибке: https://gist.github.com/3242300

1 ответов


StaleElementReferenceError часто возникает при хранении элементов, а затем пытается получить к ним доступ после перехода на другую страницу. В этом случае ссылка на lis становится устаревшей после щелчка по ссылкам и перехода на новую страницу.

сначала вы должны сохранить атрибуты или индекс lis. Это позволит вам получить новую ссылку на каждый ли после нажатия на ссылку.

попробуйте это:

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