1

カピバラのフレームに問題があります。1 つのフレームに切り替えて、Football をクリックしてから、そのカテゴリのすべてのリンクをクリックしますが、2 つのリンクだけがクリックされた後、この要素が現在のフレームにないというメッセージでエラーが発生します。

require 'rubygems'
require 'capybara'
require 'capybara/dsl'

Capybara.run_server = false
Capybara.current_driver = :selenium
Capybara.default_wait_time = 5
Capybara.app_host = 'http://sports.sbobet.com'

module MyCapybaraTest
  class Test
    include Capybara::DSL
    def test
      visit('/')
      page.driver.browser.switch_to.frame 'leftFrame'

      wait_until {page.find('table span.SportName').visible?}
      page.all('table span.SportName').each do |span|
        if (span.text == 'Football')
          span.click
          page.all('div#MarketTbl span.LMenuLeft a').each do |a|
            puts a[:href]
            a.click
            sleep 3
          end
        end
      end

    end
  end
end

t = MyCapybaraTest::Test.new
t.test

詳細なエラーは次のとおりです: https://gist.github.com/3252149

削除すると正しく実行されるため、何が問題なのかわかりませんsleep 3

4

1 に答える 1

1

これSelenium::WebDriver::Error::StaleElementReferenceErrorは、メソッドを呼び出している Selenium 要素オブジェクトを見つけるために使用されるセレクターと一致する DOM 要素が現在のページにあることを意味しますが、それは同じ DOM 要素ではありません。

あなたの場合、一連のページに共通するいくつかのナビゲーション リンクを操作しているようです。たとえば、page.all('div#MarketTbl span.LMenuLeft a')3 つのリンクが返され、これらの 3 つのリンクがそれぞれのリンクから到達するすべてのページに存在する場合、ループ内に がなければsleep、ページが実際に変更される前に最初の 2 つのリンクがクリックされている可能性があります。

sleepループ内で 2 番目がa.click呼び出されると、aオブジェクトは最初のページで見つかりましたが、2 番目のページの読み込みに時間がかかったため、オブジェクトが表すリンクは別の物理 DOM ノードになります。

ループを取り出して、各リンクを個別に見つけてクリックしてみます。

また、#allは Capybara のwait_until機能を使用しないため、遅いアプリケーションでは直感的でない動作をする可能性があることに注意してください。

于 2012-08-04T13:09:12.013 に答える