Вы можете полностью. Я беру это из другого ответа, который я написал здесь: Selenium Java SafariDriver ждет загрузки страницы после нажатия
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
и вернуть ноль, если условие не выполнено.
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>
и просто захочет выбрать для него подходящее возвращаемое значение.