10

Webサイトから情報を取得するために、セレンドライバーを使用してRuby 1.9.3でカピバラを使用しています。いくつかのページをクリックした後、目的のページにアクセスして、次のように入力します。

 all(:css, 'td').each { |td| a_info << td }
 a_info.each {|t| puts t.text }

約10秒待った後に発生するエラー:

[remote server] resource://fxdriver/modules/web_element_cache.js:5628:in `unknown': Element not found in the cache - perhaps the page has changed since it was looked up (Selenium::WebDriver::Error::StaleElementReferenceError)

さらに多くのリモートサーバーエラーが発生しました。ページに 10 ~ 30 秒のスリープ時間を与えましたが、まだ読み込まれておらず、page.html を印刷すると、javascript スクリプトが表示され、情報を取得しようとしているすべての td が表示されます。エラーは、見つかった要素が現在のものではないことを意味することは知っていますが、すべての要素が既に読み込まれているように見えるので、なぜそれらがもう存在しないのかわかりません。私はこれを探して何時間もインターネットを探し回りましたが、試してみるべき可能な解決策とそれを理解しようとするための次のステップから、あらゆる種類の助けを求めています. 必要な追加情報を提供できます。お知らせください。

4

3 に答える 3

15

たとえば、スコープを作成してページを変更すると発生しますが、次のようにその内部でアサーションを作成し続けます。

within 'selector' do
  expect(page).to have_link 'Link'

  visit 'page'

  expect(page).to have_link 'I do not know this whitin, I am stale.'

  find('I do not know this within, I am stale.').click
end

古いスコープで作業を続けるには、もう一度スコープを再度開くだけです。

within 'selector' do
  expect(page).to have_link 'Link'
end

visit 'page'

within 'selector' do
  expect(page).to have_link 'Now i am fresh'

  find('#now-i-am-fresh').click
end
于 2016-05-15T22:23:05.907 に答える
5

これは私の最も嫌いなエラーです。Random "Element is no longer attached to the DOM" StaleElementReferenceException の約 1 年前に尋ねられた、スタック オーバーフローに関するこの正確な質問を紹介します。

于 2012-09-01T04:13:46.300 に答える
0

提示されたコードでは、コンソールにテキストを出力していますが、実際のコードeachでは、間違っているループ内のこれらのリンクをクリックしている可能性があります。

解決

最初に href 属性を抽出してから、それらをループで調べてみてください。コード:

a_href = a_node.collect {|a| a[:href] }
a_href.each { |a| visit(a) }

それがあなたの状況に当てはまるかどうかはわかりませんが、コメントで詳細情報を提供してください。

于 2012-09-01T17:01:06.240 に答える