我正在为Web应用程序编写Webdriver自动化。我有一个看起来像这样的测试:
it('has five items', async function(done) {
try {
await driver.wait(until.elementLocated(By.className('item-class')),5000);
const items = await driver.findElements(By.className('item-class'));
expect(items.length).toBe(5);
done();
}
catch(err) {
console.log(err)
}
}
此测试将通过大约2/3的时间,但有时会失败:
Expected 0 to be 5.
我认为应该没有办法得到这个回应,因为第一行应该让它等到其中一些项存在。我可以理解"预期1等于5的结果。",在一个项目被添加到页面的情况下,其余的测试在它们全部存在之前完成,但达到了预期()调用页面上的0项对我来说没有意义。
然后,问题是:
1)我缺少什么/不理解,这样的结果实际上是可能的? 2)我应该使用不同的构造/方法让它等到预期的项目在页面上吗?
答案 0 :(得分:2)
我查看了源代码,elementLocatedBy
使用了findElements
,请参阅here。并且findElements
可以在超时后返回一个空元素数组,因此预期0
(今天学到了新的东西)。
您可以编写自定义内容或使用here中不使用findElements的现成方法
driver.wait(async function() {
const items = await driver.findElements(By.className('item-class'))
return items.length > 0;
}, 5000);
答案 1 :(得分:0)
好吧,我认为解决这个问题的好方法是
try {
const items = await driver.wait(until.elementsLocated(By.className('item-class')));
return items.length > 0;
}
catch(err) {
console.log(err)
}
这种方式将始终等待所有元素S(它是 elementSlocated)被定位并返回一个项目数组(请记住,如果没有 await
,它将返回一个承诺数组) .
它没有超时,所以它会等到它们都准备好了(或者你可以设置一个限制,这样如果发生了奇怪的事情,你就可以看到它)。