在selenium Web驱动程序firefox中使用javascriptexecutor单击打印按钮时无法关闭打印对话框

时间:2014-09-10 16:32:36

标签: java firefox selenium

我目前正在使用selenium web驱动程序进行自动功能测试。我遇到了一个场景,我需要点击窗口上的打印按钮(比如A)打开一个新窗口(比如说B)。窗口B也弹出了打印对话框。我需要使用java脚本执行器关闭该打印对话框。

我试过这个。但它不起作用。我的代码:

public void handlePrintButtonScenario {
String parentWindow_A = driver.getWindowHandle(); //get the current window A handle
Printbutton().click(); //clicking print button

//switch focus of web driver to newly opened window B

for (String winhandle : driver.getWindowHandle()) {

driver.switchTo().window(winhandle);
}

//closing printdialoge
closeWindowByJS();

driver.close();// closing window B

driver.switchTo().window(parentWindow_A); // switching focus to window A

}

public void closeWindowByJS() {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    String script = "window.onbeforeunload = null;" + "window.close();";
    js.executeScript(script);
}

现在,当我第一次通过调用方法closeWindowByJS()执行场景时,打印对话和窗口B关闭了。我在行driver.close()中遇到异常,说明没有找到这样的窗口。

但是当我重新运行场景时,即从第二次开始,打印对话和窗口B都不会关闭。但焦点得到了适当改变,方案也正常运行。

但我需要首先使用javascriptexecutor关闭该打印对话框,然后关闭窗口B.我不需要通过调用closeWindowByJS()来关闭它们。在此之后需要将焦点切换到窗口A.

请帮帮忙?

2 个答案:

答案 0 :(得分:0)

使用自动 下载exe记录单击按钮并记录代码 使用相同的java脚本执行器

执行autoit代码

你的driver.close() 应该在切换窗口代码()

之后

这应该有帮助

答案 1 :(得分:0)

我知道这有点老了,但也许这对某人有帮助。

首先,这段代码只获得一个句柄,driver.getWindowHandles()获得句柄的Set并且可以迭代。其次,webdriver实例切换到每个窗口,但实际上并没有对它做任何事情。这只是为了结束吗?

for (String winhandle : driver.getWindowHandle()) {

    driver.switchTo().window(winhandle);
}

如果是这种情况,您可以将Set转换为Arraylist并在列表末尾获取最新的一个,而不是使用for循环。

List<String> handles = new ArrayList<>(driver.getWindowHandles());
driver.switchTo().window(handles.get(handles.size()-1);

虽然这不是重点。

不幸的是,WebDriver无法处理打印对话框。这些提示与网页无关,是Web浏览器的一项功能。如果javascript可以访问能够与您的文件系统通信的这些提示,则会出现安全问题。如果您有兴趣了解更多信息,请查看 http://en.wikipedia.org/wiki/Same-origin_policyhttp://en.wikipedia.org/wiki/Sandbox_(computer_security)了解javascript限制如何阻止它与这些类型的提示进行交互。

由于打印提示不是窗口,并且没有被webdriver看到,当您尝试关闭打印对话框时,您实际上关闭了窗口B. WebDriver的不同实现可能会有不同的结果这种行为。 FirefoxDriver可能与ChromeDriver的反应方式不同。在关闭窗口B之后,您可能需要做的是明确地将webdriver切换回父窗口A.在尝试进行任何交互之前,应该使用driver.switchTo().window(parentWindow_A)以确保WebDriver没有坐在没有窗口的情况下聚焦。

如果您必须与这些提示进行交互,并且正在使用Java。然后,您可以使用java.awt.Robot来驱动桌面鼠标以执行点击。但这可能是一个混乱的解决方案,因为你只能移动到像素坐标。因此,您必须将其定位到您希望按钮所在的位置。以下是如何使用绝对屏幕坐标http://alvinalexander.com/java/java-robot-class-example-mouse-keystroke

来使用Robot的基本示例