2010-11-29 3 views
3

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

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

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

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

ответ

0

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

2

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

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

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

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

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

+0

Это старый вопрос, но Сахи http://sahi.co.in/ работает с модальными диалогами в IE. – 2012-04-15 10:35:56

1

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

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

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

Любое другое решение, чтобы сделать такую ​​же функциональность

+0

Следующий код должен работать в этом случае: driver.switchTo(). ActiveElement(); driver.switchTo(). DefaultContent(); – 2012-11-21 04:24:42

1

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

driver.switchTo.defaultcontent(); 

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

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

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

0
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]); 
1

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

driver.switchTo().activeElement(); 

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

driver.switchTo().activeElement().getText(); 
0

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

общественного недействительный switchWindow (String containingText, водитель 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

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

Для обработки модальных окон, таких как this one, см. Ниже возможное обходное решение, написанное на 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); 
} 
2

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

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

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^