Protractor — это инструмент для автоматизированного
тестирования Angular и AngularJS приложений, построенный поверх
WebDriverJS. Одной из часто встречающихся задач в тестировании
веб-приложений является работа с модальными окнами браузера, такими как
alert(), confirm() и prompt(). В
JavaScript эти окна создаются стандартными методами браузера, но в
автоматизированных тестах требуют особого подхода.
Protractor предоставляет удобный объект browser.switchTo().alert(), который позволяет переключаться на модальные окна и взаимодействовать с ними. Основные методы объекта alert:
Пример базового использования:
it('должен принять alert', async () => {
await element(by.id('show-alert')).click();
let alertDialog = await browser.switchTo().alert();
let text = await alertDialog.getText();
console.log('Текст алерта:', text);
await alertDialog.accept();
});
В этом примере происходит следующее:
alert().browser.switchTo().alert().getText().accept().confirm() отличается от alert() наличием
кнопки «Cancel». Для работы с ним можно использовать те же методы:
it('должен отклонить confirm', async () => {
await element(by.id('show-confirm')).click();
let confirmDialog = await browser.switchTo().alert();
let text = await confirmDialog.getText();
console.log('Текст confirm:', text);
await confirmDialog.dismiss(); // отклонение действия
});
Важно учитывать, что dismiss() и accept()
возвращают промис, поэтому при использовании async/await
необходимо дожидаться их выполнения.
prompt() позволяет пользователю ввести текст, что
требует метода sendKeys() для автоматизации:
it('должен ввести текст в prompt', async () => {
await element(by.id('show-prompt')).click();
let promptDialog = await browser.switchTo().alert();
await promptDialog.sendKeys('Тестовое сообщение');
await promptDialog.accept();
});
Особенности:
accept() без sendKeys(),
текст в поле не будет введён.dismiss() игнорирует введённый текст и закрывает
окно.При автоматизации часто возникает ситуация, когда алерт не
появляется. Protractor выбрасывает исключение
NoSuchAlertError. Для безопасной обработки используют
конструкции try/catch:
try {
let alertDialog = await browser.switchTo().alert();
await alertDialog.accept();
} catch (e) {
if (e.name === 'NoSuchAlertError') {
console.log('Алерт не найден, продолжаем тест');
} else {
throw e;
}
}
Это позволяет тесту продолжить выполнение, если алерт не появился, вместо аварийного завершения.
Поскольку алерты могут появляться асинхронно, часто используется ExpectedConditions для ожидания:
const EC = protractor.ExpectedConditions;
await element(by.id('show-alert')).click();
await browser.wait(EC.alertIsPresent(), 5000, 'Алерт не появился в течение 5 секунд');
let alertDialog = await browser.switchTo().alert();
await alertDialog.accept();
ExpectedConditions, особенно при асинхронных событиях.try/catch для обработки случаев, когда
алерт не появляется.prompt() всегда проверять, что
sendKeys() выполнен до accept().browser.switchTo(), иначе тест упадёт.it('обрабатывает все типы alert', async () => {
const EC = protractor.ExpectedConditions;
// Работа с alert
await element(by.id('show-alert')).click();
await browser.wait(EC.alertIsPresent(), 5000);
let alertDialog = await browser.switchTo().alert();
console.log(await alertDialog.getText());
await alertDialog.accept();
// Работа с confirm
await element(by.id('show-confirm')).click();
await browser.wait(EC.alertIsPresent(), 5000);
let confirmDialog = await browser.switchTo().alert();
console.log(await confirmDialog.getText());
await confirmDialog.dismiss();
// Работа с prompt
await element(by.id('show-prompt')).click();
await browser.wait(EC.alertIsPresent(), 5000);
let promptDialog = await browser.switchTo().alert();
await promptDialog.sendKeys('Пример текста');
await promptDialog.accept();
});
Этот пример демонстрирует полный цикл работы с тремя видами модальных окон и включает ожидание, логирование текста и корректное закрытие.
Работа с alert(), confirm() и
prompt() в Protractor требует аккуратного управления
асинхронностью и понимания жизненного цикла модальных окон браузера, что
позволяет создавать надёжные и стабильные тесты для веб-приложений.