Protractor的map函数返回undefined

4

假设有一个带有多个小部件的应用程序,每个小部件都有自己的标题等内容,我想映射每个小部件的元素,以便在测试中更容易处理。

例如,一个页面:

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

我做错了什么?我正在使用Protractor 2.0。

4个回答

2

我也遇到了这个问题,但以上方法均未能解决。以下是真正的答案,供正在搜索的人参考:

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;
   });

2

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

虽然我知道map()会返回一个Promise,但因为我在expect中使用它,我认为它会被解析,然后应该像数组一样运作。但不是这样的。它返回一个看起来像数组的对象,但它不是一个数组。


1

map() 返回一个Promise,该Promise将解析为一个对象数组

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

var widget = page.widgets[0];

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

抱歉,alecxe,那是我的笔误。我正在使用索引。我更新了我的问题。无论我尝试什么,它仍然总是返回未定义。 - Brine
@Brine 好的,你能发一下具体的错误文本吗?谢谢。 - alecxe
使用您的示例alecxe,我收到以下错误信息:失败:无法读取未定义属性'index' - Brine
@Brine,让我们来调试一下。如果你添加了这个代码:this.widgets.then(function (widgets) { console.log(widgets); });,会打印出什么? - alecxe
@Brine 如果它是 [] - 你没有匹配 ul.widget-grid CSS 选择器的元素。 - alecxe
我和@alecxe一样。这就是为什么我想知道map在2.0中是否有问题。因为当我运行this.widgets.then(function(widgets){console.log(widgets);});时,我得到了[ ];但是当我运行console.log(element.all(by.css('ul.widget-grid')));时,我得到了[object Object]...正如预期的那样。 - Brine

0

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);
 }

var myElements = element.all(by.css('ul li')) - 1; 结尾的 -1 是什么意思? - kevin
我已经很久没有处理这个了。我认为这与数组索引有关。请查看文档https://www.protractortest.org/#/api?view=ElementArrayFinder以获取详细信息。您还可以进行快速测试以查看它实际上是做什么的。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接