这里的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
答案 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));