Обработка ошибок сессии

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

Важность обработки ошибок

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

Структура ошибок сессии

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

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

Обработка ошибок с помощью try-catch

Наиболее распространённый метод обработки ошибок в 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, управление таймаутами и логирование ошибок позволяют не только избежать падений тестов, но и точно диагностировать проблемы, возникающие в процессе их выполнения. Важно помнить, что качественная обработка ошибок повышает надёжность тестирования и делает тесты более информативными.