В чем разница между использованием лямбда-функции в использовании 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.