代码1:
element(by.id('myButtonId')).click();
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});上面的代码多次运行良好,然后开始出现以下错误。
“失败:陈旧元素引用:元素未附加到页面文档”
这个id 'myValidationSummaryId‘不是以前使用的地方,单击'myValidationSummaryId’中服务端提供的按钮posts表单和成功/失败消息。
代码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函数积极地等待一个元素出现并显示到指定的时间。
不应该量角器/WebdriverJS应该能够很好地处理这个问题。
1>,你能解释一下为什么代码1和代码2有时起作用,有时失败吗?
2>,你认为代码3现在很好,每次都能工作吗?
元素'myValidationSummaryId‘只使用一次,单击后使用,所以如果页面没有完全加载,如果元素尚未可用,应该说没有找到元素,但为什么是陈旧的元素引用?我已经使用pageLoadTimeout作为5分钟,页面在几秒钟内加载。这是非AngularJS应用程序和browser.ignoreSynchronization = true。
在任何地方,它都谈到了什么代码可以修复它,但在为什么这种行为以及为什么WebdriverJS本身不能处理它的问题上找不到多少。
发布于 2015-08-03 19:32:31
我认为我们不能确定为什么会发生这种情况,但你绝对不是唯一的(1) (2)。这可能是由于页面被具体呈现的方式(例如,应用程序/框架处理DOM元素的方式),或者仅仅是Selenium/driver的问题。如果您对精确的解释感兴趣,那么如果使用Protractor错误报告系统,您可能会有更好的运气。
然而,一个很好的猜测可能是它与Selenium 定义陈腐元素的方式有关。
一个不太常见但仍然很常见的原因是JS库删除了一个元素,并将其替换为一个具有相同ID或属性的元素。
有些库可以骗过Selenium,让它相信元素已经从DOM中消失了,但它实际上是在瞬间被替换的。添加一个紧的,脆弱的时间点之间的点击和元素被放置在DOM (基本竞争条件)-这可能是原因。您可能对阅读更多关于它的内容感兴趣,这里。
无论如何,如果您有这样的问题,我建议您使用browser.wait和预期条件。
预期条件基本上是返回true或false的函数,您可以指定一个超时,如果在这段时间内不返回true,则会导致测试失败--您可以看到它是如何在相似问题中使用的。
基本上,你可能会想这样做:
var EC = protractor.ExpectedConditions;
var summaryId = element(by.id('myValidationSummaryId'));
browser.wait(EC.presenceOf(summaryId), 5000);
//rest of your code发布于 2020-02-25 05:05:03
我可以通过增加睡眠来解决这个问题。给定用户在"xxx“页面上,当用户单击"431511”站点,用户单击"DisplayMenu“和用户单击"Create”时,则显示CREATE表单。
When('User clicks on {string}',async (string)=>{
if(string==="DisplayMenu"){
**await browser.sleep(3000);**
await TMS.displayMenu.click();}
else if (string==="CreateDevice"){
await TMS.createDevice.click();
}https://stackoverflow.com/questions/31792232
复制相似问题