在量角器中使用 angular 个函数 ($q)

Using angular functions ($q) in protractor

我想在我的 e2e 测试中使用 angular 的 $q 服务。 (我想通过 getText() 获取一堆元素的文本,其中 return 是一个承诺。在解决所有承诺之后,我想测试列表。所以我想使用 $q.all() 等)

angular.injector(['myApp']).get('$q'); 结果为 "ReferenceError: angular is not defined"

通过节点安装 angular 然后 var angular = require("angularjs"); 结果 "Error: Cannot find module 'angular'"

此外,插入 browser.waitForAngular() 也无济于事。

使用inject(function($q) {})语法也有同样的问题。

如何在量角器中使用这样的 angular 函数?


编辑:

这是我想要实现的非常天真的版本

var collectEntries = function(containers) {
    var entries = {};
    containers.each(function (container) {
        var title = container.element(by.tagName('h2'));
        title.getText().then(function (text) {
            var key = getSomeKey();
            var entry = processEntry(text);
            entries[key] = entry;
        });
    });
    return entries;
};

这在原则上是有效的,在某个时间点 entries 包含所有数据。但是,我需要等待那一刻。我要做的是创建并 return 一个承诺,一旦所有 getText 承诺得到解决,该承诺就会得到解决。

例如

var deferred = $q.defer();
$q.all(getTextPromises).then(function () {
    deferred.resolve(entries);
});
return deferred.promise;

从你的代码来看 containers 是一个 elementFinder 列表? (即 var containers = [element(by.x), element(by.y), element(by.z)]):

Using q:(需要先在package.json中添加q作为依赖)

    var q = require('q');
    var collectEntries = function(containers) {
        var entries = {};
        containers.each(function (container) {
            var deferred = q.defer();
            var title = container.element(by.tagName('h2'));
            title.getText().then(function (text) {
                deferred.resolve(processEntry(text));
            });
            entries[getSomeKey()] = deferred.promise();
        });
        return q.all(entries);
    };

    expect(collectEntries).toBe({key1: 'title1', key2: 'title2'})

但是 protractor 自己知道 promise(最好不要将 protractor 的 promise 和 q promise 混用,除非你知道自己在做什么):

    var collectEntries = function(containers) {
        var entries = {};
        containers.each(function (container) {
            entries[getSomeKey()] = container.element(by.tagName('h2')).
                getText().then(function (text) {
                    return processEntry(text);
                });
        });
        return protractor.promise.fullyResolved(entries);
    };

    expect(collectEntries).toBe({key1: 'title1', key2: 'title2'})

如果您的 containers 是使用单个选择器(即 var containers = element.all(by.xyz))找到的,则更容易:

    var collectEntries = function(containers) {
        return containers.reduce(function(entries, elem) {
          return elem.getText().then(function(text) {
            entries[getSomeKey()] = processEntry(text);
            return entries;
          });
        }, {});
    };

    expect(collectEntries).toBe({key1: 'title1', key2: 'title2'})