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

标签 javascript selenium webdriver selenium-webdriver

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

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

为了执行 javascript,驱动程序必须实现 JavascriptExecutor 接口(interface)。我们将使用的所有驱动程序实际上都是 JavascriptExecutors,但由于我们使用的是 WebDriver 接口(interface),因此无法保证这一点。我试图让 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 接口(interface)之间的新接口(interface) - 像这样?

     public interface SpecialDriver extends WebDriver, JavascriptExecutor {

     }

这似乎不起作用 - 至少,我无法将 ChromeDriver 分配给 SpecialDriver,因为 ChromeDriver 没有显式实现我的新组合接口(interface),即使它同时实现了 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 是正确的,但现实是所有当前的实现都是这样做的。

关于javascript - 适用于多种浏览器的 Selenium - 需要可以执行 javascript 的 webDriver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12264424/

相关文章:

javascript - 在 JavaScript 中获取变量/对象元素和值

javascript - ng-repeat 中的动态 ng-model

java - 如何使用 Selenium webdriver 解决屏幕尺寸非常小的问题

webdriver - 单击表格中的链接

javascript - 更改用于分隔具有相同名称标识符的表单输入字段的字符?

javascript - 异步函数外部堆栈上下文

python - 在 fedora 上安装 python selenium 绑定(bind)时出错

python - Selenium +Python : CSS Selector -- NoSuchElement error

Python Selenium 等待 innerHTML

python - Selenium 下载完整的 html 页面