9

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

4

1 に答える 1

15

StaleElementReferenceErrorは、要素を保存し、別のページに移動した後にそれらにアクセスしようとしたときによく発生します。この場合、リンクをクリックして新しいページに移動すると、lisへの参照が古くなります。

最初に属性またはlisのインデックスを保存する必要があります。これにより、リンクをクリックした後、各liへの新しい参照を取得できます。

これを試して:

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
于 2012-08-03T01:28:53.983 に答える