量角器地图函数返回未定义

Protractor map function returning undefined

鉴于一个应用程序上有多个小部件,每个小部件都有自己的标题等等,我想映射每个小部件的元素,以便在测试中轻松处理它们。

例如一个页面:

this.widgets = element.all(by.css('ul.widget-grid')).map(function(widget, index) {
    return {
        index: index,
        title: widget.element(by.css('div.title')).getText()
    };
});

然后在我的规范中:

expect(page.widgets[0].index).toBe(0);
expect(page.widgets[0].title).toBe('The Title');

不幸的是,我的期望又回来了 undefined

我做错了什么?我正在使用量角器 2.0。

map() returns 将解析为 objects 的 数组 的承诺。

我想你是想检查第一个小部件的索引和标题:

var widget = page.widgets[0];

expect(widget.index).toBe(0);
expect(widget.title).toBe('The Title');

这让我很困惑,所以我想我会添加一个答案来帮助其他人...

虽然我明白 map() returns 是一个承诺,但因为我在 expect 中使用它,所以我认为它会被解决,然后应该像数组一样工作。没有。它returns一个对象,看起来像一个数组,但不是一个数组。

我 运行 遇到了这个问题,其中 none 为我解决了这个问题。对于像我一样谷歌搜索的人来说,真正的答案是:

element.all(by.css('ul.widget-grid')).map(function(widget, index) {
    return {
        index: index,
        title: widget.element(by.css('div.title')).getText()
    }
}).then(function(map){
      this.widgets = map;
   });

Protractor 的ElementArrayFinder.prototype.map 给了我一些困难。
对我有用的解决方案是一个很好的旧 for 循环:

 var myElements = element.all(by.css('ul li')) - 1;
 var n = myElements.length - 1;

 for (var i = 0; i < n; i++) {
     var elem = myElements.get(i);
     var open = elem.element(by.css('.some-class'));
     open.click();
     var childElem = filter.element(by.css('[some-attribute]'));
     expect(childElem.isPresent()).toBe(true);
 }