3

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

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

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

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

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

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

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
4

3 回答 3

2

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

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);
于 2019-12-27T14:46:32.147 回答
1

stalenessOf()

stalenessOf()是期望等到一个元素不再附加到 DOM 上。


这个用例

这个用例......删除 Web 应用程序中的项目......映射. stalenessOf(WebElement element)因此,您的代码块将是:

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

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

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

于 2019-12-27T22:44:43.120 回答
0

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

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);
}    
于 2019-12-27T15:36:24.220 回答