Изменять неявно Ждать динамически
Прокомментируйте следующий код, который я нашел на YouTube. Проверяет, присутствует ли элемент в данный момент
public boolean isElementPresent(By locator)
{
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
List<WebElement> list = driver.findElements(locator);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
if (list.size() == 0)
return false;
else
return list.get(0).isDisplayed();
}
Он динамически изменяется неявно Wait в методе. Во всех ресурсах Selenium всегда указывается, что implicitWait может быть установлен только один раз в тестовом классе. Приведенный выше код в некоторой степени похож на явное ожидание, поскольку он адаптируется к различным ситуациям. Что вы думаете об этом коде?
В документации Selenium сказано, что после установки неявное ожидание устанавливается на время существования сеанса. Однако в приведенном выше коде мы дважды меняем неявное ожидание. Документация неверна?
1 ответ
Неявное ожидание
Неявное ожидание является уведомить WebDriver экземпляр опрашивать HTML DOM в течение определенного периода времени при попытке найти элемент или элементы, если они не сразу доступны в DOM дереве.
После установки неявное ожидание устанавливается в течение всего сеанса
Да, вы все правильно поняли. Это потому, что неявное ожидание реализовано на удаленной стороне системы WebDriver. Это означает, что они запеченные на GeckoDriver, ChromeDriver, IEDriverServer и т.д. WebDriver варианты, которые устанавливаются в профиль анонимного Firefox/Chrome, и сервер удаленного WebDriver Java. Однако вы всегда можете перенастроить implicitlyWait.
Вы можете найти подробное обсуждение в Использование неявного ожидания в селене
Этот вариант использования
Синтаксически ваш код безупречен. В идеале вы должны установить implicitlyWait, ища желаемые элементы. Как только элементы будут определены и сохранены в списке, вы можете сбросить неявное ожидание обратно на 0. Таким образом, ваш блок кода будет таким:
public boolean isElementPresent(By locator)
{
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
List<WebElement> list = driver.findElements(locator);
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
if (list.size() == 0)
return false;
else
return list.get(0).isDisplayed();
}