Обработка alert окон

В веб-тестировании часто встречается необходимость взаимодействия с модальными окнами, такими как alert, confirm и prompt. WebdriverIO предоставляет удобные методы для управления такими окнами, позволяя автоматизировать сценарии, которые требуют подтверждения или ввода данных.


Основные методы работы с alert

WebdriverIO использует объект browser для управления модальными окнами. Основные методы:

  • browser.getAlertText() Возвращает текст текущего alert окна. Используется для проверки содержимого уведомления.

    const alertText = await browser.getAlertText();
    console.log(alertText); // Выводит текст alert
  • browser.acceptAlert() Подтверждает alert, эквивалентно нажатию кнопки “OK”.

    await browser.acceptAlert();
  • browser.dismissAlert() Отменяет alert, аналог кнопки “Cancel”.

    await browser.dismissAlert();
  • browser.sendAlertText(text) Вводит текст в prompt окно. Используется только для prompt.

    await browser.sendAlertText('Тестовое сообщение');
    await browser.acceptAlert();

Последовательность действий с alert

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

    await browser.waitUntil(
        async () => await browser.isAlertOpen(),
        {
            timeout: 5000,
            timeoutMsg: 'Alert не появился в течение 5 секунд'
        }
    );
  2. Получение текста и проверка Часто проверка текста alert является частью теста на корректность работы приложения.

    const text = await browser.getAlertText();
    expect(text).toBe('Вы уверены, что хотите удалить элемент?');
  3. Действие с окном Выбор между подтверждением или отменой зависит от логики теста.

    await browser.acceptAlert(); // подтверждение
    // или
    await browser.dismissAlert(); // отмена
  4. Работа с prompt В prompt можно передавать текст перед подтверждением.

    await browser.sendAlertText('Новый заголовок');
    await browser.acceptAlert();

Проверка наличия alert

Метод browser.isAlertOpen() возвращает true, если окно открыто, и false, если нет. Это позволяет безопасно выполнять действия, не вызывая ошибок при отсутствии alert:

if (await browser.isAlertOpen()) {
    await browser.acceptAlert();
}

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

Попытка взаимодействия с несуществующим alert вызовет исключение. Чтобы избежать сбоев теста, рекомендуется использовать проверки:

try {
    if (await browser.isAlertOpen()) {
        await browser.acceptAlert();
    }
} catch (error) {
    console.error('Alert не удалось обработать:', error.message);
}

Особенности различных браузеров

  • В Chrome и Firefox поддержка alert, confirm и prompt встроена и полностью совместима с WebdriverIO.
  • Safari может вести себя иначе при асинхронных alert, поэтому рекомендуется всегда проверять isAlertOpen() перед действием.
  • В мобильных браузерах и WebView alert также поддерживаются, но обработка может быть специфичной для платформы.

Практические сценарии использования

  • Подтверждение удаления: проверка текста и последующее нажатие “OK”.
  • Отмена действия: проверка реакции системы на отказ пользователя.
  • Ввод данных через prompt: автоматизация тестов форм с модальными окнами ввода.
  • Асинхронные alert: сценарии, когда окно появляется через несколько секунд после действия, требуют waitUntil или ожидания определённого события.

Рекомендации по стабильности тестов

  • Всегда использовать isAlertOpen() или waitUntil перед попыткой взаимодействия.
  • Проверять текст alert для уверенности в том, что открыто нужное окно.
  • Для prompt сначала отправлять текст, а затем подтверждать, чтобы избежать состояния гонки.
  • Логировать текст alert для отладки и анализа тестов.

Объединение этих методов позволяет полностью управлять alert окнами в WebdriverIO, обеспечивая стабильность и предсказуемость тестов, особенно при асинхронных или динамических интерфейсах.