Webdriver showModalDialog

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

Опитахме няколко неща, за да тестваме това:

  • Използване на заобиколното решение, обяснено тук. Но това изглежда е поправка за селен, а не за webdriver. Пробвахме, но не се получи.
  • Търсейки добра алтернатива, HtmlUnit отвори модалния диалогов прозорец и можеше да взаимодейства с него, но има своите недостатъци като липса на визуална помощ за коригиране на определени тестове и спря изпълнението, когато откри JS грешка в JS библиотека, която трябва да използваме, но имаме няма контрол върху.

Как можем да тестваме това или да заобиколим този проблем?


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


Отговори (10)


От моя опит с различни инструменти за автоматизация взаимодействието с прозорците на „диалог на уеб страница“, отворени от IE с помощта на window.showModalDialog() или window.showModelessDialog(), не е налично.

Тъй като прозорецът не е "истински" прозорец (погледнете лентата на задачите, тя дори не се показва), повечето инструменти не могат да го "инспектират" и/или да взаимодействат с него.

Въпреки това, ако намерите инструмент, който да го направи, моля, посъветвайте - има много хора, които търсят такъв звяр.

Всичко казано, ако евентуално можете да избегнете използването на някой от тези 2 патентовани метода, ще имате много повече късмет.

(и да, за придирчивите, Firefox и Chrome са приели този вид диалогови прозорци, но те не работят по същия начин)

person scunliffe    schedule 06.12.2010
comment
Това е стар въпрос, но Sahi 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 бъде е внедрена, така че корекцията трябва да е в Beta 1 или 2 на WebDriver.

person Sergii Pozharov    schedule 06.12.2010

Това, което използвам и работи чудесно за нас с IE и Firefox, е да минавам през изскачащи прозорци и да търся уникален текст в изскачащия прозорец, с който се опитвате да взаимодействате. Ето метода, уведомете ме дали работи за вас. Моля, обърнете внимание на линията driver = driver.switchTo().window(windowHandle);

public void switchWindow(String containingText, WebDriver driver) хвърля изключение {

    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" за движение около обекти и "изпратете клавиши... enter" за setText или щракнете.

  • Забележка: По-долу е дадена информация защо не можете да използвате selenium webdriver за работа с този модал.

Модален изскачащ прозорец - Това е много специфично за IE, Microsoft го дефинира като

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

MSDN блог за модален диалог

Когато потребителят избере изскачащ прозорец на модела, родителският прозорец се блокира в очакване на върната стойност от изскачащия прозорец. Няма да можете да видите изходния код на страницата, трябва да затворите изскачащия прозорец, след което се активира само родителският прозорец.

person Sy Loc    schedule 01.10.2019