В чем разница между использованием лямбда-функции в использовании FluentWait и неиспользованием ее?

Ожидание элемента может быть закодировано как

WebElement foo = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("foo")));

В документации по FluentWait приведен пример, приведенный ниже, за исключением определения времени ожидания, интервала опроса, игнорирования исключений.

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
 public WebElement apply(WebDriver driver) {
   return driver.findElement(By.id("foo"));
 }
});

Какая разница между двумя? какая-то дополнительная выгода?

Я искал лямбда-выражения, функциональный интерфейс. Но я не совсем понял картину.

2 ответа

Решение

WebDriverWait

WebDriverWait - это специализация FluentWait, которая использует экземпляры WebDriver.

Конструкторы:

  • WebDriverWait(WebDriver driver, java.time.Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut)
  • WebDriverWait(WebDriver driver, long timeOutInSeconds) Индуцирование этого Ожидания будет игнорировать экземпляры NotFoundException, которые встречаются (выбрасываются) по умолчанию в состоянии "до", и немедленно распространять все остальные.
  • WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis) Индуцирование этого Ожидания будет игнорировать экземпляры NotFoundException, которые встречаются (выбрасываются) по умолчанию в состоянии "до", и немедленно распространять все остальные.

Лямбда-реализация для WebDriverWait

Пример А:

(new WebDriverWait(driver(), 5))
    .until(new ExpectedCondition<WebElement>() {
        public WebElement apply(WebDriver d) {
            return d.findElement(By.linkText(""));
        }
    });

Пример Б:

WebElement wer = new WebDriverWait(driver, 5).until((WebDriver dr1) -> dr1.findElement(By.id("q")));

Пример C:

(new WebDriverWait(driver(), 5)).until((driver) -> driver.findElement(By.linkText("Google")));

FluentWait

FluentWait - это реализация интерфейса ожидания, для которого могут быть настроены время ожидания и интервал опроса на лету.

Каждый экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки условия. Кроме того, пользователь может настроить время ожидания для игнорирования определенных типов исключений во время ожидания, таких как NoSuchElementExceptions, при поиске элемента на странице.

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

// Waiting 30 seconds for an element to be present on the page, checking for its presence once every 500 milliseconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofMillis(500))
    .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(By.name("q"));
    }
});

Примечание. Этот класс не дает никаких гарантий безопасности потоков.

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

Разница между двумя методами, которые вы упомянули выше, заключается в том, что второй будет создавать дополнительный класс в памяти (который также известен как анонимный внутренний класс), а первый не будет этого делать. Если реализация интерфейса «Функция» действительно необходима, создайте лямбду и т.п., упомянутые выше, и вы увидите тот же эффект, и в этом случае он не создаст новый экземпляр внутреннего класса. Вместо этого будет выполнен вызов метода интерфейса через InvokeDynamic.

Другие вопросы по тегам