Неявное и явное ожидание Selenium с синтаксисом

⚡ Умное резюме

Selenium Команды ожидания синхронизируют сценарии автоматизации с динамическим поведением страницы, предотвращая сбои тестов, вызванные асинхронной загрузкой элементов. В этом справочнике объясняются стратегии неявного, явного и гибкого ожидания с использованием синтаксиса WebDriver, а также принципы их работы. Java Примеры кода и практические рекомендации по выбору подходящего времени ожидания для стабильного и надежного выполнения тестов.

  • ⚙️ FoundationОсновной принцип: Примените неявное ожидание глобально, чтобы WebDriver приостанавливал работу на заданное время, прежде чем вызвать исключение NoSuchElementException.
  • 🎯 Фокус реализации: Используйте Explicit Wait с ExpectedConditions для воздействия на элементы, зависящие от Ajax или динамических состояний видимости.
  • 🔁 Продвинутая техника: Настройте Fluent Wait с интервалами опроса для обработки элементов, загружаемых в непредсказуемое время.
  • Стратегия оптимизации: Замените Thread.sleep на условные ожидания, чтобы сократить время выполнения и устранить неэффективные задержки.
  • Влияние на качество: Правильный выбор времени ожидания напрямую снижает количество нестабильных сбоев и повышает стабильность скриптов в разных средах.

Selenium Ожидание – неявное и явное с синтаксисом

In SeleniumОжидания играют важную роль в выполнении надежных тестов. В этом руководстве вы узнаете о ключевых аспектах и ​​различиях между неявными и явными командами ожидания. Seleniumа также практическое применение Fluent Wait.

Зачем нам нужно ожидание Selenium?

Большинство современных веб-приложений разрабатываются с использованием Ajax и JavaСценарийКогда страница загружается браузером, элементы, с которыми мы хотим взаимодействовать, могут загружаться с разными интервалами времени.

Это не только затрудняет идентификацию элемента, но и, если элемент не будет обнаружен вовремя, Selenium бросит Элементнотвидиблисключение. Selenium Функция ожидания решает эту проблему синхронизации, предоставляя WebDriver определенное окно, в течение которого он может найти элемент, прежде чем произойдет сбой.

Рассмотрим сценарий, в котором в одном и том же тесте используются как неявное, так и явное ожидание. Предположим, что неявное ожидание установлено на 20 секунд, а явное — на 10 секунд.

Если мы ищем элемент, управляемый определенными Ожидаемые условия Если элемент не находится в пределах явного 10-секундного окна ожидания (Explicit Wait), WebDriver переключается на неявное окно в 20 секунд, после чего генерирует исключение. Элементнотвидиблисключение.

Selenium Ожидания WebDriver

  1. Неявное ожидание
  2. Явное ожидание
  3. Свободное ожидание

Неявное ожидание Selenium

Неявное ожидание Selenium Указывает WebDriver ожидать заданное время, прежде чем выбросить исключение NoSuchElementException. Значение по умолчанию — 0. После настройки WebDriver будет опрашивать DOM в течение этого времени, прежде чем завершить работу с ошибкой. Selenium WebDriver унаследовал концепцию неявного ожидания от Watir.

В приведенном ниже примере мы объявляем неявное ожидание длительностью 10 секунд. Если элемент не находится в пределах этого временного окна, генерируется исключение.

Синтаксис неявного ожидания (Selenium 4):

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
package guru.test99;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class AppTest {

    protected WebDriver driver;

    @Test
    public void guru99tutorials() throws InterruptedException {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize the browser window
        driver.manage().window().maximize();
        // get the actual value of the title
        aTitle = driver.getTitle();
        // compare the actual title with the expected title
        if (aTitle.equals(eTitle)) {
            System.out.println("Test Passed");
        } else {
            System.out.println("Test Failed");
        }
        // close browser
        driver.close();
    }
}

Объяснение Code

В приведенном выше примере рассмотрим следующее утверждение:

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

Selenium В версии 4 старая сигнатура с двумя аргументами (целое число плюс TimeUnit) была заменена одним аргументом Duration. Класс Duration поддерживает секунды, минуты, миллисекунды и другие единицы времени с помощью статических вспомогательных функций, таких как Duration.ofSeconds, Duration.ofMillis и Duration.ofMinutes.

Явное ожидание Selenium

Явное ожидание Selenium Указывает WebDriver ожидать выполнения определенных условий (ожидаемых условий) или максимального времени, прежде чем выбросить исключение ElementNotVisibleException. Это более разумное ожидание, поскольку оно применяется только к указанному элементу. Явное ожидание предпочтительнее неявного ожидания, когда тест должен обрабатывать динамически загружаемый контент Ajax.

После того, как явно объявлено ожидание, необходимо использовать Ожидаемые условияили вы можете настроить частоту опроса с помощью Свободное ожидание. Избегать использования Thread.sleep (), поскольку это приостанавливает выполнение без каких-либо условий и, как правило, считается плохой практикой.

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

Явный синтаксис ожидания (Selenium 4):

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
package guru.test99;

import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest2 {
    protected WebDriver driver;

    @Test
    public void guru99tutorials() throws InterruptedException {
        driver = new ChromeDriver();
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize the browser window
        driver.manage().window().maximize();
        // get the actual value of the title
        aTitle = driver.getTitle();
        // compare the actual title with the expected title
        if (aTitle.contentEquals(eTitle)) {
            System.out.println("Test Passed");
        } else {
            System.out.println("Test Failed");
        }
        WebElement guru99seleniumlink;
        guru99seleniumlink = wait.until(ExpectedConditions.visibilityOfElementLocated(
            By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
        guru99seleniumlink.click();
    }
}

Объяснение Code

Рассмотрим следующий код:

WebElement guru99seleniumlink;
guru99seleniumlink = wait.until(ExpectedConditions.visibilityOfElementLocated(
    By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
guru99seleniumlink.click();

В этом примере WebDriverWait скрипт ожидает до 20 секунд, как это определено в настройках. WebDriverWait класс, до Ожидаемые условия удовлетворены — в зависимости от того, что произойдет раньше.

Приведенные выше Java Код ожидает выполнения условия до 20 секунд. visibilityOfElementLocation чтобы быть правдой.

В следующих случаях можно использовать ожидаемые условия. Selenium Явное ожидание:

  1. оповещение присутствует ()
  2. элементSelectionStateToBe()
  3. элементToBeClickable()
  4. элементToBeSelected()
  5. фреймToBeAvailableAndSwitchToIt()
  6. невидимостьOfTheElementLocated()
  7. невидимостьOfElementWithText()
  8. присутствиеOfAllElementsLocatedBy()
  9. присутствиеОфЭлементЛокед()
  10. текстToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. заголовокIs()
  14. заголовокСодержит()
  15. видимостьOf()
  16. видимостьОфВсеЭлементы()
  17. видимостьOfAllElementsLocatedBy()
  18. видимостьOfElementLocated()

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

Свободное ожидание Selenium Определяет максимальную продолжительность ожидания WebDriver выполнения условия, а также частоту опроса для проверки этого условия перед генерацией исключения ElementNotVisibleException. Fluent Wait проверяет наличие элемента через регулярные интервалы, пока объект не будет найден или не истечет время ожидания.

Частота: Цикл повторения для оценки состояния через регулярные интервалы.

Рассмотрим сценарий, когда элемент загружается с непредсказуемыми интервалами. Загрузка элемента может занять 10 секунд, 20 секунд или больше. Если мы зададим явное ожидание в 20 секунд, скрипт будет ждать все это время, прежде чем завершиться с ошибкой. В таких случаях Fluent Wait — идеальный выбор, поскольку он опрашивает элемент с заданной частотой до тех пор, пока элемент не будет найден или не истечет время последнего таймера.

Синтаксис ожидания Fluent (Selenium 4):

Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofSeconds(5))
    .ignoring(NoSuchElementException.class);

Более старая сигнатура, принимавшая целочисленные значения плюс TimeUnit, была признана устаревшей. Selenium 3.11 и удалено в Selenium 4. Представленный выше API, основанный на продолжительности, является рекомендуемым подходом на данный момент.

package guru.test99;

import java.time.Duration;
import java.util.NoSuchElementException;
import java.util.function.Function;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.testng.annotations.Test;

public class AppTest3 {
    protected WebDriver driver;

    @Test
    public void guru99tutorials() throws InterruptedException {
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        driver = new ChromeDriver();
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize the browser window
        driver.manage().window().maximize();
        // get the actual value of the title
        aTitle = driver.getTitle();
        // compare the actual title with the expected title
        if (aTitle.contentEquals(eTitle)) {
            System.out.println("Test Passed");
        } else {
            System.out.println("Test Failed");
        }

        Wait<WebDriver> wait = new FluentWait<>(driver)
            .withTimeout(Duration.ofSeconds(30))
            .pollingEvery(Duration.ofSeconds(5))
            .ignoring(NoSuchElementException.class);

        WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
            }
        });
        // click on the selenium link
        clickseleniumlink.click();
        // close browser
        driver.close();
    }
}

Объяснение Code

Рассмотрим следующий код:

Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofSeconds(5))
    .ignoring(NoSuchElementException.class);

В приведенном выше примере мы объявляем Fluent Wait с таймаутом 30 секунд, частотой опроса 5 секунд и игнорируем NoSuchElementException.

Рассмотрим следующий код:

public WebElement apply(WebDriver driver) {
    return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
}

Эта функция идентифицирует веб-элемент на странице (в данном случае, Selenium (ссылка на главной странице). С интервалом опроса в 5 секунд и таймаутом в 30 секунд, проверка наличия элемента выполняется каждые 5 секунд в течение максимум 30 секунд. Если элемент находится в пределах этого временного окна, скрипт продолжает выполнение. В противном случае... Элементнотвидиблисключение брошен.

Также проверьте: Selenium Учебное пособие по IDE для начинающих

Разница между неявным ожиданием и явным ожиданием

В таблице ниже показаны основные различия между неявным и явным ожиданием. Selenium.

Неявное ожидание Явное ожидание
К каждому элементу скрипта применяется неявное время ожидания. Явное время ожидания применяется только к элементам, на которые оно специально нацелено.
В режиме неявного ожидания (Implicit Wait) для элемента не указываются ожидаемые условия (ExpectedConditions). В методе Explicit Wait для элемента необходимо определить ExpectedConditions.
Рекомендуется использовать, когда элементы загружаются в течение заданного неявного окна ожидания. Рекомендуется использовать в случаях, когда элементы загружаются дольше и при проверке состояний элементов, таких как visibilityOfElementLocated, elementToBeClickable или elementToBeSelected.
Настраивается один раз и применяется на протяжении всего жизненного цикла экземпляра WebDriver. Настраивается для каждого элемента или для каждой проверки, что обеспечивает более точный контроль.

Как выбрать правильную стратегию ожидания

Правильный выбор команды ожидания напрямую влияет на стабильность скрипта и время его выполнения. Используйте эту схему принятия решений для выбора подходящего варианта в каждом конкретном случае.

  1. Определите схему распределения нагрузки: Проверьте, появляется ли элемент в фиксированное время, после ответа Ajax или через непредсказуемые интервалы. Для фиксированных нагрузок подходит неявное ожидание (Implicit Wait), тогда как для непредсказуемых нагрузок требуется плавное ожидание (Fluent Wait).
  2. Избегайте смешивания неявных и явных ожиданий: Сочетание этих двух факторов может привести к неожиданным задержкам, поскольку более длительное ожидание может преобладать. Selenium В документации рекомендуется использовать только одну стратегию на сессию WebDriver.
  3. По умолчанию используется явное ожидание динамического контента: Когда страницы зависят от Ajax, условного рендеринга или анимации, Explicit Wait с ExpectedConditions нацелен именно на тот элемент, который имеет значение.
  4. Используйте Fluent Wait для изменения времени ожидания: Если время загрузки элементов различается между запусками, настройте Fluent Wait с интервалом опроса. Опрос сокращает общее время ожидания по сравнению с одним длительным таймаутом.
  5. Замените Thread.leep: Заранее заданные задержки замедляют выполнение тестовых наборов и скрывают реальные проблемы со временем выполнения. Замените их условными ожиданиями, чтобы обеспечить быстрое и детерминированное выполнение.
  6. Значения тайм-аута настройки: Начните с коротких таймаутов (5–10 секунд) и увеличивайте их только тогда, когда сбои действительно указывают на низкую загрузку. Длительные таймауты по умолчанию маскируют снижение производительности.
  7. Сохраняйте задержки во вспомогательных утилитах: Централизуйте логику ожидания во вспомогательном классе, чтобы изменения политики тайм-аута применялись ко всему набору тестов.

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

Распространенные ошибки, которых следует избегать при Selenium Ждет

Даже опытные тестировщики попадают в ряд повторяющихся ловушек при работе с... Selenium Ожидания. Избегание этих проблем позволяет создавать быстрые, детерминированные и простые в обслуживании скрипты для разных команд и сред.

Первая распространённая ошибка — чрезмерное использование Thread.sleep. Заданная жёстко пауза заставляет скрипт ждать всё время выполнения независимо от фактической доступности элемента, что увеличивает общее время выполнения. Замените такие паузы на Explicit или Fluent Wait, чтобы скрипт продолжал выполнение в момент выполнения условия.

Вторая ошибка — смешивание неявных и явных ожиданий в одном тесте. Эти два механизма могут суммироваться, создавая непредсказуемые тайм-ауты, которые трудно отлаживать. Выбирайте одну стратегию для каждой сессии WebDriver и применяйте её последовательно.

Третья ошибка — установка слишком больших значений тайм-аута «на всякий случай». Длительные значения по умолчанию скрывают реальные проблемы с производительностью и замедляют обратную связь в конвейерах непрерывной интеграции. Начинайте с коротких тайм-аутов и увеличивайте их только тогда, когда журналы ошибок подтверждают наличие реальной проблемы со временем выполнения.

Также проверьте: Selenium Учебник для начинающих: изучите WebDriver за 7 дней

Часто задаваемые вопросы (FAQ)

Время неявного ожидания по умолчанию в Selenium Значение WebDriver равно 0 секунд. Драйвер не приостанавливается при отсутствии элементов до тех пор, пока не будет вызван метод implicitlyWait с заданным значением Duration.

Thread.sleep безусловно приостанавливает выполнение на фиксированное время, независимо от готовности элемента. Это увеличивает общее время выполнения, маскирует проблемы с производительностью и приводит к ненадежным тестам. Явное и плавное ожидание возобновляются в момент выполнения условия.

Это не рекомендуется. Selenium В документации предупреждается, что сочетание обоих методов может привести к непредсказуемому времени ожидания. Для более наглядного поведения и упрощения отладки выбирайте одну стратегию для каждой сессии WebDriver, обычно это Explicit Wait или Fluent Wait.

Да. Платформы для тестирования на основе искусственного интеллекта, такие как TestimMabl и Functionize анализируют время отклика приложений и рекомендуют значения Explicit или Fluent Wait. Они сокращают время, затрачиваемое на настройку методом проб и ошибок, и динамически адаптируют тайм-ауты в зависимости от наблюдаемого поведения страницы.

Системы искусственного интеллекта изучают исторические закономерности нагрузки и автоматически корректируют интервалы опроса или временные окна ожидания. Когда тест неоднократно завершается с ошибкой вблизи временной границы, модель увеличивает время ожидания или переключается на более интеллектуальный режим, уменьшая количество нестабильных сбоев в ходе выполнения.

Подведем итог этой публикации следующим образом: