| 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)*/ }); }); |