В автоматизированном тестировании веб-приложений часто возникает
необходимость взаимодействия с popup окнами —
всплывающими alert, confirm и prompt. Protractor предоставляет удобные
инструменты для работы с ними через объект
browser.switchTo().alert().
Каждый тип окна обрабатывается схожим образом, но имеет свои особенности.
Для взаимодействия с любым всплывающим окном используется метод
browser.switchTo().alert(). Этот метод возвращает объект
Alert, который позволяет:
getText()),accept()),dismiss()),sendKeys() для prompt).Пример переключения на окно:
let alertPopup = browser.switchTo().alert();
После этого alertPopup становится объектом для
управления popup.
Alert содержит только текст и кнопку подтверждения.
it('должен подтвердить alert', async () => {
await element(by.id('showAlert')).click();
let alertPopup = browser.switchTo().alert();
let message = await alertPopup.getText();
console.log('Текст alert:', message);
await alertPopup.accept(); // нажать OK
});
Важный момент: перед вызовом accept() обязательно нужно
дождаться появления окна, иначе тест завершится с ошибкой. В Protractor
это можно сделать через ExpectedConditions:
let EC = protractor.ExpectedConditions;
await browser.wait(EC.alertIsPresent(), 5000, 'Alert не появился');
Confirm предоставляет выбор между подтверждением и отменой действия.
it('должен отклонить confirm', async () => {
await element(by.id('showConfirm')).click();
let EC = protractor.ExpectedConditions;
await browser.wait(EC.alertIsPresent(), 5000, 'Confirm не появился');
let confirmPopup = browser.switchTo().alert();
let message = await confirmPopup.getText();
console.log('Текст confirm:', message);
await confirmPopup.dismiss(); // нажать Cancel
});
Для подтверждения действия используется accept(). При
необходимости можно проверять текст окна перед выбором действия, что
особенно полезно для динамических сообщений.
Prompt позволяет вводить текст в поле ввода.
it('должен ввести текст в prompt', async () => {
await element(by.id('showPrompt')).click();
let EC = protractor.ExpectedConditions;
await browser.wait(EC.alertIsPresent(), 5000, 'Prompt не появился');
let promptPopup = browser.switchTo().alert();
await promptPopup.sendKeys('Тестовое значение');
await promptPopup.accept();
});
Если необходимо отменить ввод, используется dismiss().
Проверка текста через getText() работает аналогично alert и
confirm.
Все методы popup окон возвращают промисы, поэтому важно использовать
async/await. Без этого возможны ошибки из-за того, что окно
может появиться позже вызова метода.
Пример с проверкой текста перед подтверждением:
it('должен подтвердить alert с проверкой текста', async () => {
await element(by.id('showAlert')).click();
let EC = protractor.ExpectedConditions;
await browser.wait(EC.alertIsPresent(), 5000);
let alertPopup = browser.switchTo().alert();
let text = await alertPopup.getText();
if (text === 'Ожидаемое сообщение') {
await alertPopup.accept();
} else {
await alertPopup.dismiss();
}
});
ExpectedConditions.alertIsPresent()
для ожидания появления окна.async/await для последовательного
выполнения действий.Иногда popup может открывать новое браузерное окно, а не alert. В этом случае используется:
let handles = await browser.getAllWindowHandles();
await browser.switchTo().window(handles[1]); // переключение на новое окно
await browser.close(); // закрыть popup
await browser.switchTo().window(handles[0]); // возврат на основное окно
Эта схема применяется для сложных сценариев, когда popup реализован через отдельное окно, а не стандартный alert/confirm/prompt.
Для отладки popup полезно выводить текст окон в консоль:
console.log(await browser.switchTo().alert().getText());
Также можно использовать browser.sleep() на короткое
время для визуального контроля действий, но в стабильных тестах лучше
применять ExpectedConditions.
Эти методы обеспечивают полный контроль над всеми видами popup окон в Protractor и позволяют строить надежные и предсказуемые сценарии тестирования.