В автоматизированном тестировании веб-приложений часто возникает
необходимость взаимодействия с модальными окнами браузера, такими как
alert, confirm и
prompt. В Protractor для этого используется объект
browser.switchTo().alert(), который предоставляет методы
для управления этими окнами.
Для взаимодействия с алертом необходимо сначала переключиться на него. В Protractor это выполняется через:
let alertDialog = browser.switchTo().alert();
После этого alertDialog предоставляет методы для работы
с текстом и действиями алерта.
Текст модального окна часто используется для проверки корректности
вывода сообщений пользователю. Для получения текста применяется метод
getText():
alertDialog.getText().then(function(text) {
console.log("Текст алерта: " + text);
});
В современных тестах предпочтительно использовать
async/await:
let text = await browser.switchTo().alert().getText();
console.log(`Текст алерта: ${text}`);
Существует два основных действия с алертами:
OK)Cancel)Методы для этого:
await browser.switchTo().alert().accept(); // Подтверждение
await browser.switchTo().alert().dismiss(); // Отклонение
Важно: попытка взаимодействовать с алертом, который
не отображается в данный момент, приводит к ошибке
NoAlertPresentError. Рекомендуется использовать ожидание
появления алерта.
Protractor предоставляет мощные средства ожидания через
ExpectedConditions:
const EC = protractor.ExpectedConditions;
let alertIsPresent = EC.alertIsPresent();
await browser.wait(alertIsPresent, 5000, "Алерт не появился в течение 5 секунд");
После успешного ожидания безопасно выполнять getText(),
accept() или dismiss().
Алерт типа prompt позволяет ввести текст. В
Protractor это делается через метод sendKeys():
let promptDialog = browser.switchTo().alert();
await promptDialog.sendKeys("Тестовое значение");
await promptDialog.accept();
После выполнения этих действий введённый текст обрабатывается так же, как при ручном взаимодействии.
Иногда необходимо проверить, появился ли алерт без
немедленного взаимодействия. Для этого можно использовать цепочку
browser.switchTo().alert().then(...) или ожидание с
EC.alertIsPresent(). Пример:
const EC = protractor.ExpectedConditions;
let alertPresent = EC.alertIsPresent();
let isAlertVisible = await browser.wait(alertPresent, 3000).catch(() => false);
if(isAlertVisible) {
console.log("Алерт появился");
} else {
console.log("Алерт отсутствует");
}
При тестировании важно учитывать нестабильное поведение алертов:
NoAlertPresentError.browser.wait.dismiss() или accept() повторное
обращение к тому же алерту вызовет ошибку, так как окно закрыто.const EC = protractor.ExpectedConditions;
it("Отклонение алерта с проверкой текста", async () => {
await element(by.id("triggerAlert")).click();
await browser.wait(EC.alertIsPresent(), 5000, "Алерт не появился");
let alertDialog = browser.switchTo().alert();
let alertText = await alertDialog.getText();
expect(alertText).toBe("Вы уверены?");
await alertDialog.dismiss(); // Отклонение алерта
});
Этот пример демонстрирует последовательность действий: вызов алерта, ожидание, проверка текста и отклонение. Такой подход обеспечивает стабильность тестов и предотвращает ошибки, связанные с асинхронной природой появления алертов.
ExpectedConditions) перед взаимодействием с
алертами.sendKeys() до вызова
accept().sleep(), вместо этого использовать
browser.wait(EC.alertIsPresent()).Методы работы с алертами в Protractor позволяют полностью контролировать модальные окна браузера и интегрируются с механизмами асинхронного тестирования, обеспечивая стабильность и предсказуемость сценариев.