UnhandledAlertException возникает при появлении неожиданных модальных диалоговых окон, точнее даже не при их появлении, а при попытке выполнить следующую операцию. Потому что открытое модальное окно не дает возможности драйверу выполнять команды, блокируя доступ к странице. Если же последующей командой после его появления будет ожидание появления диалогового окна:
Alert alert = driver.switchTo().alert();
то UnhandledAlertException не возникнет и Вы успешно получите объект модального окна. После этого Вы можете обработать его на свое усмотрение, в том числе, закрыть его либо кнопкой OK (accept
), либо кнопкой Cancel (dismiss
).
До версии 2.18 ситуации появления диалоговых окон никак не обрабатывались и тест просто зависал. Начиная с версии 2.18 в такой ситуации тест завершается с ошибкой, выбрасывая UnhandledAlertException. При этом диалоговое окно автоматически закрывается, обеспечивая возможность выполнения последующих тестов.
Пример:
driver.get( "http://internetka.in.ua/selenium-driver-unhandledalertexception" ); for (int i = 0; i < 10; i++) { // при каждой второй попытке нажать на кнопку // возникнет UnhandledAlertException, который закроет открытый алерт try { driver.findElement(By.id("show_dialog")).click(); } catch (UnhandledAlertException ex) { System.out.println("Step " + i + " - alert present: " + ex.getAlert().getText()); } }
Начиная с версии 2.25 появилась возможность управлением закрытия окна при возникновении UnhandledAlertException (пока поддерживается только для Mozilla Firefox). Для этого нужно установить дополнительный параметр unexpectedAlertBehaviour
, его возможные значения ("accept", "dismiss" или "ignore") можно получить с помощью ENUM UnexpectedAlertBehaviour
. По умолчанию установлено значение "dismiss".
DesiredCapabilities capabilities = DesiredCapabilities.firefox(); capabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); driver = new FirefoxDriver(capabilities); driver.get( "http://internetka.in.ua/selenium-driver-unhandledalertexception" ); for (int i = 0; i < 10; i++) { // при каждой второй попытке нажать на кнопку // возникнет UnhandledAlertException, который закроет // открытый алерт методом accept try { driver.findElement(By.id("show_dialog")).click(); } catch (UnhandledAlertException ex) { System.out.println("Step " + i + " - alert present: " + ex.getAlert().getText()); } }
Используя UnexpectedAlertBehaviour.IGNORE
Вы можете самостоятельно закрыть диалог в обработчике исключения или после.