当前位置: 首页 > 知识库问答 >
问题:

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

闻人伟
2023-03-14

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

Assert.assertEquals(page.getSearchResultList().size(), 0);

简单和工作,但...慢,因为含蓄等待。

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

由于事实上当我删除项目,然后getSearchResultList(). size()是0和Selenium总是等待10秒前findElements()返回0大小。

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

page.getDriver().manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
Assert.assertEquals(page.getSearchResultList().size(), 0);

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

更新请求@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");

输出:

10:49:59.081 [main] DEBUG impl.AssertNewEntityPage - Assert Took: 10 sec

用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");

输出:

10:57:08.215 [main] DEBUG impl.AssertNewEntityPage - Assert Took: 20 sec

共有3个答案

关飞翔
2023-03-14

您可以等待页面完全加载...

public static boolean waitForJSandJQueryToLoad() {
    log.info("Waiting for jQuery to load...");
    ExpectedCondition<Boolean> jQueryLoad = d -> {
        try {
            log.info("jQuery presented.");
            return ((Long) ((JavascriptExecutor) driver).executeScript("return jQuery.active") == 0);
        } catch (Exception e) {
            log.info("No jQuery presented.");
            return true;
        }
    };
    log.info("Waiting for javascript to load...");
    ExpectedCondition<Boolean> jsLoad = d -> ((JavascriptExecutor) driver).executeScript("return document.readyState")
            .toString().equals("complete");
    return wait.until(jQueryLoad) && wait.until(jsLoad);
}    
顾亦
2023-03-14

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

这个用例是。。。正在删除web应用中的项目。。。映射到stalenessOf(WebElement)的预期条件。因此,有效的代码块将是:

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

注意:由于您的用例已经包含隐式Wait,并且此答案建议根据文档,诱导WebDriverWait,即显式Wait。。。不要混合使用隐式和显式等待。这样做可能会导致不可预测的等待时间。例如,将隐式等待设置为10秒,显式等待设置为15秒,可能会导致20秒后出现超时。。。

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

司马俊晖
2023-03-14

您可以使用ExpectedConditions。invisibilityOfElementLocated()等待元素不可见,然后获取元素的大小()。

new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("locator xpath")));
List<WebElement> elements = driver.findElements(By.xpath("locator xpath"));
Assert.assertEquals(elements.size(), 0);
 类似资料:
  • 问题内容: 我读到用关键字标记的异步函数隐式返回一个promise: 但这不连贯…假设返回一个诺言,而await关键字将从诺言中返回值,而不是诺言itsef,那么我的getVal函数 应该 返回该值,而不是隐式诺言。 那到底是什么情况?用async关键字标记的函数是隐式返回promise还是控制它们返回的内容? 也许,如果我们不明确地返回某些东西,那么他们会隐式地返回一个诺言…? 更清楚地说,上述

  • 问题内容: 我写了一个永远不会停止的测试应用程序。它发出(是一个对象),但是我从不打电话通知。为什么此代码结束?尽管主线程在上同步,但生成的线程仍在运行,因此不会锁定该对象。 结果是主线程等待5秒钟,在此期间工作人员提供其输出。然后,在5秒钟后,程序退出。不等。如果主线程在5秒钟内没有进入睡眠状态(对此行进行了注释),则实际上将等到工作人员完成操作。当然,这里是一种使用方法,但是,出乎意料的是,它

  • 问题内容: Selenium隐式等待是否总是占据整个等待时间,还是可以更快地完成?如果我将隐式等待时间设置为10秒,则对.findElement的调用是否可以在几秒钟内完成,还是总是需要整整10秒钟? 该页面暗示它要等待整整10秒钟,这非常令人困惑,因为它不是javadoc所暗示的。 WebDriver.java的以下代码注释隐含了它的轮询操作可以比定义隐式超时更快的时间完成。但是, 评论中的最后

  • 创建驱动程序时,我已将隐式等待设置为10秒。当我希望使用显式等待时,是否必须将隐式等待设置为0? 以下是一个示例: 我必须做webDriver.manage()。超时()。秒);还是没有必要?

  • 我有以下简单的代码: 我得到了这个错误: "必须返回有效的React元素(或null)。您可能已返回未定义、数组或其他无效对象。"

  • 驱动程序级别的隐式和显式等待之间有什么区别。哪一个是驱动级等待。如果我们在代码中提供隐式和显式等待。哪一个优先。