BH     TT     Selenium     Alert. Диалоговые окна

//   Диалоговое окно:   Маленькое окошечко для диалога
--   Кнопка "OK"
--   Кнопка"Cancel"
--   Поле для ввода текста
--   Выбор файла для загрузки на сервер или скачивания с сервера
--   !!! С некоторыми видами диалоговых окон Selenium не работает

Устаревшие функции JavaScript для диалоговых окон -- alert(), prompt(), confirmation()

Современные -- Диалоговые окна разной степени модальности (Поддельные окна)
        Selenium с ними работает


        //     Работа с устаревшими Alert-ами

// В Selenium есть специальный класс -- Alert
Alert alert = driver.switchTo().alert();

// Если диалоговое окно появляется не сразу -- лучше использовать механизм явных ожиданий
Alert alert = wait.until(alertIsPresent());         //     alertIsPresent() -- Стандартный метод Selenium

// Получить текст диалогового окна
alert.getText();

// Ввести текст в диалоговое окно (типа prompt)
// alert.sendKeys();

// Закрыть диалоговое окно -- 2 способа:   alert.accept();   и   alert.dismiss();
--   Если на диалоговом окне есть 2 кнопки: ОК и Cancel
        alert.accept();   --   Для кнопки ОК
        alert.dismiss();   --   Для кнопки Cancel
--   Если на диалоговом окне есть 1 кнопка: ОК
        alert.accept();   --   Для кнопки ОК
        alert.dismiss();   --   Закрыть и Клавиша Escape


        //     Диалоговое окно не ожидается (Особый случай)

В Selenium есть специальный механизм разблокировки, который можно настраивать с помощью Capability
caps.setCapability("unexpectedAlertBehavior", "dismiss");
Эта настройка может принимать 3 различных значения:
        accept
        dismiss
        ignore
Когда Selenium видит какое-то открытое диалоговое окно типа alert то Selenium действует в соответствии с этой настройкой --> Выполняет либо функцию accept / либо функцию dismiss для этого диалогового окна. После этого диалоговое окно пропадает и можно работать дальше. Следующую команду Selenium не выполняет, а выбрасывает исключение UnhandledAlertException
Скорее всего здесь сценарий упадёт, но зато диалог будет разблокирован и последующий сценарий сможет выполниться.
Если всё таки надо выполнить команду после диалогового окна, то надо как-то реализовывать механизм повторения

// ignore
Значение параметра ignore же не позволяет разблокировать диалог --> Надо вручную перехватить исключение и в перехватчике его закрыть.
Если использовать ignore, то не забывать перехватывать возникающие исключения и разблокировать Selenium, иначе все следующие команды тоже будут завершены таким же исключением.

        //     4.   Метод .isAlertPresent()

public boolean isAlertPresent() {
        try {
                driver.switchTo().alert();
                return true;
        } catch (NoAlertPresentException e) {
                return false;
        }
}

Примеры кода


Java

Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
alert.accept();
// либо alert.dismiss();


C#

IAlert alert = driver.SwitchTo().Alert();
string alertText = alert.Text;
alert.Accept();
// либо alert.Dismiss();


Python

alert = driver.switch_to_alert()
alert_text = alert.text
alert.accept()
# либо alert.dismiss()


Ruby

alert = @driver.switch_to.alert
alert_text = alert.text
alert.accept
# либо alert.dismiss


JavaScript

driver.switchTo().alert().then(function(alrt) {
        var alertText = alrt.getText();
        alrt.accept();
        alertText.then(function(text){ /*console.log(text)*/ });
});