使用带有Java的量角器

use*_*901 11 java protractor

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

Tom*_*ijs 8

不幸的是,你没有太多的选择,因为Protractor是AngularJS的JavaScript测试框架,它通过Node.js分发.

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

量角器是针对angularJS应用定制的.因此,如果您的应用程序是使用AngularJS创建的,Protractor将提供帮助,因为它内置了对AngularJS页面加载和操作的支持.

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

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


Sco*_*ing 5

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

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

有一个 JS 函数接受回调,一旦 Angular 准备好就会通知你。

angular.getTestability("body").whenStable(callback);
Run Code Online (Sandbox Code Playgroud)

注意:这适用于 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]);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Man*_*noj 5

Java中已经有一个用于自动化Angular内容的库.它基于Protractor构建,称为" ngWebDriver "


sil*_*ver 5

截至2017年,我发现了这些Java量角器库:

  • jProtractor-开发有些不活跃,但是我已经对其进行了测试。单击此处了解更多详细信息。
  • 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"));
Run Code Online (Sandbox Code Playgroud)