量角器:在Element中存储ElementArrayFinder getTexts并从方法返回数组

时间:2018-01-31 15:45:55

标签: arrays typescript protractor

我在量角器中有一种情况,我想在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。

2 个答案:

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