Mik*_*dik 5 java selenium wait selenium-webdriver
我知道,根据一些意见,在完美的情况下,我不应该使用隐式等待。但是我的用户界面很慢;将显式等待添加到所有可能发生渲染的地方将是一项相当大的努力。在驱动程序初始化时设置的标准隐式等待时间为 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);
Run Code Online (Sandbox Code Playgroud)
但这会稳定吗?或者更改隐式等待(在这种情况下,从 20 到 0 再回到 20)是否有某种危险?
这样做完全有效。更重要的是避免混淆隐式等待和显式等待的正确方法。这种等待时间的混合会导致一些等待时间过长而难以调试的问题。问题是您可能忘记关闭和打开隐式等待。最好编写一个实用函数来通过传递显式等待标准来包装此逻辑,并在代码库中使用它。
我尝试创建一个通用的方法来使用。虽然通用不是我的强项。
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;
}
Run Code Online (Sandbox Code Playgroud)
在许多情况下,您可以忽略返回数据,但这样您就可以在一次调用中检索您可能要查找的元素。