selenium - 迭代并打开新的浏览器页面导致 StaleElementReferenceException

标签 selenium robotframework

我有一个非常简单的脚本,可以找到页面中的所有 HREF 并迭代并记录它:

Photo search scroll
    Go To   https://xxx
    ${elements}=    Get WebElements     xpath://a[contains(@href,'photo')]
    FOR    ${element}    IN    @{elements}
        Log    ${element.get_attribute('href')}
    END

它工作得很好。 因为我需要为每个 HREF 打开一个新的浏览器,所以我添加了 Selenium Browser 命令:

Photo search scroll
    Go To   https://xxx
    ${elements}=    Get WebElements     xpath://a[contains(@href,'photo')]
    FOR    ${element}    IN    @{elements}
        Log    ${element.get_attribute('href')}
        Go To      ${element.get_attribute('href')}
        sleep   2s
        Capture Page Screenshot
        Go Back
    END

我总是在第一次迭代后得到这个错误:

Resolving variable '${element.get_attribute('href')}' failed: StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=86.0.4240.111)

我无法弄清楚为什么会这样。 任何帮助/评论表示赞赏。 非常感谢

###更新 我创建了一个列表变量并添加了额外的循环:

@{hrefs} =  Create List
    FOR    ${element}    IN    @{elements}
        Log    ${element.get_attribute('href')}
        Append To List  ${hrefs}        ${element.get_attribute('href')}  
    END

    FOR     ${href}     IN      @{hrefs}
        Go To           ${href}
        sleep  2s
        Capture Page Screenshot
    END

现在我得到这个错误代码:

Opening url 'Create List'   
20:08:36.739    FAIL    InvalidArgumentException: Message: invalid argument
  (Session info: chrome=86.0.4240.111)

enter image description here

最佳答案

why this happens

因为当您调用 Get WebElements 时,您获得了对当前页面和 session 中对象的引用;浏览器还保留对当前 DOM 元素的相同引用。

当您转到另一个页面然后返回时,这对于浏览器来说是一个不同的页面。视觉上是一样的;它的html是一样的。
但是对于浏览器来说,这是一个不同于您开始的页面;它对其中元素的内部引用是不同的(它为您正在浏览的页面构建的“ map ”)。同时,您请求浏览器通过引用给您一个对象。但是浏览器没有它——那些对象对它的调用不一样,引用是不同的。你有一个陈旧的(过期的,无效的,旧的)引用,没有指向它在其“ map ”中的任何 DOM 对象。 StaleElementReferenceException :)

解决方案——在新标签页中打开目标链接;因此您的页面将不会刷新,并且引用将有效。 或者更好,获取所有链接,并在新循环中打开它们。

关于selenium - 迭代并打开新的浏览器页面导致 StaleElementReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66724210/

相关文章:

python-3.x - 在 RobotFramework 中截断 Post 请求的日志记录

java - 使用 selenium webdriver 打印所需的文本

python - Python-Behave 中屏幕截图的自定义错误处理程序

selenium - docker容器之间通信

security - 如何使用 Selenium 进行安全测试?

XML 解析器在机器人框架中不起作用

debugging - 在 IE Dev 工具中查找 xPath 类似于 Firebug 中的 $x(xPathString) 控制台功能

selenium - 如果单元格的 xpath 不匹配,如何忽略从单元格获取表格文本

python - 如何从 eclipse 执行 Robot 测试用例,它将命令行列表参数作为输入?

java - RobotFramework导入错误: No module named foo