我们可以为Java和Selenium中的显式等待创建通用或可重用的方法吗?
使用预期的条件,例如,visibleOfElementLocated,presenceOfElementLocated,elementToBeClickable
感谢您的帮助。
谢谢
答案 0 :(得分:1)
您完全可以。我是从这里写的另一个答案中摘录的:Selenium java SafariDriver wait for page to load after click
public ExpectedCondition<Boolean> myCustomCondition(/* some arguments from the outside */) {
return new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
// Check something on the page and return either true or false,
// this method will be run repeatedly until either the time
// limit is exceeded, or true is returned
}
public String toString() {
return "a description of what this is waiting for";
}
};
}
将其包装在函数中是我经验中最常见的方法。但是要知道的要点是,您想要获得ExpectedCondition
的实例,该实例提供了apply()和toString()方法的实现。
apply()
仅在满足条件时才返回true。
这是一个简单的真实示例:
public ExpectedCondition<Boolean> waitForElementToHaveText(final WebElement element, final String expectedText) {
return new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
try {
return element.getText().equals(expectedText);
} catch (Exception e) {
return false; // catchall fail case
}
}
public String toString() {
return "an element to have specific text";
}
};
}
可以这样使用:
WebDriverWait wait = new WebDriverWait(driver, maxSecondsToWait);
wait.until(waitForElementToHaveText(anElement, "my visible text"));
编辑:
一些额外的注释,如果您注意到ExpectedCondition
使用的声明的泛型类型为布尔值,则意味着您要返回true或false以确定是否满足条件。但是null也可以替代false。因此,您可以执行此操作的另一种方法是声明ExpectedCondition
具有通用类型WebElement
,并在不满足条件时返回null。
public static ExpectedCondition<WebElement> waitForElementToContainText(final String cssSelector, final String visibleText) {
return new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver webDriver) {
WebElement anElement = webDriver.findElement(By.cssSelector(cssSelector);
if (anElement.getText().contains(visibleText)) {
return anElement; // Condition passed
}
return null; // Condition failed
}
public String toString() {
return "first occurance of text '" + visibleText + "' in element " + cssSelector;
}
};
}
当然,这些示例中的任何一个都可以使用<Boolean>
或<WebElement>
,并且只想为其选择合适的返回值。