В процессе автоматизированного тестирования веб-приложений с помощью Protractor нередко возникает необходимость работы с неожиданными диалоговыми окнами: alert, confirm и prompt. Такие окна блокируют выполнение скрипта до момента их закрытия, что может привести к сбою теста, если диалог не обработан. Protractor предоставляет встроенные инструменты для безопасного управления этими ситуациями.
Alert — простое уведомление с кнопкой «OK». Используется для информирования пользователя о событиях на странице.
Confirm — окно с вариантами «OK» и «Cancel». Требует принятия или отклонения действия пользователем.
Prompt — окно с полем для ввода текста. Пользователь может ввести данные и подтвердить или отменить действие.
browser.switchTo().alert()Protractor предоставляет объект
browser.switchTo().alert(), который позволяет:
alert.getText()alert.accept()alert.dismiss()alert.sendKeys('текст')Пример обработки alert:
browser.switchTo().alert().then(alert => {
alert.getText().then(text => {
console.log('Текст диалога:', text);
});
alert.accept();
});
Для confirm диалогов:
browser.switchTo().alert().then(alert => {
alert.dismiss(); // Отмена действия
});
Для prompt:
browser.switchTo().alert().then(alert => {
alert.sendKeys('Введенный текст');
alert.accept();
});
Так как Protractor использует асинхронные операции, важно правильно работать с промисами. Например:
it('обработка confirm', async () => {
await element(by.id('deleteButton')).click();
const alertDialog = await browser.switchTo().alert();
const text = await alertDialog.getText();
console.log('Confirm диалог:', text);
await alertDialog.accept();
});
Использование async/await упрощает последовательность
действий и делает код читаемым.
Если диалог может появиться не всегда, применяются
ожидания через ExpectedConditions:
const EC = protractor.ExpectedConditions;
const alertPresent = EC.alertIsPresent();
await browser.wait(alertPresent, 5000, 'Диалог не появился');
const alertDialog = await browser.switchTo().alert();
await alertDialog.accept();
Здесь browser.wait позволяет подождать появления диалога
до 5 секунд. Это предотвращает ошибки теста в случае его отсутствия.
Для обработки неожиданного появления диалога можно использовать
конструкцию try/catch:
try {
const alertDialog = await browser.switchTo().alert();
await alertDialog.accept();
} catch (e) {
if (e.name === 'NoSuchAlertError') {
console.log('Диалог не появился, продолжаем тест');
} else {
throw e;
}
}
Такой подход позволяет безопасно продолжать выполнение теста, если диалог не возник.
Если приложение может генерировать несколько диалогов один за другим, следует обрабатывать их в цикле:
let alertPresent = true;
while (alertPresent) {
try {
const alertDialog = await browser.switchTo().alert();
console.log('Диалог:', await alertDialog.getText());
await alertDialog.accept();
} catch (e) {
if (e.name === 'NoSuchAlertError') {
alertPresent = false;
} else {
throw e;
}
}
}
Это гарантирует, что все последовательные диалоги будут обработаны и тест не зависнет.
Эти методы позволяют сделать тесты на Protractor устойчивыми к неожиданным диалоговым окнам, минимизировать зависание и автоматизировать полное управление пользовательскими взаимодействиями с alert, confirm и prompt.