elementLocated与findElements的结果不一致

时间:2018-06-01 20:48:09

标签: javascript selenium-webdriver

我正在为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)我应该使用不同的构造/方法让它等到预期的项目在页面上吗?

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,它将返回一个承诺数组) . 它没有超时,所以它会等到它们都准备好了(或者你可以设置一个限制,这样如果发生了奇怪的事情,你就可以看到它)。