我们正在用量角器测试JS应用,有时我们会得到一些随机不稳定的测试。有时错误是失败的:过时的元素引用:元素未附加到页面文档
只是预感,但有时开发人员会这样编写代码
await element(await by.css('.pager-next')).click();
有时是这样的
await element(by.css('.pager-next')).click();
这些“更多”是否正确?是否需要内部等待或没有什么不同?这会导致过时的元素引用错误吗?
答案 0 :(得分:3)
await
仅对返回Promise
的函数有用。代码段中的三个函数中,只有一个返回Promise
。 (您可以检查它们每个都返回in the Protractor api)。
ElementFinder.click()
返回一个Promise
。
element()
返回一个ElementFinder
。
by.css()
返回一个ProtractorLocator
。
因此,唯一应带有await
的呼叫是click()
,您在第二个代码段中已正确完成此呼叫。
StaleElementReferenceException
通常是由于您保留对已从页面中删除的对象的引用而引起的,例如使用ElementFinder.getWebElement()
。有时这种移除可能很微妙。例如,Angular有时会无形中从DOM中删除一个元素,并迅速将其替换为外观相同的元素。很难说一切都改变了,但是从Webdriver的角度来看,它所引用的元素已经消失了。
答案 1 :(得分:1)
我认为更好的做法是不要这样写定位符。我将等待涉及该元素的功能。 我将有一个这样写的定位器:
const myElement = element(by.css('.pager-next'));
然后在函数中使用async / await:
let clickMyElement = async function(){
await myElement.click();
};