Fallback сценарии

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

Основные принципы создания Fallback сценариев

1. Идентификация проблемных точек

Прежде чем разрабатывать fallback сценарии, важно точно понимать, какие именно сценарии могут вызвать сбои. Это могут быть:

  • Задержки в загрузке элементов на странице.
  • Проблемы с взаимодействием с элементами (например, кнопка не активна).
  • Невозможность найти элементы на странице.
  • Ошибки на стороне сервера (например, сервер не отвечает).

2. Использование WebDriverIO ожиданий

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

Пример использования ожидания для fallback сценария:

try {
    await browser.waitUntil(
        async () => (await $('#element')).isDisplayed() === true,
        {
            timeout: 5000,
            timeoutMsg: 'Элемент не стал видимым за 5 секунд',
        }
    );
} catch (error) {
    console.error('Произошла ошибка при ожидании элемента: ', error);
    // Дополнительные fallback действия, например, повторная попытка
}

3. Ретраи с использованием временных решений

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

Пример ретраев:

async function retryAction() {
    let attempts = 0;
    const maxAttempts = 3;

    while (attempts < maxAttempts) {
        try {
            await $('#some-element').click();
            return; // Если клик удался, выходим
        } catch (error) {
            attempts++;
            if (attempts === maxAttempts) {
                throw new Error('Максимальное количество попыток было исчерпано');
            }
            console.log(`Попытка ${attempts} не удалась, пробуем снова...`);
            await browser.pause(1000); // Пауза перед следующей попыткой
        }
    }
}

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

4. Проверка состояния элементов перед взаимодействием

Важным аспектом стабильности тестов является необходимость проверки состояния элементов перед их использованием. К примеру, элементы могут быть неактивными или заблокированными, и попытка взаимодействовать с ними приведет к сбою. В таких случаях стоит использовать метод .isEnabled(), чтобы убедиться, что элемент можно использовать.

Пример:

const button = await $('#submit-button');
if (await button.isEnabled()) {
    await button.click();
} else {
    console.log('Кнопка неактивна, применяем fallback');
    // Применение альтернативных шагов
}

5. Перехват ошибок через обработчики

WebDriverIO предоставляет встроенные механизмы для обработки исключений. Это может быть полезно для написания fallback сценариев, которые реагируют на определенные ошибки в процессе выполнения тестов. Например, можно ловить ошибки на уровне тестов или браузера и принимать альтернативные действия.

Пример:

browser.on('error', (error) => {
    console.error('Произошла ошибка в браузере: ', error);
    // Логика обработки ошибки, например, перезапуск теста
});

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

6. Использование логирования для диагностики и адаптации

Для построения fallback сценариев важно собирать подробную информацию о ходе выполнения теста. Логирование позволяет отслеживать, где именно происходят ошибки, и позволяет адаптировать fallback сценарии под специфические условия тестирования. WebDriverIO предоставляет встроенные средства для логирования через browser.log(), а также возможность записи журналов с подробным описанием этапов выполнения теста.

Пример логирования:

browser.addCommand('logMessage', (message) => {
    console.log(`[Test log]: ${message}`);
});

await browser.logMessage('Тестирование элемента #login-button');

Логирование поможет в понимании, какие именно проблемы требуют вмешательства и настройки fallback сценариев.

Применение fallback сценариев при тестировании с использованием сложных интерфейсов

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

Пример с обработкой нескольких шагов:

try {
    const form = await $('#login-form');
    await form.waitForDisplayed();

    await $('#username').setValue('testUser');
    await $('#password').setValue('password123');

    const submitButton = await $('#submit-button');
    if (await submitButton.isEnabled()) {
        await submitButton.click();
    } else {
        console.log('Кнопка отправки формы неактивна, пробуем обновить страницу');
        await browser.refresh();
        await submitButton.click();
    }
} catch (error) {
    console.error('Ошибка в процессе теста: ', error);
    // Дополнительная обработка ошибок, например, логирование
}

Заключение

Создание и использование fallback сценариев в WebDriverIO — это важная часть обеспечения надежности автоматизированных тестов. Правильно настроенные сценарии позволяют обрабатывать непредвиденные ситуации, минимизировать сбои и адаптировать тесты под различные условия. Основной задачей является предотвращение неудачных тестов, а также минимизация времени, потраченного на выявление и исправление ошибок, что значительно повышает стабильность процесса тестирования в целом.