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

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

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"));
 }
});

В чем разница между двумя?Любое дополнительное преимущество?

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

1 Ответ

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

WebDriverWait

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

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

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

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

Пример A:

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

Пример B:

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 - это реализация интерфейса Wait , для которого могут быть настроены время ожидания и интервал опроса на лету.

Каждый экземпляр 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

...