Работа с alert()

Protractor — это инструмент для автоматизированного тестирования Angular и AngularJS приложений, построенный поверх WebDriverJS. Одной из часто встречающихся задач в тестировании веб-приложений является работа с модальными окнами браузера, такими как alert(), confirm() и prompt(). В JavaScript эти окна создаются стандартными методами браузера, но в автоматизированных тестах требуют особого подхода.


Основные методы для работы с alert()

Protractor предоставляет удобный объект browser.switchTo().alert(), который позволяет переключаться на модальные окна и взаимодействовать с ними. Основные методы объекта alert:

  • accept() — подтверждает алерт, аналогично клику по кнопке «OK».
  • dismiss() — отклоняет алерт, аналогично клику по кнопке «Cancel».
  • getText() — возвращает текст, отображаемый в алерте.
  • sendKeys(value) — ввод текста в prompt.

Пример базового использования:

it('должен принять alert', async () => {
    await element(by.id('show-alert')).click();
    let alertDialog = await browser.switchTo().alert();
    let text = await alertDialog.getText();
    console.log('Текст алерта:', text);
    await alertDialog.accept();
});

В этом примере происходит следующее:

  1. Нажатие на элемент, который вызывает alert().
  2. Переключение на окно алерта через browser.switchTo().alert().
  3. Получение текста алерта через getText().
  4. Подтверждение алерта с помощью accept().

Работа с confirm()

confirm() отличается от alert() наличием кнопки «Cancel». Для работы с ним можно использовать те же методы:

it('должен отклонить confirm', async () => {
    await element(by.id('show-confirm')).click();
    let confirmDialog = await browser.switchTo().alert();
    let text = await confirmDialog.getText();
    console.log('Текст confirm:', text);
    await confirmDialog.dismiss(); // отклонение действия
});
  • accept() — согласие с действием.
  • dismiss() — отклонение действия.

Важно учитывать, что dismiss() и accept() возвращают промис, поэтому при использовании async/await необходимо дожидаться их выполнения.


Работа с prompt()

prompt() позволяет пользователю ввести текст, что требует метода sendKeys() для автоматизации:

it('должен ввести текст в prompt', async () => {
    await element(by.id('show-prompt')).click();
    let promptDialog = await browser.switchTo().alert();
    await promptDialog.sendKeys('Тестовое сообщение');
    await promptDialog.accept();
});

Особенности:

  • Если вызвать accept() без sendKeys(), текст в поле не будет введён.
  • dismiss() игнорирует введённый текст и закрывает окно.

Обработка ошибок при работе с alert()

При автоматизации часто возникает ситуация, когда алерт не появляется. Protractor выбрасывает исключение NoSuchAlertError. Для безопасной обработки используют конструкции try/catch:

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

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


Ждём появления alert

Поскольку алерты могут появляться асинхронно, часто используется ExpectedConditions для ожидания:

const EC = protractor.ExpectedConditions;

await element(by.id('show-alert')).click();
await browser.wait(EC.alertIsPresent(), 5000, 'Алерт не появился в течение 5 секунд');
let alertDialog = await browser.switchTo().alert();
await alertDialog.accept();
  • alertIsPresent() — проверяет наличие модального окна.
  • Время ожидания указывается в миллисекундах.
  • Сообщение ошибки полезно для диагностики.

Рекомендации по использованию alert() в тестах

  1. Всегда использовать ожидание появления алерта через ExpectedConditions, особенно при асинхронных событиях.
  2. Использовать try/catch для обработки случаев, когда алерт не появляется.
  3. При работе с prompt() всегда проверять, что sendKeys() выполнен до accept().
  4. Логировать текст алерта для диагностики и отладки тестов.
  5. Не использовать методы алерта вне контекста browser.switchTo(), иначе тест упадёт.

Пример комплексного сценария

it('обрабатывает все типы alert', async () => {
    const EC = protractor.ExpectedConditions;

    // Работа с alert
    await element(by.id('show-alert')).click();
    await browser.wait(EC.alertIsPresent(), 5000);
    let alertDialog = await browser.switchTo().alert();
    console.log(await alertDialog.getText());
    await alertDialog.accept();

    // Работа с confirm
    await element(by.id('show-confirm')).click();
    await browser.wait(EC.alertIsPresent(), 5000);
    let confirmDialog = await browser.switchTo().alert();
    console.log(await confirmDialog.getText());
    await confirmDialog.dismiss();

    // Работа с prompt
    await element(by.id('show-prompt')).click();
    await browser.wait(EC.alertIsPresent(), 5000);
    let promptDialog = await browser.switchTo().alert();
    await promptDialog.sendKeys('Пример текста');
    await promptDialog.accept();
});

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

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