Явные ожидания вместо неявных

Одним из самых важных аспектов автоматизации тестирования является правильная обработка времени ожидания, особенно в случае работы с динамическими веб-страницами, где элементы могут загружаться асинхронно. WebDriverIO предоставляет два типа ожиданий: неявные и явные. В этой статье будет подробно рассмотрено использование явных ожиданий и почему они предпочтительны перед неявными в большинстве случаев.

Что такое явные ожидания?

Явное ожидание в WebDriverIO — это механизм, который позволяет тесту ожидать появления конкретного элемента на странице или выполнения определённого условия, прежде чем продолжить выполнение следующих шагов. В отличие от неявных ожиданий, которые применяются ко всем элементам на странице, явные ожидания задаются для конкретных случаев и позволяют гораздо точнее управлять временем ожидания.

При использовании явных ожиданий тестирование становится более предсказуемым и надёжным, так как можно точно указать, какой элемент или событие должны быть проверены, и каким образом тест должен ждать. В WebDriverIO для явных ожиданий используется метод waitUntil() и классы, такие как waitForExist(), waitForDisplayed(), waitForClickable() и другие.

Преимущества явных ожиданий

  1. Точность. Явные ожидания дают возможность детально настроить время ожидания для конкретных элементов, что исключает проблемы с синхронизацией.
  2. Повторная использованность. Ожидания могут быть использованы для разных типов условий, таких как проверка наличия элемента, его видимости или кликабельности.
  3. Повышенная производительность. В отличие от неявных ожиданий, которые могут привести к излишним задержкам, явные ожидания выполняются только для конкретных случаев, минимизируя ненужное время ожидания.

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

Неявное ожидание устанавливается для всех элементов в браузере, что означает, что WebDriverIO будет пытаться найти элементы в течение заданного времени, прежде чем выбросить ошибку. Это ожидание не зависит от того, какой конкретно элемент находится на странице, и работает по принципу “подождать немного больше, если элемент ещё не появился”. Однако использование неявных ожиданий может привести к множественным непредсказуемым задержкам, особенно в случае сложных страниц с динамическим контентом.

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

Основные методы явных ожиданий в WebDriverIO

  1. waitForExist() Этот метод ожидает, пока элемент не появится в DOM. Он часто используется в тех случаях, когда необходимо дождаться, чтобы элемент был добавлен на страницу.

    Пример:

    const button = await $('#submit');
    await button.waitForExist({ timeout: 5000 });
  2. waitForDisplayed() Используется для ожидания, пока элемент не станет видимым на странице. Это может быть полезно в случае, когда элемент уже существует в DOM, но ещё не отображается на экране, например, при анимации или переходах.

    Пример:

    const modal = await $('.modal');
    await modal.waitForDisplayed({ timeout: 5000 });
  3. waitForClickable() Этот метод ждёт, пока элемент не станет кликабельным. Это особенно полезно, когда нужно дождаться, чтобы кнопка или ссылка были доступны для взаимодействия, например, после загрузки страницы или выполнения каких-либо асинхронных операций.

    Пример:

    const submitButton = await $('#submit');
    await submitButton.waitForClickable({ timeout: 5000 });
  4. waitUntil() Один из самых мощных инструментов для явных ожиданий. Этот метод позволяет задавать более сложные условия, такие как выполнение произвольных проверок с заданными задержками.

    Пример:

    await browser.waitUntil(
      async () => (await $('#result')).getText() === 'Success',
      {
        timeout: 5000,
        timeoutMsg: 'Expected result text not found'
      }
    );

Когда использовать явные ожидания?

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

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

Практические рекомендации по использованию явных ожиданий

  1. Определите необходимые условия для ожидания. В зависимости от того, что должно произойти на странице, выберите нужный метод ожидания: waitForExist(), waitForDisplayed(), waitForClickable() и так далее.
  2. Используйте разумные таймауты. Установка слишком больших значений для таймаутов может привести к чрезмерным задержкам в тестах. Рекомендуется задавать разумные пределы в зависимости от условий вашего приложения.
  3. Комбинируйте методы ожидания. В некоторых случаях может быть полезно использовать несколько методов ожидания для более сложных проверок. Например, сначала нужно дождаться появления элемента в DOM, а затем проверить его видимость или кликабельность.
  4. Планируйте ожидания для динамических элементов. Если ваше приложение содержит множество динамически загружаемых элементов, явные ожидания помогут избежать ошибок, связанных с попытками взаимодействовать с элементами, которые ещё не готовы.

Заключение

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