Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Проблема с обработкой Alert в Firefox при использовании RemoteWebDriver

firefix
alert
Теги: #<Tag:0x00007f7b705c6910> #<Tag:0x00007f7b705c67a8>

(Антон) #1

Всем доброго времени суток.

Возникла проблема с обработкой Alert при использовании FirefoxDriver (а точнее RemoteWebDriver). При появлении Alert он не хендлится как с помощью ожидания UnexpectedAlertException так и при попытке перейти на алерт, с игнорированием NoAlertPresentException.

Версии браузера и селениума последние, но и на более ранних версиях было.


(Stan) #2

А данный “алерт” - нативный (alert, prompt и тд) или какой-нибудь хитрый, фреймворочный? Можно пример кода как он вызывается + пример кода как вы его обрабатываете webdriver-ом.


(Антон) #3

Этот алерт появляется после закрытия дополнительного всплывающего окна. Алерт находится в основном окне и содержит просьбу обновить страницу.
Для перехода в основное окно используется метод (опустим вопрос откуда драйвер и какой метод из какого хелпера :smile: ):
Для обработки используется метод > accetptAlert()

public static void switchToSpecificWindow(final String value, int seconds, final boolean isByTitle) {
    try {
        new WebDriverWait(getDriver(), seconds).until((WebDriver driver) -> {
            for (String handle : driver.getWindowHandles()) {
                driver.switchTo().window(handle);
                acceptAlert();
                if ((isByTitle && driver.getTitle().contains(value))
                        || driver.getCurrentUrl().contains(value)) {
                    return true;
                }
            }
            return false;
        });
    } catch (WebDriverException ex) {
        throw new WebDriverException("Cannot switch to Specific window - time out");
    }
}


private static boolean acceptAlert() {
        try {
            Alert alert = getDriver().switchTo().alert();
            alertStorage.setAlertText(alert.getText());
            alert.accept();
            return true;
        } catch (NoAlertPresentException ignored) {
            return false;
        }
    }

Попытка дождаться появления алерта и словить UnhandledAlertException не работает потому что нужно переключиться в нужное окно для начала.

Данный метод работает в ИЕ, в хроме он не нужен потому что страница сама без алерта перезагружается.

На данный момент проблема не актуальна из-за обновления браузера на виртуалках до последней версии, но это привело просто к тому что алерт не появляется... но не решило проблему :smile: