定位器是否应该等待,这是否会导致片状测试?

时间:2019-03-21 17:40:20

标签: protractor

我们正在用量角器测试JS应用,有时我们会得到一些随机不稳定的测试。有时错误是失败的:过时的元素引用:元素未附加到页面文档

只是预感,但有时开发人员会这样编写代码

await element(await by.css('.pager-next')).click();

有时是这样的

await element(by.css('.pager-next')).click();

这些“更多”是否正确?是否需要内部等待或没有什么不同?这会导致过时的元素引用错误吗?

2 个答案:

答案 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();
};