Как FluentWait в Selenium реализует метод till ()
Синтаксис until()
метод в селен документы, как показано ниже:
public <V> V until(java.util.function.Function<? super T,V> isTrue)
Использование того же самого походит на:
WebDriver wait = new WebDriver(driver, 20);
WebElement loginButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("lgn-btn")));
Я не мог относиться к синтаксису и использованию until()
метод. Я хочу знать, как реализован синтаксис.
Да, я знаю об Generics, который мы используем, чтобы узнать об ошибках во время компиляции, чтобы мы могли избежать ClassCastException во время выполнения. Также я знаю о функциональном интерфейсе, который мы используем для достижения параметризации поведения.
То, что я не получил, это эквивалентность между java.util.function.Function<? super T,V> isTrue)
и ExpectedConditions.elementToBeClickable(By.id("id))
,
Что означает выражение java.util.function.Function<? super T,V> isTrue
имею в виду?
1 ответ
В вашем вопросе упоминаются четыре разные темы, и вы можете найти подробности ниже:
java.util.function
Пакет java.util.function включает в себя функциональные интерфейсы, которые предоставляют целевые типы для лямбда-выражений и ссылок на методы.
Вот несколько примеров:
BiConsumer<T,U>
: Представляет операцию, которая принимает два входных аргумента и не возвращает результата.BiFunction<T,U,R>
: Представляет функцию, которая принимает два аргумента и выдает результат.BinaryOperator<T>
: Представляет операцию над двумя операндами одного и того же типа, производя результат того же типа, что и операнды.BiPredicate<T,U>
Представляет предикат (булевозначная функция) двух аргументов.Consumer<T>
: Представляет операцию, которая принимает один входной аргумент и не возвращает результата.Function<T,R>
: Представляет функцию, которая принимает один аргумент и выдает результат.
Класс FluentWait
public class FluentWait<T>
класс расширяется java.lang.Object
и реализует Wait<T>
что подразумевает, что это реализация интерфейса ожидания, который может иметь время ожидания и интервал опроса, настроенные на лету. Каждый экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки условия. Кроме того, пользователь может настроить время ожидания для игнорирования определенных типов исключений во время ожидания, таких как NoSuchElementExceptions, при поиске элемента на странице.
Один из модификаторов:
Modifier and Type Method and Description
----------------- ----------------------
<V> V until(java.util.function.Function<? super T,V> isTrue)
Specified by:
until in interface Wait<T>
Type Parameters:
V - The function's expected return type.
Parameters:
isTrue - the parameter to pass to the ExpectedCondition
Returns:
The function's return value if the function returned something different from null or false before the timeout expired.
Throws:
TimeoutException - If the timeout expires.
Эта реализация неоднократно применяет входное значение этого экземпляра к данной функции, пока не произойдет одно из следующего:
- Функция не возвращает ни ноль, ни ложь
- Функция выдает безымянное исключение
- Тайм-аут истекает
- Текущий поток прерывается
Ожидаемый интерфейс
public interface ExpectedCondition<T>
интерфейс расширяется com.google.common.base.Function<WebDriver,T>
которая моделирует условие, которое, как ожидается, оценивает что-то, что не является ни нулевым, ни ложным. Примеры могут включать определение, загружена ли веб-страница или видимость элемента.
Обратите внимание, что ожидается, что
ExpectedConditions
идемпотентны. Они будут вызваны в циклеWebDriverWait
и любое изменение состояния тестируемого приложения может иметь неожиданные побочные эффекты.
Класс ExpectedConditions
Класс ExpectedConditions - это стандартные ExpectedCondition, которые обычно используются в тестах веб-драйверов.
Несколько примеров использования:
elementToBeClickable()
:new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("element_css")));
visibilityOfElementLocated()
:new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("element_css")));
frameToBeAvailableAndSwitchToIt()
:new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("element_css")));
visibilityOfAllElementsLocatedBy()
:new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("element_css")));
attributeContains()
:new WebDriverWait(driver, 20).until(ExpectedConditions.attributeContains(driver.findElement(my_element), "src", "https"));