Angularjs 量角器在电子测量中的应用

Angularjs 量角器在电子测量中的应用,angularjs,testing,protractor,electron,Angularjs,Testing,Protractor,Electron,我正在尝试为我使用的应用程序设置单元测试和e2e测试。我已经参考了许多不同的帖子(确实有帮助),但我仍然得到一个我不理解的错误: Message: Error while waiting for Protractor to sync with the page: "angular could not be found on the window" Stacktrace: undefined 我的conf.js文件如下所示: exports.config = { directCo

我正在尝试为我使用的应用程序设置单元测试和e2e测试。我已经参考了许多不同的帖子(确实有帮助),但我仍然得到一个我不理解的错误:

Message:
  Error while waiting for Protractor to sync with the page: "angular could not be found on the window"
Stacktrace:
  undefined
我的conf.js文件如下所示:

exports.config = {
    directConnect : true,
    seleniumAddress: 'http://localhost:4444/wd/hub',
    baseUrl:"file://home/me/workspace/testing-project/main.js",
    capabilities: {
        browserName: "chrome",
        chromeOptions: {
            binary: "/home/me/.linuxbrew/lib/node_modules/electron-prebuilt/dist/electron",
            args: ["--test-type=webdriver"]
        }
    },
    specs: ['todo-specs.js'],
    onPrepare: function(){
        browser.resetUrl = "file://";
        browser.driver.get("file://");
    }
};
考虑到上提供的文档,我的印象是我不需要安装任何其他东西(例如Jasmine)。
让我惊讶的是,即使到main.js(根据Electron的规范启动应用程序)的路径是正确的,我在弹出的Electron窗口中也看不到任何东西。

你们有没有遇到过这个问题?您解决了吗?

量角器设计用于角度应用程序,但您也可以将其用于“非角度”应用程序

如果您在electron应用程序中使用angular,那么它只需查看
ng应用程序
并同步即可


如果你没有使用AngularSite应用程序,你应该设置isAngularSite(false),然后它将不会尝试同步。

显然,使用电子二进制文件不足以实际启动你的应用程序。但是,通过为应用程序构建二进制文件并将其链接到conf.js文件中,就可以了。
我已经能够将我的文件缩减为:
conf.js

exports.config = {
    seleniumAddress: 'http://localhost:4444/wd/hub',
    specs: ['test-spec.js'],
    capabilities: {
        browserName: "chrome",
        chromeOptions: {
            binary: "./dist/myAwesomeApp/myAwesomeAppBinary"
        }
    },
    onPrepare: function () {
        browser.resetUrl = "file://";
    }
};
通过这种方式,无需描述
baseUrl
或使用
browser.get()
browser.driver.get()
在Electron中启动应用程序。

然而,我宁愿不必构建应用程序二进制文件,但我认为目前不可能实现。

量角器与Electron不兼容,因为它无法访问Electron特定的API,并且无法正确控制渲染器。

,另一方面,它是专门为电子设计的,并且有一个非常类似于量角器的API。它允许您同时测试主进程和渲染器进程

我不得不从量角器复制一些代码,让它等待Angular 2正确加载。(如果不使用Angular,则忽略不计。)以下是一个工作示例:

const path = require('path');
const electron = require('electron-prebuilt');
var Application = require('spectron').Application
var assert = require('assert')

let appPath = path.join(__dirname, '..', 'dist');

function awaitAngular2(client) {
  client.timeoutsAsyncScript(5000);
  // From: https://github.com/angular/protractor/blob/master/lib/clientsidescripts.js
  // Returns a promise that resolves when all of Angular 2's components are loaded and stable
  return client.executeAsync(function(done) {
    try {
      var testabilities = window.getAllAngularTestabilities();
      var count = testabilities.length;
      var decrement = function() {
        count--;
        if (count === 0) {
          done();
        }
      };
      testabilities.forEach(function(testability) {
        testability.whenStable(decrement);
      });
    } catch (err) {
      done(err.message);
    }
  });
}

describe('application launch', function () {
  this.timeout(10000)

  beforeEach(function () {
    this.app = new Application({
      path: electron,
      args: [appPath]
    });
    return this.app.start().then(() => {
      return awaitAngular2(this.app.client);
    })
  });

  afterEach(function () {
    if (this.app && this.app.isRunning()) {
      return this.app.stop()
    }
  });

  it('shows an initial window', function () {
    return this.app.client.getWindowCount().then(function (count) {
      assert.equal(count, 1)
    })
  });

  it('shows a headline', function () {
    this.app.client.getText('app-banner h1').then(function (bannerText) {
      assert.equal(bannerText, 'Tour of Heroes');
    })
  });
});

如果您有多个要自动运行的.spec文件,那么您可以将其与或Mocha Node.js测试运行程序集成。

假设您从
main.js
所在的项目根目录启动量角器,您应该能够设置
量角器.conf.js
如下:

exports.config = {
    directConnect: true,
    capabilities: {
        browserName: 'chrome',
        chromeOptions: {
            binary: 'node_modules/.bin/electron',
            args: ['app=main.js']
        }
    },
    onPrepare: function () {
        browser.resetUrl = "file://"
    }
}

capabilities.chromeOptions.args的选项是传递的
electron
。有关
功能的更多文档,请参见。

应用程序正在main.js调用的index.html文件中使用
ng app
mainWindow.loadUrl(
),但在此之前它甚至失败:index.html从未显示。我尝试了你的解决方案,它解决了同步角度的问题,但是测试失败了,因为html从来没有显示过。碰巧我们可以为此建立一个博客吗?这将是一篇精彩的博文(包含更多细节)!我不认为量角器有任何关于这方面的文档,它可能会帮助电子用户考虑使用量角器。当你创建了一篇博文,在这里用链接回复。谢谢此外,如果您对以下方面有任何见解: