代码1:
element(by.id('myButtonId')).click();
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
上面的代码工作很多次,然后开始给出以下错误
"失败:陈旧元素引用:元素未附加到页面 文件"
此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函数主动等待元素存在并显示到指定的时间。
不应该是量角器/ WebdriverJS应该能够很好地处理这个问题。
1>你能解释为什么Code 1和Code 2有时会工作并且有时会失败吗?
2 - ;你觉得Code 3现在还好吗,并且每次都有效吗?
元素' myValidationSummaryId'只使用一次,然后单击,如果页面没有完全加载,如果元素尚未可用,它应该说没有找到元素,但为什么陈旧的元素引用? 我使用pageLoadTimeout作为5分钟,页面加载几秒钟。这是非AngularJS应用程序和browser.ignoreSynchronization = true。
到处讨论什么代码可以修复它但却没有发现为什么会出现这种行为以及为什么WebdriverJS本身无法处理它。
答案 0 :(得分:9)
我认为我们无法确定为什么会发生这种情况,但你绝对不会孤单(1) (2)。这可能是由于您的页面具体呈现的方式(例如,您的应用程序/框架如何处理呈现DOM元素),或仅仅是Selenium /驱动程序。如果您对确切的解释感兴趣,如果使用Protractor错误报告系统,您可能会有更好的运气。
然而,一个好的猜测可能是它与Selenium defines stale element的方式有关:
一个不常见但仍然常见的原因是JS库所具有的 删除了一个元素并将其替换为具有相同ID或的元素 属性
有些库可以欺骗Selenium相信一个元素已经从DOM中消失了,但它实际上只是在瞬间被替换了。在点击和放置在DOM中的元素(基本上是竞争条件)之间添加一个紧密,脆弱的时间 - 这可能是原因。您可能有兴趣阅读更多关于here的信息。
无论如何,如果您遇到此类问题,我建议您使用browser.wait和Expected Conditions。
预期条件基本上是返回true或false的函数,如果在那段时间内未返回true,则可以指定导致测试失败的超时 - 您可以看到它在similar question中的使用方式。 / p>
基本上,您可能希望这样做:
var EC = protractor.ExpectedConditions;
var summaryId = element(by.id('myValidationSummaryId'));
browser.wait(EC.presenceOf(summaryId), 5000);
//rest of your code
答案 1 :(得分:0)
通过添加睡眠,我能够解决此问题。给定用户位于“ xxx”页面上,当用户单击“ 431511”站点,然后单击“ DisplayMenu”,然后单击“创建设备”时,将显示“创建设备”表单。
"CustomPrice":0.07
"CustomPrice":10.00
"CustomPrice": 40.30