首页 > 解决方案 > 与 Implicitwait 相比,我们是否需要为 ExplicitWait 声明更少的时间

问题描述

在某处我读到混合隐式和显式会产生不可预测的结果。这是真的吗?

资料来源:https ://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#advanceduserinteractions

警告:不要混合隐式和显式等待!这样做会导致不可预测的等待时间。例如,设置 10 秒的隐式等待和 15 秒的显式等待可能会导致 20 秒后发生超时。

在那种情况下,我们是否需要给更少的时间/等于隐式等待???

标签: seleniumwaitwebdriverwaitfluentwaitimplicitwait

解决方案


老实说,有了测试自动化框架的良好实现,您就不需要implicitWait. 您应该始终明确地等待条件。

隐式等待可能会导致您的测试运行速度变慢。自动化测试套件应始终尽可能快地运行以向团队提供反馈。

但是,如果您坚持使用它,您可以简单地创建某种方法/类,在其中关闭隐式等待、执行显式等待并恢复隐式等待值。

像这样的东西:

public class Wait {
    private static final int IMPLICIT_WAIT_TIME = 10; //store your default implicit wait here or use .properties file

    private WebDriver driver;
    private int timeout = 10;
    private List<Class<? extends Throwable>> exceptions = new ArrayList<>();

    public Wait(WebDriver driver) {
        this.driver = driver;

        driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //turn off implicit wait
    }

    public Wait setTimeout(int seconds) {
        this.timeout = seconds;
        return this;
    }

    @SafeVarargs
    public final Wait ignoring(Class<? extends Throwable>... exceptions) {
        this.exceptions.addAll(Arrays.asList(exceptions));
        return this;
    }

    public void until(ExpectedCondition... expectedConditions) {
        WebDriverWait wait = new WebDriverWait(driver, timeout);
        if (exceptions.size() > 0) {
            wait.ignoreAll(exceptions);
        }
        wait.until(ExpectedConditions.and(expectedConditions));

        driver.manage().timeouts().implicitlyWait(IMPLICIT_WAIT_TIME, TimeUnit.SECONDS); //restore implicit wait
    }
}

推荐阅读