Selenium适用于多种浏览器 - 需要能够执行javascript的webDriver

时间:2012-09-04 13:23:00

标签: javascript selenium webdriver selenium-webdriver

我正在帮助建立一个自动化框架来测试我们的网站。由于测试用例必须针对Chrome,Firefox和IE运行,因此我们目前正在为我们的驱动程序传递WebDriver对象。实际上,这个对象可能是ChromeDriver,FirefoxDriver或InternetExplorerDriver,视情况而定。

我遇到的问题是我想让这个驱动程序打开一个新窗口以验证测试。我发现这样做的唯一方法是执行javascript - 请参阅here

为了执行javascript,驱动程序必须实现JavascriptExecutor接口。我们将使用的所有驱动程序实际上都是JavascriptExecutors,但由于我们使用的是WebDriver接口,因此无法保证。我试图让javascript运行,至少作为一个概念证明,但我也想知道如何正确组织我们的驱动程序对象,以便它可以执行javascript而无需明确说明它是三个驱动程序中的哪一个。 / p>

这是我试图测试打开新窗口的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。我用这种方法完全吠叫错误的树吗?提前谢谢。

1 个答案:

答案 0 :(得分:5)

正确的做法是做以下事情:

// WARNING! Untested code. Not guaranteed
// to work or even compile.
// Assume driver is a valid WebDriver object
// TODO: Wrap in try-catch to handle invalid 
// cast exception
 ((JavascriptExecutor)driver).executeScript("return 'your script goes here';");

虽然你是正确的,但不能保证WebDriver对象也会实现JavascriptExecutor,但实际情况是所有当前的实现都是如此。