【发布时间】:2012-08-11 18:47:42
【问题描述】:
我正在开发一个应用程序,我们需要在其中检查 Web 应用程序是否正在运行以及提供预期结果的 url。
我们的调度程序每天运行此应用程序 12 次。每次启动时,都会执行 firefox 驱动程序,并会打开一个新的浏览器窗口来执行操作。
我想要一种技术,我们打开 firefox 浏览器 1 次,并在 selenium-driver 的每次调用中重用它。
【问题讨论】:
我正在开发一个应用程序,我们需要在其中检查 Web 应用程序是否正在运行以及提供预期结果的 url。
我们的调度程序每天运行此应用程序 12 次。每次启动时,都会执行 firefox 驱动程序,并会打开一个新的浏览器窗口来执行操作。
我想要一种技术,我们打开 firefox 浏览器 1 次,并在 selenium-driver 的每次调用中重用它。
【问题讨论】:
我实际上并不完全确定您是否可以切换到不是由驱动程序生成的窗口。我认为从事 selenium 2 项目的人在切换到由不同驱动程序生成的窗口方面做了一些工作。当你这样做时:
driver.getWindowHandles()
您所得到的只是由调用它的驱动程序对象生成的窗口。
这是一个相当古老的功能请求:Allow webdriver to attach to a running browser。所以现在是不可能的。
【讨论】:
您可以看到an example I wrote,这证明在 WebDriver 中重用浏览器可以正常工作。基本上,只要浏览器窗口是从 WebDriver 实例化的,那么您就可以使用 getWindowHandles() 始终抓住它。如果您打开了多个窗口,只需使用 List 跟踪它们。您可以使用各种 WebDriver 方法来识别以某种方式出现或包含某些信息的窗口。
换句话说,如果浏览器窗口不是由 WebDriver 打开的,那么 WebDriver 就没有能力连接到它。
一个粗略的例子:
public static boolean selectWindow(WebDriver driver, String windowTitle){
//Search ALL currently available windows
for (String handle : driver.getWindowHandles()) {
String newWindowTitle = driver.switchTo().window(handle).getTitle();
if(newWindowTitle.equalsIgnoreCase(windowTitle))
//if it was found break out of the wait
return true;
}
return false;
}
在我做的一个项目中,我创建了一个返回某些 int 状态代码的方法,具体取决于我的窗口排列。如果状态码是我所期望的,那么我知道下一个测试可以在不重新登录或不打开新窗口的情况下进行。
当然,如果您的测试框架(例如 Surefire 或 TestNG)按类分叉线程,那么每个类都需要一个 webdriver 实例。如果您的测试框架按方法分叉,那么您需要将 webdriver 实例作为参数传递给测试方法,以便线程可以访问它。
【讨论】: