在测试过程中更改Selenium隐式等待

时间:2017-07-26 19:12:05

标签: java selenium selenium-webdriver wait

我知道,根据一些意见,在完美的情况下,我不应该使用隐式等待。但我的UI很慢;将显式等待添加到渲染可能发生的所有众多地方将是一项相当大的努力。在驱动程序初始化时设置的标准隐式等待时间为20秒,占据了80%的等待时间。

但是我需要处理剩余的20%。有时我需要等待元素消失 - 在这种情况下,隐式等待意味着额外的20秒。有时候我需要检查一个元素的存在,但是不要等待20秒(因为该元素通常不在正常的执行流程中)。

所以,我自然想暂时禁用隐式等待:

driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
new WebDriverWait(driver, MY_TIMEOUT)).until(ExpectedConditions.WHATEVER_I_NEED);
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

但这会稳定吗?或者正在改变隐式等待(在这种情况下,从20变为零并返回到20)某种危险?

2 个答案:

答案 0 :(得分:1)

完全有效这样做。更重要的是正确的方法,以避免混合隐式和显式等待。等待的混合导致一些难以调试的问题,等待时间过长。问题是你可能忘记关闭和隐藏等待。最好通过传递显式等待标准来编写实用程序函数来包装此逻辑,并在代码库中使用它。

我开始尝试创建一个通用的方法。虽然通用是我的强项。

nomColumn.setCellValueFactory(data -> data.getValue().nomProperty());

您可以忽略许多情况下的返回数据,但这样您就可以在一次调用中检索您可能正在寻找的元素。

答案 1 :(得分:0)

如果UI很慢,那么添加一些服务员等待页面完全加载呢?以下是我要确保页面已满载的方法。

    public static void waitForDomToComplete(WebDriver driver) {
    FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(60, TimeUnit.SECONDS)
            .pollingEvery(700, TimeUnit.MILLISECONDS)
            .withMessage("Time out is reached. Page is not loaded!");

    wait.until(new ExpectedCondition<Boolean>() {
        @Override
        public Boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            String domLoadStatus = (String) js.executeScript("return document.readyState");
            if (domLoadStatus.equals("complete")) {
                return true;
            } else {
                return false;
            }
        }
    });
}