【问题标题】:Use protractor with Java在 Java 中使用量角器
【发布时间】:2025-12-20 19:10:09
【问题描述】:

我想在 Java 而不是 Node.js 上使用 Protractor。是否可以将 Protractor 与 Java 或 Python 一起使用?我们不想添加其他技术进行测试,而是想使用现有技术。

【问题讨论】:

标签: java protractor


【解决方案1】:

不幸的是,您在这件事上没有太多选择,因为 Protractor 是 AngularJS 的 JavaScript 测试框架,它是通过 Node.js 分发的。

我们不想添加其他技术进行测试,而是希望使用现有技术。

Protractor 是为 angularJS 应用程序定制的。因此,如果您的应用程序是使用 AngularJS 创建的,Protractor 会有所帮助,因为它内置了对 AngularJS 页面加载和操作的支持。

如果您的应用程序不是基于 Angular 构建的,您可以在您喜欢的任何其他语言之上使用 Selenium WebDriver。

Selenium 为用户提供了有关使用 Python 作为编写测试的媒介的文档,请阅读此here 的更多信息。

【讨论】:

    【解决方案2】:

    Protractor 是一个 JS 库,因此您无法在 Java 中运行它,并且在没有 Protractor 的情况下测试 Angular 应用程序很困难,因为您的测试代码需要等待 Angular 进程完成,然后才会发生点击等交互。

    幸运的是,Angular 可以很容易地识别它何时完成处理。

    有一个 JS 函数接受回调,并在 Angular 准备好后通知您。

    angular.getTestability("body").whenStable(callback);
    

    注意:这适用于 Angular 1.4.8。其他一些版本的 Angular 也有类似的不同方法。

    您可以使用以下简单方法或类似方法从 Java 测试代码中调用可测试性方法。

    private void waitForAngular() {
    
        final String script = "var callback = arguments[arguments.length - 1];\n" +
                "var rootSelector = \'body\';\n" +
                "var el = document.querySelector(rootSelector);\n" +
                "\n" +
                "try {\n" +
                "    if (angular) {\n" +
                "        window.angular.getTestability(el).whenStable(callback);\n" +
                "    }\n" +
                "    else {\n" +
                "        callback();\n" +
                "    }\n" +
                "} catch (err) {\n" +
                "    callback(err.message);\n" +
                "}";
    
        ((JavascriptExecutor) driver).executeAsyncScript(script, new Object[0]);
    }
    

    在使用 click 等方法与驱动程序交互之前调用 waitForAngular()。

    你可能想要一个与“body”不同的 rootSelector,如果 angular 不存在,你可能想抛出一个错误,但这很适合我的需要。

    Protractor 提供了其他选择器,这可能会使测试 Angular 应用程序更容易,但我个人使用 ID 和 Class 选择器,所以我不需要它们。

    【讨论】:

    • 是的; protractor 只不过是 Selenium 的语法包装器,其中包含一些挂钩到 JavaScript 回调的方法,例如 angular.getTestability。通过将 JavaScript 代码从 protractor 或 ngWebDriver 等复制到项目的 executeScript 或 executeAsyncScript 中,您可以修改 Selenium 框架以实现 watiForAngular 和其他 Protractor 方法,从而无需 Protractor。
    【解决方案3】:

    Java 中已经有一个用于自动化 Angular 内容的库。它基于名为“ngWebDriver”的量角器构建

    【讨论】:

    • 太棒了!订阅了 github 中的 ngWebDriver。知道 Angular2 端什么时候准备好?
    • @bobanahalf 我还没有与回购所有者 Paul Hammant 就 Angular2 支持进行任何会谈。但看起来他已经开始了(猜测)
    【解决方案4】:

    截至 2017 年,我已经找到了这些适用于 Java 的 Protractor 库:

    • jProtractor - 开发有些不活跃,但我已经对其进行了测试。点击here了解更多详情。
    • ngWebDriver - 由 Paul Hammant(Selenium 的共同创建者)开发。目前正在积极开发中,文档完善。

    代码片段:

    <input type="text" ng-model="startBalance" placeholder="Enter your current balance" class="ng-pristine ng-valid">    
    
    // jProtractor
    WebElement startBalanceField = driver.findElement(NgBy.model("startBalance"));
    
    // ngWebDriver
    WebElement startBalanceField = driver.findElement(ByAngular.model("startBalance"));
    

    【讨论】:

      【解决方案5】:

      要在上面汤姆的回答中添加一些内容,您甚至可以使用 Protractor 测试基于非 Angular 的应用程序/网站。但是仍然没有办法,您可以使用 Java 或 Python 编写 Protractor 测试,因为 Protractor 的核心是基于 Javascript(node.js) 构建的,并且是纯 Javascript。希望对您有所帮助。

      【讨论】:

        【解决方案6】:

        使用量角器的最佳方法是,分别用 javascript 编写量角器测试,并在需要时从 java/python 调用这些测试。这就是我们目前正在做的事情!

        【讨论】:

        • 你能举个例子来说明如何做到这一点吗?
        • @Saandeep Sreerambatla 你能举个例子来说明如何做到这一点吗?