我正在为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的Expect()调用在页面上对我来说没有意义。
那么,问题是:
1)我缺少/不了解什么,因此实际上可能得到这种结果?
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);