Как FluentWait в Selenium реализует метод till () - PullRequest
0 голосов
/ 06 февраля 2019

Синтаксис метода 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 Ответ

0 голосов
/ 07 февраля 2019

В вашем вопросе упоминаются четыре различные темы, и вы можете найти подробности ниже:

java.util.function

Пакет java.util.function включает функциональные интерфейсы , которые предоставляют целевые типы для лямбда-выражений и ссылки на методы.

Вот несколько примеров:

  • BiConsumer<T,U>: Представляет операцию, которая принимает два входных аргумента и не возвращает результата.
  • BiFunction<T,U,R>: представляет функцию, которая принимает два аргумента и выдает результат.
  • BinaryOperator<T>: представляет операциюдля двух операндов одного типа, производящих результат того же типа, что и операнды.
  • BiPredicate<T,U>: представляет предикат (логическая функция) из двух аргументов.
  • Consumer<T>: Представляет операцию, которая принимает один входной аргумент и не возвращает результата.
  • Function<T,R>: представляет функцию, которая принимает один аргумент и выдает результат.

Сlass FluentWait

Класс public class FluentWait<T> расширяет java.lang.Object и реализует Wait<T>, что подразумевает, что это реализация интерфейса Wait , который может иметь свое время ожидания иИнтервал опроса настраивается на лету.Каждый экземпляр 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.

Эта реализация неоднократно применяет входное значение этого экземпляра к данной функции, пока не произойдет одно из следующих действий:

  • Функция не возвращает ни ноль, ни ложь
  • Функция выдаетисключённое исключение
  • Истекло время ожидания
  • Текущий поток прерывается

Интерфейс ExpectedCondition

The public interface ExpectedCondition<T>Интерфейс расширяет com.google.common.base.Function<WebDriver,T>, который моделирует условие, которое, как ожидается, оценивает что-то, что не является ни нулевым, ни ложным.Примеры могут включать определение, если веб-страница загружена или элемент видим.

Обратите внимание, что ожидается, что ExpectedConditions являются идемпотентными.Они будут вызваны в цикле WebDriverWait, и любое изменение состояния тестируемого приложения может иметь неожиданные побочные эффекты.


Класс ExpectedConditions

Класс ExpectedConditions - это стандартные ExpectedCondition s, которые обычно используются в тестах веб-драйверов.

Несколько примеров использования:

  • 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"));
    
...