Отклонение алёртов

В автоматизированном тестировании веб-приложений часто возникает необходимость взаимодействия с модальными окнами браузера, такими как 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

Алерт типа 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 позволяют полностью контролировать модальные окна браузера и интегрируются с механизмами асинхронного тестирования, обеспечивая стабильность и предсказуемость сценариев.