selenium - 例外:过时的元素引用:元素未附加到页面文档
问题描述
我的 HTML 页面包含(除其他外)这一点:
<ol id="links">
<li id="links_1"><a href="http://stackoverflow.com">stackoverflow</a></li>
</ol>
在我测试页面的代码中,然后我执行以下操作:
el←FindElementById'links_1'
(ACTIONS.MoveToElement el).Build.Perform
这崩溃了
EXCEPTION: stale element reference: element is not attached to the page document
(Session info: chrome=81.0.4044.129)
但是,这个错误似乎没有道理,因为该元素仍然存在:
el.Displayed
1
el.Text
stackoverflow
el.Location
{X=56,Y=282}
我该如何解决这个问题?
(环境是 APL。我在这里省略了一些 APL 细节,因为我担心它们可能会避免核心问题的“分心”)
在发布之前的研究期间,我看到了问题stale element reference: element is not attach to the page document但它似乎并不适用:
- 如图所示,我正在执行
FindElementById
并在找到它后立即访问它。DOM 没有改变,页面是静态的。 - 关于它不再是 DOM 的一部分的解释不适用:它被发现了,并且正如我试图展示的那样,我可以访问诸如
Displayed
or之类的属性Text
。
我也浏览了参考资料,但这种解释没有帮助。
此外,没有循环进行,也没有改变页面。这真的很简单:GoToUrl * Find * MoveToElement。
我删除了 chromedriver-tag,因为我可以使用 Firefox 和 geckodriver 重现它。但是,使用 geckodriver,当我这样做时,我得到“例外:以前未见过的 Web 元素引用:” MoveToElement
- 但我可以el.Click
以与 Chrome 完全相同的方式执行和访问其属性。
更新:一位同事对此进行了更深入的调查(超出了我的舒适区),发现在抛出这个“陈旧的异常”之前,有一个(我不知道如何正确措辞以及它发生在哪里)一个 404 异常。我只知道 404 是一个 HTTP 状态码——这对我来说就是如此。但显然浏览器没有被要求在任何地方导航,所以我不能与 HTTP404 相关。这是否会为更熟悉 WebDriver 内部的人敲响警钟?
解决方案
这是一个复杂且多层次的问题,但当我最终移除所有层时 - 它奏效了!导致此问题的关键因素:
- 由于我编写测试的方式有问题,导致它被执行了两次——第二次运行总是暴露出问题。
- 我已经在测试框架中进行了实例化
ACTIONS
,但没有意识到一个关键特性:它不断地构建一个动作链,任何 Build.Perform..-steps 只是添加到其中。解决方案:为每次运行创建单独的实例(可能,因为它相当轻量级)或调用ACTIONS.Reset
(需要 WebDriver4)。我从来没有遇到过 WD4 的问题(尽管它仍处于 alpha 阶段)——但这给了切换的最终理由!
推荐阅读
- ruby - Twilio 等待响应,我不希望服务器响应
- java - 获取要在 ListView 中显示的 ArrayList 字符串编号/位置
- scala - 基于连接期间值的数据框列子字符串
- php - 值没有进入vue js的下拉框中
- python - 如何查看 google pub/sub 何时完成
- multithreading - [C++,windows窗体]如何让主线程等待被调用线程完成?
- excel - VBA中变量的所有迭代的总和
- java - 在java中使用三个线程打印111222333
- php - Change style.css by changing language in php
- java - 如何将 n-Queens 问题扩展到三个维度?