Selenium Driver располагает встроенными средствами для работы с диалоговыми окнами. Получить доступ к появившемуся диалоговому окну можно следующим образом.
Этот код вернет объект, соответствующий модальному диалогу, открытому на экране в данный момент:
Alert alert = driver.switchTo().alert();
Alert можно успешно использовать для диалогов alert
, confirm
и prompt
.
Интерфейс Alert
предоставляет следующие методы для работы с диалоговым окном:
- void accept() — соответствует нажатию кнопки OK.
- void dismiss() — соответствует нажатию кнопки Cancel или клавиши Esc.
- java.lang.String getText() — возвращает текст диалогового окна. Интересно, что текст возвращается даже для уже закрытого диалога.
- void sendKeys(java.lang.String keysToSend) — позволяет передать текст в поле ввода диалога.
Если вы попытаетесь перехватить диалоговое окно, которого нет, то получите исключение NoAlertPresentException
. Поэтому если вы не уверены в появлении алерта на странице, будьте готовы перехватить исключение:
protected void safeAlertDissmiss() { try { driver.switchTo().alert().dismiss(); } catch (NoAlertPresentException e) { // ничего не делаем, алерта итак нет } }
Безопасно дождаться появления алерта на странице можно используя готовые функции класса ExpectedConditions:
import org.openqa.selenium.Alert; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; WebDriver driver = new FirefoxDriver(); Alert alert = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.alertIsPresent());
Большое спасибо!!! Хоть кто-то написал по человечески!! В 2 строчки и все работает!!! Большое спасибо!
Спасибо большое за статью! Мегополезная работа, все ясно и понятно!
Здравствуйте. Спасибо за статью.
У меня возникла проблема с алертом. Драйвер выдал ошибку: «org.openqa.selenium.UnhandledAlertException … «. Алерт был показан, но драйвер не смог ни чего с ним сделать. Не подскажите как найти выход из проблемы?
Добрый день, пришлите, пожалуйста, код, который вызывает алерт и код, которым Вы пытаетесь его обработать.
Судя по ошибке алерт появляется раньше, чем Вы его обрабатываете.
В тесте выполняется следующий метод:
protected void fillAuthorizationForm(UserProperties user){
typeText(By.name(«userLogin»), user.login);
typeText(By.name(«userPassword»), user.password);
typeText(By.name(«verificationCod»), user.verificationCod);
clickElement(By.className(«SubmitButton»));
}
Алерт появляется после того как пользователь кликнет SubmitButton в случае неверных данных, внесенных в форму.
Алерт я обрабатываю следующим способом:
1) проверяю может драйвер подключится к алерту или нет
protected boolean isAlertPresent(){
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
2) метод isAlertPresent() я использую в методе обработки алерта (этот метод я вызываю в тесте сразу после fillAuthorizationForm() )
protected void closeAlert() {
Boolean result = isAlertPresent();
if (result){
Alert alert = driver.switchTo().alert();
alert.accept();
} else {
getError(«Dialog cannot be found»);
}
}
Надеюсь расписал более менее понятно 🙂
Думаю проблема в том, что в вашем коде дважды вызывается
driver.switchTo().alert();
, Вы уже итак переключены на алерт после проверки.Добрый день, снова потребовалась ваша помощь=)
В приложении при нажатии на кнопку открывается новое окно браузера, с формой для печати. И в этом новом окне сразу активно диалоговое окно с настройками печати (выбро принтера, числом копий и т.п.)
Правильно ли я понимаю, что это диалоговое окно WebDriver’ом восприниматься не будет, и я не смогу с ним взаимодействовать?
Добрый день,
По большому счету да, драйвер не работает с такими окнами.
Но в частности это зависит от браузера: в Firefox открывается диалоговое окно операционной системы (можно использовать AutoIt), а вот в Chrome это просто часть HTML страницы и с ней можно продолжить работать драйвером