В тестировании веб-приложений часто требуется взаимодействие с диалоговыми окнами браузера, такими как alert, confirm и prompt. Protractor предоставляет удобные методы для работы с этими окнами, позволяя считывать их содержимое, подтверждать или отклонять действия пользователя и проверять корректность сообщений.
alert в
Protractoralert — это простое модальное окно браузера, которое
отображает сообщение пользователю и имеет одну кнопку
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.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 и promptConfirm и prompt также рассматриваются как алерты, но с расширенными возможностями:
accept() или
dismiss().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();
Замечания:
NoAlertPresentError Возникает, если алерт не
появился. Решение — использовать
ExpectedConditions.alertIsPresent() с
browser.wait().
UnhandledAlertError Появляется, если алерт
блокирует выполнение скрипта. Решение — всегда переключаться на алерт и
либо accept(), либо dismiss().
Асинхронные проблемы с .then()
Рекомендовано использовать async/await для
последовательного выполнения операций с алертом.
prompt использовать sendKeys() до
accept().ExpectedConditions, а не прямой вызов
browser.switchTo().alert() без ожидания.Этот подход позволяет безопасно и последовательно получать текст из алертов, проверять его и управлять взаимодействием пользователя с диалоговыми окнами в Protractor.