10

我使用 Selenium 驱动程序将 Capybara 与 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

这是我最不喜欢的错误。我将向您推荐这个关于堆栈溢出的确切问题,大约一年前随机“元素不再附加到 DOM”StaleElementReferenceException

于 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 回答