Принятие алёртов

В автоматизированном тестировании веб-приложений часто возникает необходимость работы с модальными окнами браузера — алёртами, подтверждениями (confirm) и вводом данных (prompt). Protractor предоставляет встроенные возможности для взаимодействия с ними через объект browser.switchTo().alert().

Основные методы для работы с алёртами

browser.switchTo().alert() возвращает объект Alert, который содержит следующие ключевые методы:

  • accept() — подтверждает алёрт, аналог нажатия кнопки “OK”.
  • dismiss() — отклоняет алёрт, аналог нажатия кнопки “Cancel”.
  • getText() — получает текст сообщения алёрта.
  • sendKeys(text) — вводит текст в алёрт типа prompt.

Пример простого алёрта

it('должен принимать простой алёрт', async () => {
    await element(by.id('alertButton')).click();

    const alertDialog = await browser.switchTo().alert();
    const alertText = await alertDialog.getText();
    console.log('Текст алёрта:', alertText);

    await alertDialog.accept();
});

В этом примере сначала производится клик по кнопке, вызывающей алёрт. Затем с помощью switchTo().alert() происходит переключение на модальное окно, после чего его текст считывается и подтверждается кнопкой “OK”.

Работа с подтверждениями (confirm)

Алёрт типа confirm имеет две кнопки: OK и Cancel.

it('должен отклонять confirm', async () => {
    await element(by.id('confirmButton')).click();

    const confirmDialog = await browser.switchTo().alert();
    await confirmDialog.dismiss(); // Нажатие Cancel
});

Если требуется подтвердить действие, используется accept(). Для проверки реакции приложения на нажатие “Cancel” используется dismiss().

Работа с алёртами типа prompt

prompt позволяет вводить данные в текстовое поле алёрта.

it('должен вводить текст в prompt', async () => {
    await element(by.id('promptButton')).click();

    const promptDialog = await browser.switchTo().alert();
    await promptDialog.sendKeys('Тестовый ввод');
    await promptDialog.accept();
});

После ввода текста и подтверждения кнопкой “OK” приложение получает введённые данные, что позволяет проверять обработку ввода.

Обработка асинхронности и ожидания алёртов

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

const EC = protractor.ExpectedConditions;

it('должен дождаться появления алёрта', async () => {
    await element(by.id('delayedAlertButton')).click();

    await browser.wait(EC.alertIsPresent(), 5000, 'Алёрт не появился в течение 5 секунд');

    const alertDialog = await browser.switchTo().alert();
    await alertDialog.accept();
});

ExpectedConditions.alertIsPresent() проверяет наличие алёрта, а browser.wait() приостанавливает выполнение теста до появления модального окна или истечения таймаута.

Советы по стабильной работе с алёртами

  • Всегда использовать ожидания для алёртов, чтобы избежать ошибок NoAlertPresentError.
  • Логировать текст алёрта при сложных сценариях для упрощения отладки.
  • Разделять тесты по типу алёрта: простые, confirm, prompt — это упрощает поддержку кода.
  • Избегать сложной логики внутри accept() или dismiss(); вся проверка состояния приложения должна происходить после взаимодействия с алёртом.

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

it('комплексная проверка алёртов', async () => {
    // Проверка простого алёрта
    await element(by.id('alertButton')).click();
    let alertDialog = await browser.switchTo().alert();
    console.log(await alertDialog.getText());
    await alertDialog.accept();

    // Проверка confirm
    await element(by.id('confirmButton')).click();
    alertDialog = await browser.switchTo().alert();
    await alertDialog.dismiss();

    // Проверка prompt
    await element(by.id('promptButton')).click();
    alertDialog = await browser.switchTo().alert();
    await alertDialog.sendKeys('Hello World');
    await alertDialog.accept();
});

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

Работа с алёртами в Protractor требует внимания к асинхронности, правильного использования методов объекта Alert и явных ожиданий, что позволяет создавать стабильные и предсказуемые автоматизированные тесты.