【发布时间】:2017-05-15 19:01:56
【问题描述】:
我在 Java 中使用 Selenium 3.4。我正在测试一个不是很快的 UI 并使用隐式等待,这样我就不必关心每次加载需要几秒钟的时间手动显式等待。
但是,有时我还是需要显式等待。为此,我需要暂时禁用隐式等待。为避免代码混乱,我将以下方法放在驱动程序管理器类中:
public static void waitFor(ExpectedCondition<Boolean> condition,int timeoutSeconds) throws Exception {
setImplicitWait(0);
try {
(new WebDriverWait(driver, timeoutSeconds)).until(condition);
} finally {
setImplicitWait(WAIT_REGULAR);
}
}
setImplicitWait 方法很简单:
public static void setImplicitWait(int TimeoutSeconds) {
logger.debug("Setting implicit wait to {} seconds",TimeoutSeconds);
driver.manage().timeouts().implicitlyWait(TimeoutSeconds, TimeUnit.SECONDS);
}
因此,此设置适用于一些等待,例如:
DriverManager.waitFor(ExpectedConditions.invisibilityOfElementLocated(By.className("gridxLoad")), DriverManager.WAIT_HUGE);
但是,如果我尝试这个:
DriverManager.waitFor(ExpectedConditions.visibilityOfElementLocated(By.className("gridxMain")), DriverManager.WAIT_HUGE);
我得到一个编译错误:
DriverManager 类型中的方法waitFor(ExpectedCondition, int) 不适用于参数(ExpectedCondition, int)
如果我将方法定义中的参数类型更改为 ExpectedCondition<WebElement> ,那么第二次等待当然会成功,而第一次等待会引发编译错误。如果我尝试为ExpectedCondition<WebElement> 和ExpectedCondition<Boolean> 创建相同的方法,则会出现编译错误:
方法waitFor(ExpectedCondition, int)的擦除与DriverManager类型中的另一个方法相同
最后,如果我尝试将参数定义为 ExpectedCondition,我会在同一个小方法中收到大量编译警告:
ExpectedCondition 是原始类型。对泛型类型 ExpectedCondition 的引用应该被参数化
类型安全:ExpectedCondition 类型的表达式需要未经检查的转换才能符合 Function
类型安全:FluentWait 类型的泛型方法 until(Function) 的未经检查的调用 until(ExpectedCondition)
我也尝试过这样定义方法:
public static void waitFor(Function<? super WebDriver,Object> condition,int timeoutSeconds) throws Exception {
但随后该方法的两个调用都会引发编译器错误。
我该怎么办?使用原始的 ExpectedCondition 参数并忽略警告?
【问题讨论】:
-
这可能没什么帮助,但是当我将项目升级到 Selenium 3.x 时遇到了此类问题。在广泛搜索解决方案后,我最终将其回滚到 2.53。如果我记得,最新版本不支持 ExpectedConditions,我无法获得任何其他方法来完成我想要的(elelementIsClickable)
-
他们确实支持 ExpectedConditions 但需要更高版本的番石榴 - 所以可能是不同的问题。 ExpectedConditions 本身工作正常,这只是制定一个包装器。
标签: java selenium parameters wait