Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium适用于多个浏览器-需要能够执行javascript的webDriver_Javascript_Selenium_Webdriver_Selenium Webdriver - Fatal编程技术网

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

Selenium适用于多个浏览器-需要能够执行javascript的webDriver,javascript,selenium,webdriver,selenium-webdriver,Javascript,Selenium,Webdriver,Selenium Webdriver,我正在帮助建立一个自动化框架来测试我们的网站。由于测试用例必须在Chrome、Firefox和IE上运行,我们目前正在为我们的驱动程序传递一个WebDriver对象。该对象实际上可能是ChromeDriver、FirefoxDriver或InternetExplorerDriver(视情况而定) 我遇到的问题是,我想让这个驱动程序打开一个新窗口来验证测试。我发现的唯一一种方法是执行javascript—请参阅 为了执行javascript,驱动程序必须实现JavascriptExecutor接口

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

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

为了执行javascript,驱动程序必须实现JavascriptExecutor接口。我们将使用的所有驱动程序实际上都是JavaScriptExecutor,但由于我们使用的是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。我用这种方法是不是找错了方向?提前感谢。

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

// 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这一点是正确的,但现实情况是,当前的所有实现都会实现JavascriptExecutor

Selenium Web驱动程序是先决条件吗?由于Selenium和Web驱动程序成为同一个项目,我停止使用它们。你能用Watin吗?@ThiagoCustodio你能详细解释一下为什么会这样吗?你能指出一篇博客文章,或者邮件列表上的一个电子邮件线程,或者列出不再使用Selenium和/或WebDriver的原因的一些公共会计吗?我真正感兴趣的是这两个项目的合并是什么导致你停止使用之前使用的任何一个项目。@JimEvans我出于个人原因停止使用它们。我习惯于使用selenium RC,在合并之后,我认为这变得很困难。所以我决定使用另一个框架。谢谢!我觉得自己有点傻,因为我自己没试过。好吧!