Изменять неявно Ждать динамически

Прокомментируйте следующий код, который я нашел на 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();
}
Другие вопросы по тегам