Тестирование веб-приложений с использованием WebdriverIO часто требует работы с элементами, которые загружаются или изменяются во времени. В таких случаях важно правильно настроить время ожидания (таймауты), чтобы тесты выполнялись стабильно и не зависали. В этой главе рассмотрены ключевые механизмы управления временем в WebdriverIO и их использование для эффективного тестирования.
Неверно настроенные таймауты могут привести к сбоям тестов по нескольким причинам:
Задача тестировщика — правильно сбалансировать время ожидания, чтобы тесты не зависали на длительное время, но и не завершались преждевременно.
WebdriverIO предоставляет несколько типов таймаутов, которые могут быть использованы для управления временем в тестах.
Основной тип ожидания, с которым сталкивается тестировщик, — это
ожидание появления элементов на странице. В WebdriverIO для этого можно
использовать метод waitForDisplayed():
const elem = await $('#elementId');
await elem.waitForDisplayed({ timeout: 5000 });
Здесь элемент будет ожидаться до 5 секунд. Если за это время он не станет доступным, тест завершится ошибкой. Можно настроить дополнительные параметры:
timeout — время в миллисекундах.reverse — если установлено в true, тест
завершится успешно, когда элемент не будет виден.interval — интервал, с которым WebdriverIO будет
проверять доступность элемента.Для асинхронных операций, таких как запросы к серверу или выполнение скриптов, можно использовать методы, которые учитывают время ожидания:
browser.waitUntil(async () => {
const title = await browser.getTitle();
return title === 'Заголовок страницы';
}, {
timeout: 5000,
timeoutMsg: 'Заголовок страницы не совпал'
});
В этом случае тест будет ожидать, пока название страницы не станет нужным, с максимальным временем ожидания в 5 секунд. Если условие не выполнится, тест завершится с ошибкой.
WebdriverIO позволяет настроить глобальные таймауты, которые будут применяться ко всем операциям. Это удобно, когда нужно установить общий лимит для всех тестов, а не настраивать таймауты индивидуально для каждого действия.
Для настройки глобальных таймаутов нужно использовать параметры в конфигурации WebdriverIO:
exports.config = {
waitforTimeout: 10000, // 10 секунд на ожидание
connectionRetryTimeout: 90000, // 90 секунд для повторных попыток соединения
connectionRetryCount: 3 // Количество попыток для установления соединения
};
Эти параметры устанавливают время ожидания для всех команд, включая подключение к браузеру и выполнение асинхронных операций.
Для выполнения асинхронных операций в WebdriverIO можно использовать
методы, такие как waitUntil или pause. Метод
pause приостанавливает выполнение теста на указанное время
и может быть полезен, если необходимо подождать, например, после
выполнения скрипта или анимации:
await browser.pause(3000); // Пауза на 3 секунды
Этот метод полезен для задержки выполнения теста, однако его следует использовать с осторожностью, чтобы не замедлять тестирование без необходимости. Излишние паузы могут негативно сказаться на скорости выполнения тестов.
Если тест зависит от сетевых запросов (например, REST API), важно
убедиться, что ответы на запросы приходят вовремя. В WebdriverIO можно
использовать метод waitUntil для ожидания завершения
асинхронных операций.
Пример кода, ожидающего завершение HTTP-запроса:
await browser.waitUntil(async () => {
const status = await browser.executeAsync((done) => {
fetch('https://api.example.com')
.then(response => response.status)
.then(done);
});
return status === 200;
}, {
timeout: 10000,
timeoutMsg: 'API не вернул успешный статус'
});
Этот подход позволяет тестировать приложения, где сетевые запросы или загрузка данных являются критически важными для завершения теста.
Не существует универсального времени ожидания, которое подходит для всех типов тестов. Для фронтенд-тестов, где элементы страницы должны загружаться, может быть достаточно короткого времени ожидания (1-5 секунд). Для интеграционных тестов, которые включают взаимодействие с внешними сервисами, стоит увеличить таймауты для сетевых операций.
Тесты, зависимые от времени, часто приводят к ошибкам из-за неправильных настроек таймаутов. Важно правильно интерпретировать сообщения об ошибках, чтобы понимать, где именно не было соблюдено необходимое время ожидания.
Пример ошибки:
Error: Waiting for element with selector "button.submit" failed: timeout 5000ms exceeded
Это сообщение указывает, что элемент с селектором
button.submit не был найден за 5 секунд. Для исправления
ошибки стоит либо увеличить таймаут, либо убедиться, что элемент
доступен на странице.
pause()
могут замедлить тесты, если они используются без необходимости. Лучше
использовать ожидания для элементов или сетевых запросов, чтобы избежать
ненужных задержек.Точное управление временем в тестах WebdriverIO позволяет значительно повысить стабильность и скорость тестирования. Правильная настройка таймаутов помогает избежать ложных срабатываний тестов и значительно ускоряет процесс их выполнения, при этом гарантируя корректное выполнение всех действий, требующих асинхронной загрузки данных или взаимодействия с пользователем.