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

Protractor 定位器是否应该等待,这是否会导致片状测试?,protractor,Protractor,我们使用量角器测试JS应用程序,有时会得到一些随机不稳定的测试。有时错误失败:过时的元素引用:元素未附加到页面文档 这只是一种预感,但有时开发人员会这样编写代码 await element(await by.css('.pager-next')).click(); await element(by.css('.pager-next')).click(); 有时候像这样 await element(await by.css('.pager-next')).click(); await ele

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

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

await element(await by.css('.pager-next')).click();
await element(by.css('.pager-next')).click();
有时候像这样

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

这两个“更多”是正确的吗?是否需要内心的等待,或者这没有什么区别?这会导致过时的元素引用错误吗?

我认为更好的做法是不要像那样编写定位器。我会离开等待涉及元素的函数。 我会把定位器写成这样:

const myElement = element(by.css('.pager-next'));
然后在函数中使用async/await:

let clickMyElement = async function(){
   await myElement.click();
};

我认为更好的做法是不要像那样编写定位器。我会离开等待涉及元素的函数。 我会把定位器写成这样:

const myElement = element(by.css('.pager-next'));
然后在函数中使用async/await:

let clickMyElement = async function(){
   await myElement.click();
};

await
仅对返回
承诺的函数有用。在代码段中的三个函数中,只有一个返回
Promise
。(您可以检查它们各自返回的内容)

ElementFinder.click()
返回一个
Promise

element()
返回
ElementFinder

by.css()
返回一个
量角器定位器

因此,唯一应该包含
wait
的调用是
click()
,您在第二个代码段中正确地完成了该调用



StaleElementReferenceException
通常是在保留对已从页面中删除的对象的引用时引起的,例如使用
ElementFinder.getWebElement()
。这种去除有时很微妙。例如,Angular有时会不可见地从DOM中删除一个元素,并用外观相同的元素快速替换它。很难说有什么改变了,但是从Webdriver的角度来看,它引用的元素已经消失了。

wait
只对返回
承诺的函数有用。在代码段中的三个函数中,只有一个返回
Promise
。(您可以检查它们各自返回的内容)

ElementFinder.click()
返回一个
Promise

element()
返回
ElementFinder

by.css()
返回一个
量角器定位器

因此,唯一应该包含
wait
的调用是
click()
,您在第二个代码段中正确地完成了该调用



StaleElementReferenceException
通常是在保留对已从页面中删除的对象的引用时引起的,例如使用
ElementFinder.getWebElement()
。这种去除有时很微妙。例如,Angular有时会不可见地从DOM中删除一个元素,并用外观相同的元素快速替换它。很难说有什么变化,但从Webdriver的角度来看,它引用的元素已经消失了。

这比
wait元素(by.css('.pager next'))有什么好处呢。单击()?这比
等待元素(by.css('.pager next'))有什么好处呢