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

Selenium for multiple browsers - Need webDriver that can execute javascript

本文关键字:执行 webDriver javascript 浏览器 Selenium- 适用于      更新时间:2023-09-26

我正在帮助构建一个自动化框架来测试我们的网站。由于测试用例必须在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,因为ChromeDrivers并没有明确实现我的新组合接口,即使它同时实现了WebDriver和JavascriptExecutor。用这种方法我是不是大错特错了?提前谢谢。

正确的方法是执行以下操作:

// 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,但事实是,目前所有的实现都是这样做的