Обработка неожиданных диалогов

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


Основные типы диалогов

  1. Alert — простое уведомление с кнопкой «OK». Используется для информирования пользователя о событиях на странице.

  2. Confirm — окно с вариантами «OK» и «Cancel». Требует принятия или отклонения действия пользователем.

  3. Prompt — окно с полем для ввода текста. Пользователь может ввести данные и подтвердить или отменить действие.


Доступ к диалогам через browser.switchTo().alert()

Protractor предоставляет объект browser.switchTo().alert(), который позволяет:

  • Получить текст диалога: alert.getText()
  • Подтвердить диалог: alert.accept()
  • Отклонить диалог: alert.dismiss()
  • Ввести текст в prompt: alert.sendKeys('текст')

Пример обработки alert:

browser.switchTo().alert().then(alert => {
    alert.getText().then(text => {
        console.log('Текст диалога:', text);
    });
    alert.accept();
});

Для confirm диалогов:

browser.switchTo().alert().then(alert => {
    alert.dismiss(); // Отмена действия
});

Для prompt:

browser.switchTo().alert().then(alert => {
    alert.sendKeys('Введенный текст');
    alert.accept();
});

Асинхронная обработка диалогов

Так как Protractor использует асинхронные операции, важно правильно работать с промисами. Например:

it('обработка confirm', async () => {
    await element(by.id('deleteButton')).click();
    const alertDialog = await browser.switchTo().alert();
    const text = await alertDialog.getText();
    console.log('Confirm диалог:', text);
    await alertDialog.accept();
});

Использование async/await упрощает последовательность действий и делает код читаемым.


Обработка неожиданных диалогов с ожиданием

Если диалог может появиться не всегда, применяются ожидания через ExpectedConditions:

const EC = protractor.ExpectedConditions;
const alertPresent = EC.alertIsPresent();

await browser.wait(alertPresent, 5000, 'Диалог не появился');
const alertDialog = await browser.switchTo().alert();
await alertDialog.accept();

Здесь browser.wait позволяет подождать появления диалога до 5 секунд. Это предотвращает ошибки теста в случае его отсутствия.


Применение try/catch для устойчивости тестов

Для обработки неожиданного появления диалога можно использовать конструкцию try/catch:

try {
    const alertDialog = await browser.switchTo().alert();
    await alertDialog.accept();
} catch (e) {
    if (e.name === 'NoSuchAlertError') {
        console.log('Диалог не появился, продолжаем тест');
    } else {
        throw e;
    }
}

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


Обработка нескольких диалогов подряд

Если приложение может генерировать несколько диалогов один за другим, следует обрабатывать их в цикле:

let alertPresent = true;

while (alertPresent) {
    try {
        const alertDialog = await browser.switchTo().alert();
        console.log('Диалог:', await alertDialog.getText());
        await alertDialog.accept();
    } catch (e) {
        if (e.name === 'NoSuchAlertError') {
            alertPresent = false;
        } else {
            throw e;
        }
    }
}

Это гарантирует, что все последовательные диалоги будут обработаны и тест не зависнет.


Рекомендации по интеграции в тестовые сценарии

  • Минимизировать зависимость тестов от реальных диалогов. При возможности использовать заглушки или мок-данные.
  • Явное ожидание появления диалога предотвращает случайные ошибки при асинхронных действиях.
  • Логирование текста диалога полезно для анализа тестов и отладки.
  • Обработка prompt через sendKeys должна учитывать возможные ограничения на длину или формат вводимых данных.

Эти методы позволяют сделать тесты на Protractor устойчивыми к неожиданным диалоговым окнам, минимизировать зависание и автоматизировать полное управление пользовательскими взаимодействиями с alert, confirm и prompt.