我正在为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);

09-10 17:36