gpt4 book ai didi

selenium-webdriver - "Stale element reference"错误行为理解

转载 作者:行者123 更新时间:2023-12-04 07:52:21 25 4
gpt4 key购买 nike

代码 1:

element(by.id('myButtonId')).click();
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});

上面的代码多次运行良好,然后开始出现以下错误

"Failed: stale element reference: element is not attached to the page document"



这个 id 'myValidationSummaryId' 以前没有在任何地方使用过,单击按钮发布表单和服务端可用的成功/失败消息,在 'myValidationSummaryId' 中。

代码 2:
return element(by.id('myButtonId')).click().then(function () {
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
});

修复上面的代码修复了原始问题,并且它多次正常工作,但后来它开始随机失败并出现原始过时元素引用错误。

代码 3:
return element(by.id('myButtonId')).click().then(function () {
return element(by.id('myValidationSummaryId')).waitReady().then(function (isReady) {
if (isReady) {
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
} else {
return 'Failed to check success/failure message';
}
});
});

然后我修复了上面的代码,现在它一直正常工作, waitReady函数主动等待元素出现并显示到指定时间。

Protractor/WebdriverJS 不应该在 native 上很好地处理这个问题。

1> 你能解释一下为什么代码 1 和代码 2 有时有效有时失败吗?

2> 你认为代码 3 现在很好并且每次都可以工作吗?

元素“myValidationSummaryId”仅在单击后使用一次,因此如果页面未完全加载且元素尚不可用,则应显示“未找到元素”,但为什么会出现过时的元素引用?
我使用 pageLoadTimeout 作为 5 分钟,页面在几秒钟内加载。这是非 AngularJS 应用程序和 browser.ignoreSynchronization = true。

它到处都在谈论哪些代码可以修复它,但没有找到太多关于为什么这种行为以及为什么 WebdriverJS 本身无法处理它的信息。

最佳答案

我认为我们不确定为什么会发生这种情况,但您绝对不是一个人 (1) (2) .这可能是由于您的页面具体呈现的方式(例如您的应用程序/框架如何处理呈现 DOM 元素),或者只是 Selenium/驱动程序的事情。如果您对确切的解释感兴趣,那么使用 Protractor 错误报告系统可能会更好。

然而,一个很好的猜测可能是它与 Selenium defines stale element 的方式有关。 :

A less common, but still common cause is where a JS library has deleted an element and replaced it with one with the same ID or attributes



一些库可以让 Selenium 相信某个元素从 DOM 中消失了,但它实际上只是在瞬间被替换了。在单击和元素被放置在 DOM 中(基本上是竞争条件)之间添加一个紧凑、脆弱的时间——这可能是原因。您可能有兴趣阅读更多相关信息 here .

无论如何,如果您遇到此类问题,我建议您使用 browser.wait 和 Expected Conditions .

预期条件基本上是返回 true 或 false 的函数,您可以指定一个超时,如果在那段时间内没有返回 true,则将导致测试失败 - 您可以在 similar question 中看到它是如何使用的。 .

基本上,你可能想这样做:
var EC = protractor.ExpectedConditions;
var summaryId = element(by.id('myValidationSummaryId'));

browser.wait(EC.presenceOf(summaryId), 5000);
//rest of your code

关于selenium-webdriver - "Stale element reference"错误行为理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31792232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com