В процессе автоматизированного тестирования на WebdriverIO могут возникать различные сбои: нестабильное интернет-соединение, ошибки на стороне сервера, некорректные ожидания элементов, проблемы с синхронизацией и другие. Эти сбои могут приводить к неудачным тестам или нестабильным результатам. Важно не только выявить и устранить причину сбоя, но и иметь в арсенале методы для восстановления после таких ситуаций, чтобы минимизировать негативное влияние на процесс тестирования.
Одним из эффективных способов восстановления после сбоев является
использование ретрай-механизмов. Этот подход позволяет повторить
неудавшийся шаг или действие в тесте, если оно не было выполнено
успешно. WebdriverIO предоставляет несколько инструментов для реализации
таких механизмов, например, через retry в конфигурационных
файлах или с помощью добавления логики повторов в код тестов.
WebdriverIO позволяет настраивать количество повторных попыток для
каждого теста или шага с помощью параметра retry в
конфигурации. Например, можно указать количество повторов для каждого
теста при возникновении ошибок:
exports.config = {
retries: 3, // Повторить тест 3 раза при сбое
...
};
Кроме того, можно настроить поведение при сбоях для различных типов ошибок:
exports.config = {
maxInstances: 5,
capabilities: [{
maxRetry: 3 // Количество повторов на уровне отдельной капабилити
}],
...
};
Можно использовать кастомные функции для повторных попыток внутри тестов. Например, при попытке взаимодействия с элементами, если первоначальное обращение к элементу неудачно, можно повторить попытку с небольшими задержками.
function retryAction(action, retries = 3, delay = 1000) {
let attempts = 0;
while (attempts < retries) {
try {
return action();
} catch (error) {
attempts++;
if (attempts < retries) {
console.log(`Попытка ${attempts} неудачна, повторяю через ${delay}мс`);
browser.pause(delay);
} else {
throw error;
}
}
}
}
// Пример использования
retryAction(() => $('#element').click(), 3, 500);
Для того чтобы предотвратить фатальные сбои в тестах, можно
использовать блоки try-catch. Это позволяет корректно
обрабатывать ошибки и продолжать выполнение тестов или предпринимать
действия по восстановлению.
try {
$('#element').click();
} catch (e) {
console.error('Ошибка при клике на элемент:', e);
// Механизм восстановления или логирования
browser.pause(1000);
$('#element').click(); // Повторная попытка
}
Использование try-catch помогает в ряде случаев не
только поймать исключения, но и провести дополнительные действия, такие
как логирование ошибок или выполнение восстановления.
Ошибка подключения к серверу или потери интернета также могут вызвать сбои. В таких случаях важным моментом является настройка WebdriverIO для корректного восстановления соединения. Например, можно задать более высокие тайм-ауты для соединений и команд:
exports.config = {
connectionRetryTimeout: 120000, // Увеличить тайм-аут соединения
connectionRetryCount: 3, // Количество попыток для соединения
...
};
При возникновении проблемы с соединением WebdriverIO будет повторно пытаться установить соединение в течение указанного времени.
Тайм-ауты — частая причина сбоя тестов, особенно когда элементы на странице загружаются слишком долго или их наличие не успевает обнаружиться до истечения лимита. В таких случаях важно правильно настроить задержки и ожидания.
WebdriverIO предоставляет метод waitForExist(), который
позволяет тесту подождать появления элемента на странице, а затем
выполнить действия с ним.
$('#element').waitForExist({ timeout: 5000, timeoutMsg: 'Элемент не найден!' });
Если элемент не появился в течение указанного времени, тест завершится с ошибкой. Однако можно настроить большее количество повторов для этого ожидания или же использовать другие методы для синхронизации.
Важным аспектом восстановления является правильное ожидание появления
элемента на странице и его видимости. Метод
waitForDisplayed() выполняет ожидание, пока элемент не
станет видимым.
$('#element').waitForDisplayed({ timeout: 5000, timeoutMsg: 'Элемент не отображается' });
Для быстрого восстановления после сбоев важно собирать как можно больше информации о причине сбоя. В WebdriverIO существует встроенная поддержка логирования, которая позволяет отслеживать и анализировать возникшие проблемы.
browser.addCommand('logAndRetry', function (action, retries = 3) {
let attempts = 0;
while (attempts < retries) {
try {
return action();
} catch (error) {
attempts++;
console.error(`Ошибка при выполнении действия: ${error.message}`);
if (attempts < retries) {
browser.pause(1000); // Пауза перед повтором
} else {
throw error; // Если все попытки неудачны — пробрасываем ошибку
}
}
}
});
Дополнительно можно использовать сторонние библиотеки для более подробного логирования и анализа тестов. Логирование помогает в диагностике проблем, их анализе и планировании восстановления.
При параллельном запуске тестов также важно предусмотреть возможность восстановления в случае сбоя. WebdriverIO позволяет запускать тесты параллельно, но в случае возникновения проблемы в одном тесте важно правильно обработать исключения и сбои, чтобы не нарушить работу других тестов.
Чтобы восстановить параллельные тесты, нужно:
В случае серьёзных сбоев, таких как ошибки на сервере, поломка внешней системы или других инфраструктурных проблем, важно иметь возможность восстановить тестовую среду. В таких случаях полезно использовать подходы инфраструктуры как код (IaC), автоматизированное восстановление среды с помощью Docker или Kubernetes, или же настройку тестовых данных в соответствии с заранее заданным состоянием.
Использование Docker позволяет запускать тесты в стандартизированных контейнерах, что упрощает восстановление и предотвращает влияние внешних факторов.
Восстановление после сбоев — это важная часть стратегии автоматизированного тестирования, которая включает в себя использование ретрай-механизмов, обработку ошибок, правильную настройку тайм-аутов, логирование и восстановление тестовой среды. Разработчики, использующие WebdriverIO, должны заранее предусматривать возможные сбои и разрабатывать стратегии, которые минимизируют их влияние на процесс тестирования.