Как управлять и получать доступ к модальному окну Apache Wicket 6.X с помощью веб-драйвера Selenium 2.41

Я запускаю интеграционные тесты с Selenium 2.41 через веб-приложение, консоль которого разработана с помощью Apache Wicket 6, и я создал экземпляр веб-драйвера Selenium Firefox:

protected WebDriver seleniumDriver = new FirefoxDriver();

У меня есть страница, вызывающая знаменитый Wicket ModalWindow, в частности, если щелкнуть кнопку, она показывает страницу окна odal для редактирования или создания чего-либо. Модальное окно имеет два текстовых поля ввода и кнопку Сохранить. С Selenium я пытаюсь что-то ввести в эти текстовые поля, но я могу получить доступ только к модальному окну, поэтому:

seleniumDriver.findElement(By.xpath("//a[contains(text(),'Create new item')]")).click();

затем элемент управления веб-драйвером selenium застревает на главной странице, поэтому (следуя некоторым примерам в Интернете) я написал этот код, чтобы «переключить» элемент управления в открытом модальном окне:

//Store the current window handle
        String parentWindow = seleniumDriver.getWindowHandle();

//   switch to configuration modal window
            for (String winHandle : seleniumDriver.getWindowHandles()) {
                seleniumDriver.switchTo().window(winHandle);
            }

            WebDriverWait webDriverWaitHalfMinModal = new WebDriverWait(seleniumDriver, 10L);

            webDriverWaitHalfMinModal.until(ExpectedConditions.presenceOfElementLocated(By.
                    xpath("//input[@name='key:textField']")));

            // do something in modal window

            //Close the new window, if that window no more required
            seleniumDriver.close();
           //Switch back to original browser (parent window)
            seleniumDriver.switchTo().window(parentWindow); 

Я также пробовал:

seleniumDriver.switchTo().activeElement();

и

seleniumDriver.switchTo().alert();

Но нет никакого способа заставить его работать, ведь список дескрипторов окна имеет только 1 элемент, главную страницу, а не два элемента (главную и модальную страницу) и нет возможности найти текстовое поле в модальном окне, открытом с помощью нажатие кнопки. Я указываю, что остальной мой код работает, я не могу работать только с модальными окнами. Итак, мой вопрос: как я могу управлять модальными окнами APACHE WICKET 6 с помощью Selenium 2.41? Есть ли способ переключить управление с главной страницы на модальное окно APACHE WICKET 6?


person andPat    schedule 12.05.2014    source источник


Ответы (3)


В Selenium есть ошибка при обработке модального диалога. Читайте здесь: https://code.google.com/p/selenium/issues/detail?id=284

Однако есть обходной путь. Замените метод click на тот, что написан ниже:

seleniumDriver.executeScript("var el=arguments[0]; setTimeout(function() { el.click(); }, 100);", seleniumDriver.findElement(By.xpath("//a[contains(text(),'Create new item')]")));

А затем используйте свой существующий код, чтобы переключиться на модальное окно. Он должен работать.

person Sitam Jana    schedule 13.05.2014
comment
К сожалению, этот код не работает для меня. Та же ошибка. - person andPat; 13.05.2014

Модальное окно Apache Wicket представляет собой фрейм, в частности jquery iframe, поэтому мне нужно:

seleniumDriver.switchTo().frame(seleniumDriver.findElement(By.className("wicket_modal")));

но этого было недостаточно, на самом деле я использовал серверную часть веб-драйвера (API более высокого уровня) и создал серверную часть веб-драйвера selenium, поэтому:

seleniumDriver = new FirefoxDriver();
    selenium = new WebDriverBackedSelenium(seleniumDriver, BASE_URL);

и switchTo() и find() работали нормально.

person andPat    schedule 13.05.2014
comment
также seleniumWebDriverBackend.selectFrame("index=0"); или seleniumWebDriverBackend.selectFrame("relative=up"); - person andPat; 11.07.2014

У меня сработало следующее, но для Apache Wicket 1.4.x. Связано с Selenium WebDriver: как дождаться загрузки iFrames полностью?

WebElement iFrame = wait.until(visibilityOfElementLocated(By.tagName("iframe")));
driver.switchTo().frame(iFrame);
person Christos K    schedule 11.11.2015