Получение текста из алёрта

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


Работа с alert в Protractor

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

Пример базового взаимодействия:

// Переключение на alert
let alertDialog = browser.switchTo().alert();

// Получение текста из alert
alertDialog.getText().then(function(text) {
    console.log("Текст алерта:", text);
});

// Подтверждение алерта (нажатие OK)
alertDialog.accept();

Ключевые моменты:

  • browser.switchTo().alert() возвращает объект типа Alert, с которым можно работать.
  • Метод getText() возвращает Promise, который разрешается в текст сообщения.
  • accept() закрывает алерт кнопкой OK.
  • Если требуется отмена (для confirm/prompt), используется dismiss().

Обработка алерта с ожиданием

В реальных приложениях алерт может появляться с задержкой после выполнения действия. Для надежного получения текста используется ожидание появления алерта через ExpectedConditions.

const EC = protractor.ExpectedConditions;

// Ждем появления алерта
browser.wait(EC.alertIsPresent(), 5000, "Алерт не появился");

// Переключаемся на алерт
let alertDialog = browser.switchTo().alert();

// Получаем текст
alertDialog.getText().then(function(text) {
    console.log("Текст алерта:", text);
    expect(text).toEqual("Ожидаемое сообщение");
});

// Подтверждаем алерт
alertDialog.accept();

Пояснения:

  • ExpectedConditions.alertIsPresent() возвращает функцию, которая проверяет наличие алерта.
  • browser.wait() ожидает указанное время, пока условие не станет истинным. Это предотвращает ошибки типа NoAlertPresentError, когда алерт ещё не успел появиться.

Получение текста из confirm и prompt

Confirm и prompt также рассматриваются как алерты, но с расширенными возможностями:

  • Confirm: два варианта — accept() или dismiss().
  • Prompt: можно вводить текст с помощью sendKeys() перед accept().

Пример для prompt:

browser.wait(EC.alertIsPresent(), 5000);
let promptDialog = browser.switchTo().alert();

// Получение текста prompt
promptDialog.getText().then(function(text) {
    console.log("Текст prompt:", text);
});

// Ввод текста
promptDialog.sendKeys("Пример ввода");

// Подтверждение
promptDialog.accept();

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

  • sendKeys() применим только к prompt, где пользователь может ввести текст.
  • После accept() введенный текст передается в скрипт страницы.

Асинхронный подход с async/await

Современный стиль тестов на Protractor предполагает использование async/await для более чистого и читаемого кода.

const EC = protractor.ExpectedConditions;

await browser.wait(EC.alertIsPresent(), 5000);
const alertDialog = await browser.switchTo().alert();

const alertText = await alertDialog.getText();
console.log("Текст алерта:", alertText);

await alertDialog.accept();

Преимущества такого подхода:

  • Нет необходимости использовать .then(), код выглядит линейным.
  • Легче отлавливать ошибки и выполнять проверку текста алерта в expect().

Проверка текста алерта в тестах

Считывание текста алерта часто используется для ассертов:

const EC = protractor.ExpectedConditions;

await browser.wait(EC.alertIsPresent(), 5000);
const alertDialog = await browser.switchTo().alert();

const alertText = await alertDialog.getText();
expect(alertText).toBe("Пользователь успешно создан");

await alertDialog.accept();

Замечания:

  • Использование ожиданий обязательно для стабильности тестов.
  • Проверка текста позволяет убедиться, что приложение корректно реагирует на действия пользователя.

Возможные ошибки и их обработка

  1. NoAlertPresentError Возникает, если алерт не появился. Решение — использовать ExpectedConditions.alertIsPresent() с browser.wait().

  2. UnhandledAlertError Появляется, если алерт блокирует выполнение скрипта. Решение — всегда переключаться на алерт и либо accept(), либо dismiss().

  3. Асинхронные проблемы с .then() Рекомендовано использовать async/await для последовательного выполнения операций с алертом.


Советы по работе с алертами

  • Всегда ожидать появления алерта перед взаимодействием.
  • Проверять текст алерта для подтверждения правильной логики приложения.
  • Для prompt использовать sendKeys() до accept().
  • Для надежности тестов лучше использовать ExpectedConditions, а не прямой вызов browser.switchTo().alert() без ожидания.

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