我正在帮助构建一个自动化框架来测试我们的网站。由于测试用例必须针对 Chrome、Firefox 和 IE 运行,我们目前正在为我们的驱动程序传递一个 WebDriver 对象。这个对象实际上是 ChromeDriver、FirefoxDriver 或 InternetExplorerDriver,视情况而定。
我遇到的问题是我想让这个驱动程序打开一个新窗口以验证测试。我发现的唯一方法是执行 javascript - 请参见此处。
为了执行 javascript,驱动程序必须实现 JavascriptExecutor 接口。我们将使用的所有驱动程序实际上都是 JavascriptExecutors,但由于我们使用的是 WebDriver 接口,因此不能保证这一点。我试图让 javascript 运行,至少作为概念证明,但我也想知道如何正确组织我们的驱动程序对象,以便它可以执行 javascript,而不必明确说明它是三个驱动程序中的哪一个。
这是我试图测试打开新窗口的javascript方法的一些东西。它不起作用:
if (ChromeDriver.class.isInstance(driver)) {
ChromeDriver chrome = (ChromeDriver)driver;
chrome.executeScript("window.open()");
}
for (String handle : driver.getWindowHandles()) {
System.out.println(handle);
}
在上述情况下,我使用 Chrome 进行测试,因此我知道驱动程序实际上是 ChromeDriver。我猜测代码无法打开新窗口,因为我正在实例化一个新的驱动程序对象,并且我认为这不适用于 Selenium。如果它有效,我会继续尝试识别窗口(使用 driver.getWindowHandles)并在新窗口中加载 URL。
那么 - 代码无法打开一个新窗口的原因是我正在创建/投射一个 Selenium 不喜欢的新驱动程序对象吗?如果是这样,正确的解决方案是什么?我是否需要在 Chrome、Firefox 和 IE 驱动程序和 JavascriptExecutor 接口之间创建一个新接口——像这样?
public interface SpecialDriver extends WebDriver, JavascriptExecutor {
}
这似乎不起作用 - 至少,我不能将 ChromeDriver 分配给 SpecialDriver,因为 ChromeDriver 没有显式实现我的新组合接口,即使它同时实现了 WebDriver 和 JavascriptExecutor。我用这种方法完全吠错了树吗?提前致谢。