Webdriver showModalDialog

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

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

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

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


person johan gee    schedule 29.11.2010    source источник


Ответы (10)


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

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

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

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

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

person scunliffe    schedule 06.12.2010
comment
Это старый вопрос, но Сахи sahi.co.in работает с модальными диалогами IE. - person Narayan Raman; 15.04.2012

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

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

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

person Hugh Foster    schedule 30.04.2014

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

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

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

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

person Prashant    schedule 03.01.2012
comment
В этом случае должен работать следующий код: driver.switchTo().activeElement(); driver.switchTo().defaultContent(); - person Ripon Al Wasim; 21.11.2012

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

driver.switchTo().activeElement();

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

driver.switchTo().activeElement().getText(); 
person Sharon    schedule 12.12.2012

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

driver.switchTo.defaultcontent();

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

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

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

person sree    schedule 23.05.2012

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

person Sergii Pozharov    schedule 06.12.2010

То, что я использовал, и это отлично работает для нас с 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");

}
person Rex    schedule 30.05.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);
}
person Roman Grytsay    schedule 06.07.2013

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

((JavascriptExecutor) driver).executeScript("window.showModalDialog = window.open;");
person Nidhin    schedule 12.11.2014

  • Вы можете найти URL-адрес модального диалога, а затем открыть его на другой вкладке, он будет работать как обычно.
  • Если вы хотите иметь дело с открытым модальным диалогом, вы можете попробовать отправить клавишу «tab» для перемещения по объектам и «отправить ключи ... введите» для setText или щелкнуть.

  • Примечание. Ниже приведена информация, почему вы не можете использовать selenium webdriver для работы с этим модальным окном.

Модальное всплывающее окно. Это очень специфично для IE, Microsoft определила его как

Когда Windows Internet Explorer открывает окно из модального или немодального диалогового окна HTML с помощью метода showModalDialog или метода showModelessDialog, Internet Explorer использует объектную модель компонентов (COM) для создания нового экземпляра окна. Как правило, окно открывается с помощью первого экземпляра существующего процесса Internet Explorer. Когда Internet Explorer открывает окно в новом процессе, все файлы cookie памяти становятся недоступными, включая идентификатор сеанса. Этот процесс отличается от процесса, используемого Internet Explorer для открытия нового окна с помощью метода open. http://msdn.microsoft.com/en-us/library/ms536759(VS.85).aspx

Блог MSDN о модальном диалоговом окне

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

person Sy Loc    schedule 01.10.2019