Selenium findElements() 是否必须隐式等待返回 0 个元素?

Ome*_*niq 5 java selenium webdriver webdriverwait implicitwait

我带着一个关于 Selenium 的问题来到这里。在我的测试中,我需要删除网络应用程序中的某些项目,然后我想验证项目列表是否为空。我知道这看起来微不足道,但我有一些小问题。这就是我想检查我的项目列表是否为空的方式:

Assert.assertEquals(page.getSearchResultList().size(), 0);
Run Code Online (Sandbox Code Playgroud)

简单且有效,但...由于隐式等待而缓慢。

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

事实上,当我删除项目时,thengetSearchResultList().size()是 0 并且 Selenium 总是等待 10 秒,然后 findElements() 返回 0 大小。

为了避免这 10 秒的等待,我有一个解决方法,可以在断言之前修改隐式等待,但我认为这不是一个好主意。

page.getDriver().manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
Assert.assertEquals(page.getSearchResultList().size(), 0);
Run Code Online (Sandbox Code Playgroud)

还有其他更好的解决方案吗?

请求更新 @KunduK

不使用 WebDriverWait 进行断言:

    Instant start = Instant.now();
    List<WebElement> resultSearchList = page.getDriver().findElements(By.cssSelector("[ng-repeat='searchResult in $ctrl.searchResults']"));
    Assert.assertEquals(resultSearchList.size(), 0);
    Instant stop = Instant.now();
    log.debug("Assert Took: " + Duration.between(start, stop).getSeconds() + " sec");
Run Code Online (Sandbox Code Playgroud)

输出:

10:49:59.081 [main] DEBUG impl.AssertNewEntityPage - Assert Took: 10 sec
Run Code Online (Sandbox Code Playgroud)

使用 WebDriverWait 进行断言

    Instant start = Instant.now();
    new WebDriverWait(page.getDriver(), 10).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("[ng-repeat='searchResult in $ctrl.searchResults']")));
    List<WebElement> resultSearchList = page.getDriver().findElements(By.cssSelector("[ng-repeat='searchResult in $ctrl.searchResults']"));
    Assert.assertEquals(resultSearchList.size(), 0);
    Instant stop = Instant.now();
    log.debug("Assert Took: " + Duration.between(start, stop).getSeconds() + " sec");
Run Code Online (Sandbox Code Playgroud)

输出:

10:57:08.215 [main] DEBUG impl.AssertNewEntityPage - Assert Took: 20 sec
Run Code Online (Sandbox Code Playgroud)

Deb*_*anB 1

stalenessOf()

stalenessOf()是等待元素不再附加到 DOM 的期望。


这个用例

此用例...删除 Web 应用程序中的项目...映射到的ExpectedConditionsstalenessOf(WebElement element)。因此,您的代码块实际上将是:

new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(By.cssSelector("cssSelector_of_element_to_be_stale")));
Assert.assertEquals(page.getSearchResultList().size(), 0);
Run Code Online (Sandbox Code Playgroud)

注意:由于您的用例已经涉及implicitlyWait,并且此答案建议诱导WebDriverWaitExplicitWait,根据文档,...不要混合隐式和显式等待。这样做可能会导致不可预测的等待时间。例如,设置隐式等待 10 秒和显式等待 15 秒,可能会导致 20 秒后发生超时...

您可以在如何在 Selenium 中组合隐式和显式超时?中找到相关讨论。