我目前正在使用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.
请帮帮忙?
答案 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_policy 和 http://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的基本示例