3

我们正在使用 webdriver 进行功能测试。但是我们的应用程序经常使用showModalDialogJS 函数来打开一个弹出窗口。当我们尝试使用 webdriver 测试此功能时,它从弹出窗口打开的那一刻起就挂起。

我们尝试了几件事来测试这一点:

  • 使用此处说明的解决方法。但这似乎是对 selenium 而不是 webdriver 的修复。我们试过了,但没有用。
  • 为了寻找一个好的替代方案,HtmlUnit 打开了模态对话框并可以与之交互,但它有一些缺点,比如没有视觉帮助来修复某些测试,并且当它在我们必须使用但有的 JS 库中检测到 JS 错误时停止执行无法控制。

我们如何测试或解决这个问题?

4

11 回答 11

2

没有一个答案回答了这个问题。如果驱动程序挂起,那么您不能在其上调用任何方法。问题不在于找到弹出窗口,而在于如何阻止驱动程序挂起。我发现的唯一方法是不使用showModalDialog. 这可以通过将以下内容添加到您的测试代码来完成:

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

window.open每次您的 JavaScript 调用时都会调用window.showModalDialog.

于 2014-04-30T09:39:35.590 回答
2

根据我使用各种自动化工具与从 IE 打开的“网页对话框”窗口交互的经验,使用window.showModalDialog()or window.showModelessDialog()is not available

由于该窗口不是“真正的”窗口(查看任务栏,它甚至不会显示)大多数工具无法“检查”它和/或与之交互。

但是,如果您确实找到了可以使用的工具,请告知-有很多人在寻找这样的野兽。

总而言之,如果您可以避免使用这两种专有方法中的任何一种,您将有更多的运气。

(是的,对于挑剔的人,Firefox 和 Chrome 已经采用了这类对话框,但它们的工作方式并不完全相同)

于 2010-12-06T14:03:41.163 回答
1

我正在使用webdriver.SwitchTo().Window()方法,但我担心我的弹出窗口没有“名称”

当我使用webdriver.WindowHandles它时只返回一个句柄,我在弹出窗口打开后使用此语句。

由于我没有名称/句柄,我无法从父窗口切换到子窗口。

执行相同功能的任何其他解决方案

于 2012-01-03T15:18:52.990 回答
1

即使窗口没有名字你也可以使用

driver.switchTo.defaultcontent();

并执行您要执行的操作,否则您可以使用以下命令获取窗口句柄名称

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

希望这对你有用。

于 2012-05-23T10:55:15.040 回答
1

首先我们必须切换到活动元素:

driver.switchTo().activeElement();

要检查我们是否确实切换到了正确的活动元素:

driver.switchTo().activeElement().getText(); 
于 2012-12-12T10:49:12.867 回答
0

我一直在使用并且它在 IE 和 Firefox 上对我们非常有用的是通过弹出窗口并在您尝试与之交互的弹出窗口上寻找一个独特的文本。这是方法,让我知道它是否适合您。请注意行 driver = driver.switchTo().window(windowHandle);

公共无效开关窗口(字符串包含文本,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");

}
于 2013-05-30T18:57:01.353 回答
0

问题 284适用于 WebDriver。看来要等到Issue 27实现之后才会实现,所以修复应该在WebDriver的Beta 1或Beta 2中。

于 2010-12-06T11:09:45.203 回答
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]);
于 2012-12-10T17:51:08.800 回答
0

据我所知,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);
}
于 2013-07-06T13:52:20.863 回答
0

Hugh Foster 的解决方案有效,我尝试了这个并成功了

((JavascriptExecutor) driver).executeScript("window.showModalDialog = window.open;");
于 2014-11-12T05:28:32.297 回答
0
  • 您可以找到模态对话框的 url,然后在另一个选项卡上打开它,它将正常工作。
  • 如果您想处理打开的模式对话框,您可以尝试发送“tab”键来移动对象和“发送键...输入”来设置文本或单击。

  • 注意:以下是为什么您不能使用 selenium webdriver 来处理该模式的一些信息。

Modal pop-up - 这是 IE 特有的,微软将其定义为

当 Windows Internet Explorer 通过使用 showModalDialog 方法或使用 showModelessDialog 方法从模式或非模式 HTML 对话框打开窗口时,Internet Explorer 使用组件对象模型 (COM) 创建窗口的新实例。通常,使用现有 Internet Explorer 进程的第一个实例打开窗口。当 Internet Explorer 在新进程中打开窗口时,所有内存 cookie 都不再可用,包括会话 ID。此过程不同于 Internet Explorer 使用 open 方法打开新窗口的过程。 http://msdn.microsoft.com/en-us/library/ms536759(VS.85).aspx

MSDN 关于模态对话框的博客

当用户选择模型弹出窗口时,父窗口被阻塞,等待弹出窗口的返回值。您将无法看到页面的视图源,需要关闭弹出窗口然后才激活父窗口。

于 2019-10-01T06:37:42.867 回答