Как использовать встроенные ExpectedConditions с FluentWait?

В Selenium (Java) я хочу использовать ExpectedConditions с FluentWait. Я пробую следующий код, который не работает. Он не ждет появления элемента в DOM.

Может ли кто-нибудь помочь здесь?

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                    .withTimeout(10, TimeUnit.SECONDS)
                    .pollingEvery(1, TimeUnit.SECONDS);

wait.until(ExpectedConditions.presenceOfElementLocated(By.id("mybutton")));

Примечание: я пробовал это с WebDriverWait, и это рабочий файл. Я пытаюсь использовать FluentWait, так как хочу контролировать время ожидания опроса.

2 ответа

Решение

Немного предыстории:

Свободное ожидание

Fluent Wait это реализация Wait интерфейс, с помощью которого пользователь может настроить время ожидания и интервал опроса на лету. FluentWait instance определяет максимальное время ожидания условия, а также частоту, с которой проверяется условие. Пользователь также может настроить ожидание, чтобы игнорировать определенные типы исключений во время ожидания, такие как NoSuchElementExceptions при поиске элемента на странице.

WebDriverWait

WebDriverWait это специальная версия Fluent Wait, которая использует экземпляры WebDriver.

Вы можете найти подробное обсуждение WebDriverWait а также FluentWait в обоих этих QA Implicit vs Explicit vs Fluent Wait а также Differences between impilicit, explicit and fluentwait,

ExpectedConditions

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


По вашему вопросу, как вы trying with FluentWait since you want to control polling timeout вы все еще можете достичь того же через WebDriverWait следующее:

  • WebDriverWait есть 3 Конструктора, и один из них:

    WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)
    
  • Подробности:

    public WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)
    
    This wait will ignore instances of NotFoundException that are encountered by default in the `until` condition, and immediately propagate all others. You can also add more to the ignore list by calling ignoring(exceptions to add).
    
    Parameters:
    driver - The WebDriver instance to pass to the expected conditions
    timeOutInSeconds - The timeout in seconds when an expectation is called
    sleepInMillis - The duration in milliseconds to sleep between polls (polling interval).
    

Решение:

Вы можете использовать вышеупомянутый конструктор WebDriverWait и все еще может контролировать интервал опроса.

Примечание: чтобы сделать логику вашей программы простой и понятной, используйте WebDriverWait вместо Fluent Wait до тех пор, пока не будет абсолютно необходимо.

Общая информация:

Для дальнейшего понимания Fluent Wait вы можете следить за обсуждением Selenium Webdriver 3.0.1-[Eclipse-Java-Chrome]: Selenium showing error for FluentWait Class

Да, то, что сказал НарендраР, правильно. Когда вы создали объект для FluentWait, использовали тот же объект для записи ExpectedConditions.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(10, TimeUnit.SECONDS).pollingEvery(1, TimeUnit.SECONDS);
wait.unitl(ExpectedConditions.presenceOfElementLocated(By.id("mybutton")));
Другие вопросы по тегам