Webdriver showModalDialog - PullRequest
       7

Webdriver showModalDialog

3 голосов
/ 29 ноября 2010

Мы используем веб-драйвер для наших функциональных тестов.Но наше приложение часто использует функцию showModalDialog JS, чтобы открыть всплывающее окно.Когда мы пытаемся проверить эту функциональность с помощью веб-драйвера, он зависает с момента открытия всплывающего окна.

Мы попробовали несколько вещей, чтобы проверить это:

  • Использование обходного решения, объясненного здесь .Но это похоже на исправление для селена, а не для веб-драйвера.Мы попробовали это, но это не сработало.
  • В поисках хорошей альтернативы HtmlUnit открыл модальное диалоговое окно и мог взаимодействовать с ним, но у него есть свои недостатки, такие как отсутствие визуальной помощи для исправления определенных тестов, и он остановил выполнение.когда он обнаружил ошибку JS в библиотеке JS, которую мы должны использовать, но у нас нет контроля над ней.

Как мы можем проверить это или обойти эту проблему?

Ответы [ 10 ]

2 голосов
/ 06 декабря 2010

Исходя из моего опыта работы с различными инструментами автоматизации, взаимодействие с "диалоговыми окнами веб-страниц", открытыми из IE с использованием window.showModalDialog() или window.showModelessDialog(), недоступно .

Поскольку окно не является «истинным» окном (посмотрите на панель задач, оно даже не отображается), большинство инструментов не может «осмотреть» его и / или взаимодействовать с ним.

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

Тем не менее, если вам удастся избежать использования любого из этих двух проприетарных методов, вам повезет гораздо больше.

(и да, для требовательных, Firefox и Chrome приняли эти виды диалогов, но они не работают совершенно одинаково)

2 голосов
/ 30 апреля 2014

Ни один из ответов не отвечает на вопрос.Если драйвер зависает, вы не можете вызывать какие-либо методы для него.Вопрос не в том, чтобы найти всплывающее окно, а в том, как остановить зависание водителя.Единственный способ, который я нашел, это не использовать showModalDialog.Это можно сделать, добавив следующий код в свой тестовый код:

((JavascriptExecutor) driver).executeScript("window.showModalDialog = window.open;");

, который вызывает window.open каждый раз, когда JavaScript вызывает window.showModalDialog.

1 голос
/ 12 декабря 2012

Сначала мы должны переключиться на активный элемент:

driver.switchTo().activeElement();

Чтобы проверить, действительно ли мы переключились на правильный активный элемент:

driver.switchTo().activeElement().getText(); 
1 голос
/ 23 мая 2012

Даже если у окна нет названия, вы можете использовать

driver.switchTo.defaultcontent();

и выполните операцию, которую хотите выполнить или же вы можете получить имя дескриптора окна, используя следующую команду

for (String handle : driver.getWindowHandles()) { 
    driver.switchTo().window(handle); }

надеюсь, это сработает для вас.

1 голос
/ 03 января 2012

Я использую webdriver.SwitchTo().Window() метод, но меня беспокоит, что мое всплывающее окно не имеет "Имя"

Когда я использую webdriver.WindowHandles, он возвращает только один дескриптор, я использую этот оператор после открытия всплывающего окна.

Поскольку у меня нет имени / дескриптора, я не могу переключиться с родительского окна на дочернее окно.

Любое другое решение для такой же функциональности

0 голосов
/ 12 ноября 2014

Решение от Хью Фостера работает, я попробовал это и успешно

((JavascriptExecutor) driver).executeScript("window.showModalDialog = window.open;");
0 голосов
/ 06 июля 2013

Насколько мне известно, webdriver не имеет встроенных функций для работы с модальными окнами. Webdriver зависнет, как только вы нажмете кнопку, которая открывает модальное окно. Это происходит из-за JS при остановке родительского окна до тех пор, пока дочернее окно не будет закрыто.

Для обработки модальных окон, таких как , это , см. Ниже возможный обходной путь, написанный на Java. Основная идея - выполнить действие, которое открывает модальное окно (нажать на кнопку) в новой теме.

/**
 * Click button to open modal window and switch to it
 * @param we webElement handle of a button
 */
public void clickToOpenModal(final WebElement we) {
    //Get handles of all opened windows before opening modal window
    Set<String> initWindowHandles = getDriverInstance().getWindowHandles();

    //Create new thread and click button to open window
    Thread thread1 = new Thread() {
            @Override
            public void run() {
            //Click button
            click(we);
        }
    };
    thread1.start();

    //Wait for window to appear
    waitForWindow(initWindowHandles, pauseL);
    thread1.interrupt();
    thread1 = null;

    //Get handles of all opened windows after opening modal window
    Iterator<String> it = getDriverInstance().getWindowHandles().iterator();

    //Select handle of modal window
    String windowHandle = "";
    while(it.hasNext()){
        windowHandle = it.next();
    }

    //Switch focus and work on the modal window
    getDriverInstance().switchTo().window(windowHandle);
}
0 голосов
/ 30 мая 2013

То, что я использовал, и это прекрасно работает для нас с IE и Firefox, это проходить через всплывающие окна и найдите уникальный текст во всплывающем окне, с которым вы пытаетесь взаимодействовать. Вот метод, дайте мне знать, если он работает для вас. Обратите внимание на строку driver = driver.switchTo (). Window (windowHandle);

public void switchWindow (строка, содержащая текст, драйвер WebDriver) выдает исключение {

    if ( StringUtils.isEmpty(containingText))
        return;

    int counter = 1;
    int numOfpopups = driver.getWindowHandles().size();
    System.out.println("Waiting for popup to load..... # handles:" + numOfpopups);
    while ( numOfpopups  < 2 && ((counter%10) != 0) ) {
        counter++;
        try{Thread.sleep(1000);}catch (Exception e) {}
    }
    System.out.println("Done waiting for..... " + counter + " seconds");

    if (driver.getWindowHandles().size() < 2)
          throw new BrowserException("Timeout after " + counter + " secs. No popup present. ");

    System.out.println("Going through window handles...");

    for (String windowHandle : driver.getWindowHandles()) { 
                driver = driver.switchTo().window(windowHandle);
        if ( driver.getPageSource().contains(containingText) 
        return;
         else 
        continue;
    }

    throw new Exception("Window containing text '" + containingText + "' not found");

}
0 голосов
/ 10 декабря 2012
Set<String> beforePopup = driver.getWindowHandles();

Set<String> afterPopup = driver.getWindowHandles();

afterPopup.removeAll(beforePopup);

if(afterPopup.size()==1){
    System.out.println(afterPopup.toArray()[0]);
}

driver.switchTo().window((String) afterPopup.toArray()[0]);
0 голосов
/ 06 декабря 2010

Выпуск 284 для WebDriver.Кажется, что это будет реализовано только после того, как будет Выпуск 27 , поэтому исправление должно быть в бета-версии 1 или 2 WebDriver.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...