Protractor — это инструмент для автоматизированного тестирования веб-приложений на основе Angular и других фреймворков. Одной из ключевых задач при тестировании является работа с модальными окнами браузера: alert, confirm и prompt. Эти диалоги блокируют выполнение скриптов, поэтому их необходимо корректно обрабатывать, чтобы тесты выполнялись стабильно.
Все эти диалоги управляются через объект
browser.switchTo().alert().
Для работы с любым модальным окном необходимо сначала переключиться на него:
let alertDialog = browser.switchTo().alert();
После этого можно выполнять действия над диалогом: считывать текст, принимать или отклонять, вводить данные.
Метод getText() позволяет получить сообщение,
отображаемое в модальном окне:
alertDialog.getText().then(function(text) {
console.log("Текст диалога: " + text);
});
В современном синтаксисе async/await:
let text = await alertDialog.getText();
console.log(`Текст диалога: ${text}`);
await alertDialog.accept();
confirm и prompt):await alertDialog.dismiss();
Важно: если диалог не будет обработан, выполнение теста может зависнуть, так как браузер блокирует дальнейшие действия до закрытия окна.
promptДля диалогов с вводом текста используется метод
sendKeys():
await alertDialog.sendKeys("Пример текста");
await alertDialog.accept();
sendKeys() позволяет автоматизировать сценарии, где
необходимо вводить данные в модальные окна, например при подтверждении
действий пользователя.
Поскольку появление модального окна может быть асинхронным, часто требуется использовать ожидания:
const EC = protractor.ExpectedConditions;
await browser.wait(EC.alertIsPresent(), 5000, "Диалог не появился за 5 секунд");
let alertDialog = browser.switchTo().alert();
await alertDialog.accept();
Использование ExpectedConditions.alertIsPresent()
предотвращает ошибки, если диалог появляется с задержкой после действия
на странице.
it('должен принять алерт после нажатия кнопки', async () => {
await element(by.id('deleteButton')).click();
await browser.wait(protractor.ExpectedConditions.alertIsPresent(), 3000);
let alertDialog = browser.switchTo().alert();
expect(await alertDialog.getText()).toEqual('Вы уверены, что хотите удалить элемент?');
await alertDialog.accept();
});
it('должен ввести текст в prompt', async () => {
await element(by.id('nameButton')).click();
await browser.wait(protractor.ExpectedConditions.alertIsPresent(), 3000);
let promptDialog = browser.switchTo().alert();
await promptDialog.sendKeys('Тестовый пользователь');
await promptDialog.accept();
});
it('должен отклонить confirm', async () => {
await element(by.id('logoutButton')).click();
await browser.wait(protractor.ExpectedConditions.alertIsPresent(), 3000);
let confirmDialog = browser.switchTo().alert();
await confirmDialog.dismiss();
});
Частая ошибка — попытка взаимодействия с диалогом, которого нет на
момент вызова. Чтобы избежать NoAlertPresentError,
следует:
ExpectedConditions.alertIsPresent().try/catch:try {
let alertDialog = await browser.switchTo().alert();
await alertDialog.accept();
} catch (e) {
console.log("Алерт не появился: " + e.message);
}
async/await для читаемого и
последовательного кода, избегая цепочек then().Эффективное управление алертами и диалогами позволяет создавать надежные автоматические тесты, которые корректно реагируют на блокирующие элементы интерфейса и обеспечивают стабильность проверки функциональности веб-приложения.