【问题标题】:Changing Selenium implicit wait inside test process在测试过程中更改 Selenium 隐式等待
【发布时间】:2017-07-26 19:12:04
【问题描述】:

我知道,根据一些意见,在完美的情况下,我不应该使用隐式等待。但是我的用户界面很慢;在所有可能发生渲染的地方添加显式等待将是一项相当大的努力。 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 到 0 再回到 20)有点危险?

【问题讨论】:

  • 对此完全有效。更重要的是避免混淆隐式和显式等待的正确方法。等待的混合导致一些难以调试的问题,等待时间长。问题是您可能会忘记关闭并开启隐式等待。最好编写一个实用函数,通过传递显式等待条件来包装此逻辑,并在您的代码库中使用它。
  • @Grasshopper 你能把这个变成答案吗?

标签: java selenium selenium-webdriver wait


【解决方案1】:

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

我尝试创建一个通用的方法来使用。虽然通用不是我的强项。

protected static <T> T waitECTimeoutWrapped(WebDriver driver, ExpectedCondition<T> ec, int timeout) {
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    WebDriverWait wait = new WebDriverWait(driver, timeout);
    T data = waitDriver.until(ec);
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    return data;
}

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

【讨论】:

    【解决方案2】:

    如果 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;
                }
            }
        });
    }
    

    【讨论】:

    • UI引擎不支持document.readyState; UI 也是动态的,因此渲染也发生在“点击导航,页面加载”场景之外。从理论上讲,我可以摆脱隐式等待,并将大多数对 findElement/findElements 的调用替换为基本上重现隐式等待的实用程序版本,但这仍然需要很多工作。
    • 知道了。 UI 中是否有 jquery 或 Angular?
    • 我不这么认为,我确实尝试了jquery方法,但它不起作用。我正在测试的其中一个 UI 中有 dijit;另一个不确定。
    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多