我在量角器中有一种情况,我想在Array中存储ElementArrayFinder getTexts并从方法返回数组。到目前为止,我已经写过这样的方法:
static getAllTexts(elements: ElementArrayFinder) {
const data: string[] = [];
elements.each(function(elem) {
elem.getText().then(function (text) {
data.push(text);
});
});
return data;
}
这里的方法是返回空白数组但是如果我在promise中打印数组内容,它会显示正确的数据。任何人都可以帮我改写方法,以便返回所有数组数据,而不是返回null。
答案 0 :(得分:0)
static async getAllTexts(elements: ElementArrayFinder): Promise<string[]> {
return await elements.map(async (element: ElementFinder) => {
await element.getText();
}
}
注意:您应protractor.conf.ts
中的turn off Control Flow:
SELENIUM_PROMISE_MANAGER: false
答案 1 :(得分:0)
根本原因返回空数组return data
执行同步,但data.push(text)
执行异步。所以当getAllTexts()
执行完成时
data.push(text)
没有开始执行,所以你有一个空数组。
要解决您的代码问题,请参阅以下选项3
选项1)直接在元素上调用getText()
static getAllTexts(elements: ElementArrayFinder) {
// directly return raw text
return elements.getText();
// or do some formater
return elements.getText().then(function(txts){
return txts.map(function(txt){
return txt.replace('%', '').trim();
});
})
}
选项2)使用map()
static getAllTexts(elements: ElementArrayFinder) {
return elements.map(function(item){
// directly return raw text
return item.getText();
// or do some formater
return item.getText().then(function(txt){
return txt.replace('%', '').trim();
});
});
}
选项3)用户each()
static getAllTexts(elements: ElementArrayFinder) {
var txts = [];
return elements.each(function(item){
return item.getText().then(function(txt){
// directly return raw text
txts.push(txt);
// or do some formater
txts.push(txt.replace('%', '').trim());
});
}).then(function(){
return txts;
});
}