首页 > 解决方案 > 隐式更改动态等待

问题描述

请评论我在 YouTube 上找到的以下代码。它检查当时是否存在元素

public boolean isElementPresent(By locator)
    {
        driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
        List<WebElement> list = driver.findElements(locator);
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        if (list.size() == 0)
            return false;
        else
            return list.get(0).isDisplayed();
    }

它在方法中隐式地动态更改。在所有 Selenium 资源中始终声明implicitWait只能在测试类中设置一次。上面的代码在某种程度上类似于显式等待,因为它适应不同的情况。您对此代码有何看法?

在 Selenium 文档中,据说一旦设置,隐式等待就会设置为会话的生命周期。 但是,在上面的代码中,我们更改了两次implicitlyWait。文档有错吗?

标签: seleniumselenium-webdriverwebdriverimplicitwait

解决方案


隐式等待

隐式等待是通知WebDriver实例在尝试查找一个或多个元素时轮询HTML DOM一段时间(如果它们在DOM 树中不立即可用)。


一旦设置,隐式等待设置为会话的生命周期

是的,你没看错。这是因为隐式等待是在WebDriver系统的远程端实现的。这意味着它们被嵌入GeckoDriverChromeDriverIEDriverServerWebDriver变体中,这些变体被安装到匿名 Firefox/Chrome 配置文件和 Java 远程 WebDriver 服务器中。但是,您始终可以重新配置implicitlyWait

您可以在使用 selenium 中的隐式等待中找到详细讨论


这个用例

从语法上讲,您的代码完美无缺。理想情况下,您将在寻找所需元素的同时设置隐式等待。一旦元素被识别并存储在列表中,您就可以将implicitlyWait重置回0。因此,您的代码块将是:

public boolean isElementPresent(By locator)
{
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    List<WebElement> list = driver.findElements(locator);
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    if (list.size() == 0)
        return false;
    else
        return list.get(0).isDisplayed();
}

推荐阅读