Восстановление от ошибок

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

Обработка ошибок с использованием try...catch

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

it('Проверка наличия кнопки "Отправить"', async () => {
    try {
        const button = await $('#submitButton');
        await button.waitForExist({ timeout: 5000 });
        expect(await button.isDisplayed()).toBe(true);
    } catch (error) {
        console.error('Ошибка при ожидании кнопки:', error);
        // Восстановление теста после ошибки
        expect(error).toBeNull();
    }
});

Этот подход позволяет сохранить работоспособность теста, даже если в какой-то момент элемент не был найден или не появился на странице.

Механизм ожидания элементов с waitFor*

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

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

it('Проверка доступности кнопки после загрузки', async () => {
    try {
        const button = await $('#submitButton');
        await button.waitForExist({ timeout: 10000 });
        await button.waitForDisplayed({ timeout: 10000 });
        expect(await button.isEnabled()).toBe(true);
    } catch (error) {
        console.error('Ошибка: кнопка не появилась на странице в течение 10 секунд', error);
        throw error;
    }
});

Таким образом, метод waitFor* в сочетании с обработкой ошибок позволяет повысить стабильность тестов и снизить вероятность неожиданных сбоев.

Восстановление после падения шага с помощью browser.refresh()

Иногда при выполнении тестов могут возникать такие ситуации, когда страница или её компоненты находятся в нестабильном состоянии, и для продолжения тестирования необходимо перезагрузить страницу. WebdriverIO предоставляет метод browser.refresh(), который позволяет обновить страницу, что может стать полезным инструментом для восстановления тестов.

it('Перезагрузка страницы при ошибке', async () => {
    const initialUrl = await browser.getUrl();
    try {
        // Имитируем ошибку
        const element = await $('#nonExistentElement');
        await element.click();
    } catch (error) {
        console.error('Ошибка при взаимодействии с элементом. Страница будет обновлена.');
        await browser.refresh();
        expect(await browser.getUrl()).toBe(initialUrl);
    }
});

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

Автоматическое повторение шага с использованием retries в конфигурации

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

Пример настройки повторных попыток в конфигурации:

exports.config = {
    maxInstances: 1,
    capabilities: [{
        browserName: 'chrome'
    }],
    jasmineNodeOpts: {
        defaultTimeoutInterval: 60000,
        retries: 3 // Количество повторных попыток
    }
};

Эта настройка полезна для устранения ложных сбоев, вызванных временными проблемами, такими как медленная загрузка страницы или непредсказуемое поведение элементов.

Логирование ошибок для дальнейшего анализа

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

it('Проверка логирования ошибок', async () => {
    const element = await $('#nonExistentElement');
    try {
        await element.click();
    } catch (error) {
        console.error('Ошибка при клике:', error.message);
        await browser.takeScreenshot(); // Снимок экрана для анализа
        throw error;
    }
});

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

Восстановление состояния браузера с использованием browser.setTimeout()

В некоторых случаях необходимо контролировать время выполнения тестов и реагировать на его превышение. WebdriverIO предоставляет функцию для изменения тайм-аутов выполнения различных шагов с помощью browser.setTimeout(). Это может быть полезно, если тесты зависят от конкретных условий или если загрузка страницы затягивается.

it('Настройка тайм-аутов для восстановления после ошибки', async () => {
    try {
        await browser.setTimeout({ 'pageLoad': 5000 });
        await browser.url('https://example.com');
    } catch (error) {
        console.error('Ошибка: страница не загрузилась в течение 5 секунд');
        await browser.refresh();  // Восстановление состояния
        await browser.setTimeout({ 'pageLoad': 10000 }); // Увеличение тайм-аута
    }
});

Этот подход позволяет более гибко управлять тестами и восстанавливать выполнение в случае возникновения проблем с производительностью.

Использование нестандартных обработчиков ошибок

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

it('Пример нестандартного обработчика ошибок', async () => {
    try {
        const element = await $('#submitButton');
        await element.click();
    } catch (error) {
        console.error('Ошибка при клике, очищаем куки...');
        await browser.deleteCookies();  // Очищаем cookies
        throw error;  // Повторное генерирование ошибки для анализа
    }
});

Такой подход помогает не только восстанавливать тесты, но и отслеживать специфические проблемы, которые могут возникать при взаимодействии с браузером.

Резюме

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