0

我正在一个 Web 应用程序上运行 Selenium 2.41 的集成测试,该应用程序的控制台是用 Apache Wicket 6 开发的,我创建了一个 Selenium Firefox Web 驱动程序的实例:

protected WebDriver seleniumDriver = new FirefoxDriver();

我有一个页面调用著名的 Wicket ModalWindow,特别是如果单击一个按钮,它会显示 odal 窗口页面以编辑或创建某些内容。模态窗口有两个输入文本字段和一个保存按钮。使用 Selenium,我试图在这些文本字段中输入一些内容,但我只能访问模式窗口,所以:

seleniumDriver.findElement(By.xpath("//a[contains(text(),'Create new item')]")).click();

然后硒网络驱动程序控制卡在主页上,所以(按照一些互联网示例)我写了这段代码来“切换”打开模式窗口上的控制:

//Store the current window handle
        String parentWindow = seleniumDriver.getWindowHandle();

//   switch to configuration modal window
            for (String winHandle : seleniumDriver.getWindowHandles()) {
                seleniumDriver.switchTo().window(winHandle);
            }

            WebDriverWait webDriverWaitHalfMinModal = new WebDriverWait(seleniumDriver, 10L);

            webDriverWaitHalfMinModal.until(ExpectedConditions.presenceOfElementLocated(By.
                    xpath("//input[@name='key:textField']")));

            // do something in modal window

            //Close the new window, if that window no more required
            seleniumDriver.close();
           //Switch back to original browser (parent window)
            seleniumDriver.switchTo().window(parentWindow); 

我也试过:

seleniumDriver.switchTo().activeElement();

seleniumDriver.switchTo().alert();

但是没有办法让它工作,实际上窗口句柄列表只有 1 个元素,主页面,而不是两个元素(主页面和模式页面),并且无法在打开的模式窗口中找到文本字段按钮按下。我指出我的其余代码都在工作,我不能只使用模态窗口。所以我的问题是:如何使用 Selenium 2.41 管理 APACHE WICKET 6 模态窗口?有没有办法将控制从主页切换到 APACHE WICKET 6 模式窗口?

4

3 回答 3

3

Selenium 存在用于处理模式对话框的错误。在这里阅读:https

://code.google.com/p/selenium/issues/detail?id= 284 不过有一个解决方法。用下面的方法替换你的点击方法:

seleniumDriver.executeScript("var el=arguments[0]; setTimeout(function() { el.click(); }, 100);", seleniumDriver.findElement(By.xpath("//a[contains(text(),'Create new item')]")));

然后使用您现有的代码切换到模态窗口。它应该工作。

于 2014-05-13T06:22:51.167 回答
0

Apache Wicket 模态窗口是一个框架,特别是一个 jquery iframe,所以我需要:

seleniumDriver.switchTo().frame(seleniumDriver.findElement(By.className("wicket_modal")));

但这还不够,事实上我使用了 Web 驱动程序后端(更高级别的 API)并创建了 selenium Web 驱动程序后端,所以:

seleniumDriver = new FirefoxDriver();
    selenium = new WebDriverBackedSelenium(seleniumDriver, BASE_URL);

switchTo() 和 find() 工作正常。

于 2014-05-13T11:47:08.150 回答
0

以下对我有用,但适用于 Apache Wicket 1.4.x。与Selenium WebDriver 相关:如何等待 iFrames 完全加载?

WebElement iFrame = wait.until(visibilityOfElementLocated(By.tagName("iframe")));
driver.switchTo().frame(iFrame);
于 2015-11-11T17:53:25.993 回答