将一组元素转换为promise并将其返回

时间:2016-01-26 04:50:09

标签: javascript asynchronous promise protractor

这里的actualLevels数组在expect行中抛出空数组。我需要填充实际的Level并在数组完全填充后返回断言

代码:

var expected = ['Level 2', 'Level 3', 'Level 4'];
var actualLevels=[];

element.all(by.css('somecssid')).each(function(elm) {
    elm.getText().then(function (textValue) {
        console.log(textValue);  // prints texts of the css i.e.Level1
        actualLevels.push(textValue);
    })
}
expect(actualLevels).toBe(expected);  // jasmine expect assertion

3 个答案:

答案 0 :(得分:1)

您可以直接致电getText()上的ElementFinderArray

expect(element.all(by.css('somecssid')).getText()).toEqual(expected);

请注意,无需手动解决承诺,在Protractor expect()中修补以隐式理解和解决承诺。

注意2:toBe会检查两个变量是否指向同一个对象 - 您需要toEqual

仅供参考,each()不是一个好选择,map()会更合适:

var expected = ['Level 2', 'Level 3', 'Level 4'];
var actualLevels = element.all(by.css('somecssid')).map(function(elm) {
    return elm.getText();
});
expect(actualLevels).toEqual(expected);  // jasmine expect assertion

如果您想要逐个在控制台上另外记录文本,请解析getText()

var actualLevels = element.all(by.css('somecssid')).map(function(elm) {
    return elm.getText().then(function (text) {
        console.log(text);
        return text;
    });
});

仅供参考2:您可以使用快捷方式替换element.all(by.css('somecssid'))

$$('somecssid')

答案 1 :(得分:0)

由于您的getText函数是异步的,因此在将任何内容推送到expect之前,会调用第10行的textValue

此外,插入textValue的顺序不保证相同,因为每次调用都是异步的。最终可能会出现['Level 4', 'Level 2', 'Level 3']之类的内容。要解决此问题,您需要使用Promise.map之类的内容。你可以做点什么

Promise.map(arrayOfThings, function(elm) { return elm.getText(); }).then(function(actualLevels){ expect(actualLevels).toBe(expected); });

理想情况下,您将使用测试框架中的可选回调参数来测试此代码。

答案 2 :(得分:0)

在Jasmine环境中不确定,但一般来说,您正在寻找的模式是

Promise.all(element.map(actualLevel)) . 
  then(actualLevels => console.log(actualLevels));