异常:过时的元素参考:元素未附加到页面文档
EXCEPTION: stale element reference: element is not attached to the page document
我的 HTML-页面包含(除其他外)这个位:
<ol id="links">
<li id="links_1"><a href="http://whosebug.com">Whosebug</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
Whosebug
el.Location
{X=56,Y=282}
我该如何解决这个问题?
(环境是 APL。我在这里省略了一些 APL 细节,因为我担心它们可能会从核心问题中避免“分心”)
在发帖前的研究中,我看到了问题 stale element reference: element is not attached to the page document 但它似乎不适用:
- 如图,我在做
FindElementById
,找到后马上访问。 DOM 没有变化,页面是静态的。
- 关于它不再是 DOM 的一部分的解释不适用:它已被发现,并且正如我试图展示的那样,我可以访问
Displayed
或 [=16= 等属性].
我也经历了reference,但是这个解释没有帮助。
此外,没有循环进行,页面也没有任何变化。非常简单:GoToUrl * Find * MoveToElement。
我删除了 chromedriver-tag,因为我可以用 Firefox 和 geckodriver 重现它。但是,对于 geckodriver,当我执行 MoveToElement
时,我得到“异常:以前未见过的 Web 元素引用:” - 但我可以执行 el.Click
并以与 [= 完全相同的方式访问其属性52=].
更新:一位同事对此进行了更深入的调查(超出了我的舒适区)并发现在抛出这个“陈旧异常”之前,有(我不确定如何正确地表达这一点以及它发生的确切位置)404 异常。我只知道 404 是一个 HTTP 状态代码——这就是它对我的意义。但显然浏览器没有被要求导航到任何地方,所以我不能与 HTTP404 相关。这是否会让更熟悉 WebDriver 内部结构的人有所耳闻?
这是一个复杂的多层次问题,但当我最终删除所有层时 - 它成功了!
导致此问题的关键因素:
- 由于我编写测试的方式错误导致它被执行了两次 - 而第二次 运行 总是暴露了问题。
- 我在测试框架中实例化了
ACTIONS
并且没有意识到一个关键特性:它不断构建一个动作链,任何 Build.Perform..-steps 只是添加到其中。解决方案:为每个 运行 创建单独的实例(可能,因为它相当轻量级)或调用 ACTIONS.Reset
(需要 WebDriver4)。我从来没有遇到过 WD4 的问题(尽管它仍处于 alpha 阶段)——但这给出了切换的最终理由!
我的 HTML-页面包含(除其他外)这个位:
<ol id="links">
<li id="links_1"><a href="http://whosebug.com">Whosebug</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
Whosebug
el.Location
{X=56,Y=282}
我该如何解决这个问题?
(环境是 APL。我在这里省略了一些 APL 细节,因为我担心它们可能会从核心问题中避免“分心”)
在发帖前的研究中,我看到了问题 stale element reference: element is not attached to the page document 但它似乎不适用:
- 如图,我在做
FindElementById
,找到后马上访问。 DOM 没有变化,页面是静态的。 - 关于它不再是 DOM 的一部分的解释不适用:它已被发现,并且正如我试图展示的那样,我可以访问
Displayed
或 [=16= 等属性].
我也经历了reference,但是这个解释没有帮助。
此外,没有循环进行,页面也没有任何变化。非常简单:GoToUrl * Find * MoveToElement。
我删除了 chromedriver-tag,因为我可以用 Firefox 和 geckodriver 重现它。但是,对于 geckodriver,当我执行 MoveToElement
时,我得到“异常:以前未见过的 Web 元素引用:” - 但我可以执行 el.Click
并以与 [= 完全相同的方式访问其属性52=].
更新:一位同事对此进行了更深入的调查(超出了我的舒适区)并发现在抛出这个“陈旧异常”之前,有(我不确定如何正确地表达这一点以及它发生的确切位置)404 异常。我只知道 404 是一个 HTTP 状态代码——这就是它对我的意义。但显然浏览器没有被要求导航到任何地方,所以我不能与 HTTP404 相关。这是否会让更熟悉 WebDriver 内部结构的人有所耳闻?
这是一个复杂的多层次问题,但当我最终删除所有层时 - 它成功了! 导致此问题的关键因素:
- 由于我编写测试的方式错误导致它被执行了两次 - 而第二次 运行 总是暴露了问题。
- 我在测试框架中实例化了
ACTIONS
并且没有意识到一个关键特性:它不断构建一个动作链,任何 Build.Perform..-steps 只是添加到其中。解决方案:为每个 运行 创建单独的实例(可能,因为它相当轻量级)或调用ACTIONS.Reset
(需要 WebDriver4)。我从来没有遇到过 WD4 的问题(尽管它仍处于 alpha 阶段)——但这给出了切换的最终理由!