Как использовать встроенные 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")));