【问题标题】:StaleElementReferenceError with Selenium with content already loadedSelenium 的 StaleElementReferenceError 已加载内容
【发布时间】:2012-08-26 13:02:23
【问题描述】:

我将 Capybara 与 Ruby 1.9.3 一起使用,并使用 selenium 驱动程序从网站获取信息。点击几个页面后,我访问了我想要的页面并输入:

 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。我知道该错误意味着找到的元素不是当前元素,但似乎所有元素都已加载,所以我不确定它们为什么不再存在。我已经在互联网上搜索了几个小时来寻找这个,并且希望从可能的解决方案中得到任何帮助,以尝试解决问题以及尝试解决问题的后续步骤。我可以提供任何需要的额外信息,请告诉我。

【问题讨论】:

    标签: ruby selenium capybara


    【解决方案1】:

    这是我最不喜欢的错误。我将向您推荐大约一年前Random "Element is no longer attached to the DOM" StaleElementReferenceException

    提出的关于堆栈溢出的确切问题

    【讨论】:

    • 这些答案没有帮助,因为我不是在等待一个元素,我只是想从已经加载的页面中删除所有 td 元素。这就是为什么我不知道该怎么做。
    • 重读我发给你的堆栈溢出错误;这会给你你遇到问题的原因。这是您收到的错误的定义:Error。等待 30 秒对您没有帮助。也许尝试隐式等待,或者修改您的代码以找到一个 td 元素,将其文本放下,然后移动到下一个 td。或者,如果您喜欢使用某种 html 解析器来查找您的信息。 Selenium 不是您想要做的事情的最佳工具。
    【解决方案2】:

    在呈现的代码中,您正在控制台上打印文本,但可能在您的真实代码中,您点击了each 循环内的这些链接,这是错误的。

    解决方案

    先尝试提取href属性,然后循环遍历它们。 代码:

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

    我不确定它是否适合您的情况,请在 cmets 中提供更多信息。

    【讨论】:

    • 那是我放在那里的真实代码。我不是想跟踪链接,只是从页面收集信息。
    • 可能执行了一些 javascript 并且没有您在上一步中收集的所有 td。为什么不尝试在每个方法中先收集 td.text?
    【解决方案3】:

    当您创建一个范围并更改页面时会发生这种情况,例如,但在其中不断进行断言,如下所示:

    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
    

    【讨论】:

    • 这为我解决了。它与within有关。
    • 这正是我的情况。测试试图等待模态在模态范围内关闭。断言基本上是没有意义的(总是错误的),但是如果模态关闭太快,该断言就会触发这个异常。一定是通过一些重构引入的。
    • 我在没有硒的情况下也遇到了同样的问题,只是使用 capybara:总是得到 Capybara::RackTest::Errors::StaleElementReferenceError。关闭范围解决了它。
    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多