Protractor 定位器是否应该等待,这是否会导致片状测试?
我们使用量角器测试JS应用程序,有时会得到一些随机不稳定的测试。有时错误失败:过时的元素引用:元素未附加到页面文档 这只是一种预感,但有时开发人员会这样编写代码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
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'))有什么好处呢代码>?