Работа с popup окнами

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


Типы popup окон

  1. Alert — простое сообщение с кнопкой «OK».
  2. Confirm — сообщение с кнопками «OK» и «Cancel».
  3. Prompt — сообщение с полем для ввода текста и кнопками «OK» и «Cancel».

Каждый тип окна обрабатывается схожим образом, но имеет свои особенности.


Переключение на popup окно

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

  • считать текст сообщения (getText()),
  • подтвердить действие (accept()),
  • отменить действие (dismiss()),
  • ввести текст (sendKeys() для prompt).

Пример переключения на окно:

let alertPopup = browser.switchTo().alert();

После этого alertPopup становится объектом для управления popup.


Работа с alert

Alert содержит только текст и кнопку подтверждения.

it('должен подтвердить alert', async () => {
    await element(by.id('showAlert')).click();
    let alertPopup = browser.switchTo().alert();
    let message = await alertPopup.getText();
    console.log('Текст alert:', message);
    await alertPopup.accept();  // нажать OK
});

Важный момент: перед вызовом accept() обязательно нужно дождаться появления окна, иначе тест завершится с ошибкой. В Protractor это можно сделать через ExpectedConditions:

let EC = protractor.ExpectedConditions;
await browser.wait(EC.alertIsPresent(), 5000, 'Alert не появился');

Работа с confirm

Confirm предоставляет выбор между подтверждением и отменой действия.

it('должен отклонить confirm', async () => {
    await element(by.id('showConfirm')).click();
    let EC = protractor.ExpectedConditions;
    await browser.wait(EC.alertIsPresent(), 5000, 'Confirm не появился');
    
    let confirmPopup = browser.switchTo().alert();
    let message = await confirmPopup.getText();
    console.log('Текст confirm:', message);
    await confirmPopup.dismiss();  // нажать Cancel
});

Для подтверждения действия используется accept(). При необходимости можно проверять текст окна перед выбором действия, что особенно полезно для динамических сообщений.


Работа с prompt

Prompt позволяет вводить текст в поле ввода.

it('должен ввести текст в prompt', async () => {
    await element(by.id('showPrompt')).click();
    let EC = protractor.ExpectedConditions;
    await browser.wait(EC.alertIsPresent(), 5000, 'Prompt не появился');

    let promptPopup = browser.switchTo().alert();
    await promptPopup.sendKeys('Тестовое значение');
    await promptPopup.accept();
});

Если необходимо отменить ввод, используется dismiss(). Проверка текста через getText() работает аналогично alert и confirm.


Асинхронность и ожидания

Все методы popup окон возвращают промисы, поэтому важно использовать async/await. Без этого возможны ошибки из-за того, что окно может появиться позже вызова метода.

Пример с проверкой текста перед подтверждением:

it('должен подтвердить alert с проверкой текста', async () => {
    await element(by.id('showAlert')).click();
    let EC = protractor.ExpectedConditions;
    await browser.wait(EC.alertIsPresent(), 5000);

    let alertPopup = browser.switchTo().alert();
    let text = await alertPopup.getText();
    if (text === 'Ожидаемое сообщение') {
        await alertPopup.accept();
    } else {
        await alertPopup.dismiss();
    }
});

Советы по надежной работе с popup

  1. Всегда использовать ExpectedConditions.alertIsPresent() для ожидания появления окна.
  2. Проверять текст окна перед подтверждением или отменой, чтобы избежать случайных действий.
  3. Использовать async/await для последовательного выполнения действий.
  4. Не забывать, что после закрытия окна управление возвращается на основное окно страницы.

Работа с множественными окнами

Иногда popup может открывать новое браузерное окно, а не alert. В этом случае используется:

let handles = await browser.getAllWindowHandles();
await browser.switchTo().window(handles[1]); // переключение на новое окно
await browser.close();                        // закрыть popup
await browser.switchTo().window(handles[0]); // возврат на основное окно

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


Логирование и отладка

Для отладки popup полезно выводить текст окон в консоль:

console.log(await browser.switchTo().alert().getText());

Также можно использовать browser.sleep() на короткое время для визуального контроля действий, но в стабильных тестах лучше применять ExpectedConditions.


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