在下面的 Selenium Explicit wait 中,我看到该方法until
返回类似
<V> V
对于方法until(com.google.common.base.Function<? super T,V> isTrue)
我的疑问是他们如何将它引用到 type 的元素WebElement
?
WebElement element = b.until(ExpectedConditions.elementToBeClickable(By.id("Email")));
通过贷款添加答案,我认为这个问题更多地与泛型的工作有关,而不是与 webdriver 有关。因此,阅读有关泛型的更多信息将有助于回答这个问题。
我不确定以下是否是最好的解释,但我会尝试一下:
当您调用 elementToBeClickable 方法时,它会返回类似ExpectedCondition<WebElement>
.
until 方法返回 V。V 是一个泛型类型占位符。那么V会持有什么?V 与中的相同Function<? super T, V>
你的情况:Function<? super T, V>
= ExpectedCondition<WebElement>
。
然后看一下 ExpectedCondition 的定义,
public interface ExpectedCondition<T> extends Function<WebDriver, T> {}
因此,在您的情况下,这ExpectedCondition<WebElement>
意味着Function<WebDriver, WebElement>
So V 是 WebElement,因此它返回 WebElement。
正如您可以检查源代码,指定了:
@param <V> The function's expected return type.
public <V> V until(Function<? super T, V> isTrue) {...}
。总之,如果您使用ExpectedCondition参数(这很可能),则类型为参数化类型。看下面的例子:
try {
(new WebDriverWait(webDriver, maxWaitTime)).until(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
return applyCondition(driver, locator);
}
});
return true;
}
catch (TimeoutException ex) {
return false;
}
在这种情况下,如您所见,until
它是方法的返回类型Boolean
,它来自参数化类型ExpectedCondition
:new ExpectedCondition<Boolean>