Одной из ключевых задач при автоматизации тестирования с использованием WebdriverIO является правильная обработка ошибок. В процессе тестирования могут возникать различные проблемы, такие как неудачные запросы, сбои на сервере или неожиданные изменения на веб-странице. Чтобы тесты были стабильными и надёжными, важно правильно обрабатывать ошибки сессии и обеспечивать корректное завершение теста, независимо от того, что произошло в процессе его выполнения.
Ошибка сессии в WebdriverIO может проявляться в разных формах. Иногда тест может завершиться с ошибкой из-за сбоев на сервере или проблем с сетевым соединением, а иногда — из-за ошибок в самом тесте, таких как неправильное использование API или взаимодействие с элементами страницы. Важно иметь стратегию для ловли этих ошибок и принятия соответствующих мер, чтобы минимизировать влияние на результат тестирования.
WebdriverIO использует механизм обработки ошибок, который позволяет тестировщику отслеживать и реагировать на возникающие исключения. Ошибки могут быть как синхронными, так и асинхронными. Обычно они включают в себя следующие категории:
Наиболее распространённый метод обработки ошибок в WebdriverIO — это
использование конструкции try-catch. Она позволяет
перехватывать ошибки, возникающие во время выполнения теста, и принимать
соответствующие меры, такие как логирование или повторная попытка
выполнения.
Пример:
describe('Тест с обработкой ошибок', () => {
it('Проверка наличия элемента на странице', async () => {
try {
const elem = await $('#nonexistent-element');
await elem.click();
} catch (error) {
console.error('Ошибка при взаимодействии с элементом:', error);
}
});
});
В этом примере, если элемент с id nonexistent-element не
найден, то ошибка будет перехвачена блоком catch, и будет
выведено сообщение в консоль.
Ожидания — это важный аспект обработки ошибок. WebdriverIO предоставляет встроенные механизмы для ожидания элементов, состояний или событий. Неверно настроенные таймауты могут привести к ложным срабатываниям ошибок, особенно если элементы загружаются с задержкой.
Использование явных ожиданий с установкой таймаутов помогает избежать ошибок, связанных с тем, что элемент ещё не доступен на странице.
Пример с ожиданием:
it('Ожидание элемента перед кликом', async () => {
const elem = await $('#submit-button');
await elem.waitForDisplayed({ timeout: 5000, timeoutMsg: 'Кнопка не отображена на странице за 5 секунд' });
await elem.click();
});
В данном примере WebdriverIO будет ждать, пока кнопка с id
submit-button не появится на странице, но не более 5
секунд. Если за это время кнопка не появится, будет выведено
соответствующее сообщение об ошибке.
Логирование ошибок — неотъемлемая часть обработки сессий. При возникновении исключений или сбоев важно сохранять подробную информацию о том, что произошло. WebdriverIO позволяет записывать подробные логи для диагностики ошибок.
Пример использования логирования:
it('Проверка логирования ошибок', async () => {
try {
const elem = await $('#nonexistent-element');
await elem.click();
} catch (error) {
browser.logger.error('Ошибка при клике на элемент:', error);
throw error; // Проброс ошибки дальше
}
});
Используя browser.logger, можно записывать ошибки и
другие важные данные в лог-файл, что поможет в дальнейшем анализе
проблемы.
Иногда требуется не просто поймать ошибку, но и попытаться восстановиться от неё. Например, если элемент не найден или не отображается на странице, можно попробовать выполнить повторный поиск элемента или переключить контекст.
Пример восстановления:
it('Попытка восстановления после ошибки', async () => {
let elem;
try {
elem = await $('#nonexistent-element');
} catch (error) {
console.error('Элемент не найден, пробуем ещё раз');
elem = await $('#retry-element');
}
await elem.click();
});
В этом случае, если первый поиск не удастся, будет предпринята попытка поиска другого элемента, и тест продолжит выполнение.
В WebdriverIO можно создавать собственные типы ошибок, которые будут полезны для более точной диагностики проблем в тестах. Для этого используется стандартный механизм JavaScript — создание собственных исключений.
Пример пользовательской ошибки:
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
it('Пример пользовательской ошибки', async () => {
try {
throw new CustomError('Произошла ошибка в тесте');
} catch (error) {
if (error instanceof CustomError) {
console.error('Обработана ошибка:', error.message);
}
}
});
Использование пользовательских ошибок позволяет сделать логи более понятными и структурированными.
В некоторых случаях WebdriverIO может генерировать ошибки, которые сложно классифицировать. Это могут быть ошибки, связанные с нестандартными конфигурациями, проблемами в среде тестирования или специфическими проблемами на веб-странице. В таких случаях полезно интегрировать тестирование с внешними системами мониторинга и отслеживания ошибок, такими как Sentry или LogRocket, для более детальной диагностики.
Пример интеграции с Sentry:
import * as Sentry from '@sentry/node';
Sentry.init({ dsn: 'https://example@sentry.io/12345' });
it('Тест с отправкой ошибок в Sentry', async () => {
try {
const elem = await $('#nonexistent-element');
await elem.click();
} catch (error) {
Sentry.captureException(error);
throw error;
}
});
Обработка ошибок сессии в WebdriverIO — важная часть обеспечения
стабильности тестов. Правильное использование блоков
try-catch, управление таймаутами и логирование ошибок
позволяют не только избежать падений тестов, но и точно диагностировать
проблемы, возникающие в процессе их выполнения. Важно помнить, что
качественная обработка ошибок повышает надёжность тестирования и делает
тесты более информативными.