Javascript 如何在量角器中从promise获取嵌套JSON

Javascript 如何在量角器中从promise获取嵌套JSON,javascript,testing,promise,protractor,Javascript,Testing,Promise,Protractor,我正在测试一个输出一些数据的页面,我想将这些数据捕获到一个JSON对象中。数据显示如下(以html格式) 因此,我编写了以下代码: var cardDataToJSON = function() { var result = {}; $$('cards card').each(function (card) { card.$('#name').getText().then(function (text) { result["name"] = text; });

我正在测试一个输出一些数据的页面,我想将这些数据捕获到一个JSON对象中。数据显示如下(以html格式)

因此,我编写了以下代码:

var cardDataToJSON = function() {
    var result = {};

    $$('cards card').each(function (card) {
        card.$('#name').getText().then(function (text) { result["name"] = text; });

        var web = {};
        card.$('#web').getText().then(function (text) { 
            web["text"] = text; 
        });
        card.$('#web').getAttribute('href').then(function (href) { 
            web["href"] = href; 
        });

        result.web = web;
    });

    return result;
};
不幸的是,我的实际结果是(注意第一个“web”是空的)

我做错了什么,或者我需要在代码中改进什么

(我正在使用量角器版本3.2.2)

我将与
量角器一起使用。promise.all()


这看起来像是承诺之间的同步问题。另一种方法是进行JavaScript调用,这也会显著减少执行时间:

browser.executeScript(function() {
  return [].map.call(document.querySelectorAll('cards > card'), function(card) {
    return {
      name: card.querySelector('#name').textContent,
      web: {
        text: card.querySelector('#web a').textContent,
        link: card.querySelector('#web a').getAttribute('href')
      }
    };
  });
}).then(function(result){
  console.log(result);
});
var cardDataToJSON = function() {
    var result = {};

    $$('cards card').each(function (card) {
        card.$('#name').getText().then(function (text) { result["name"] = text; });

        var web = {};
        card.$('#web').getText().then(function (text) { 
            web["text"] = text; 
        });
        card.$('#web').getAttribute('href').then(function (href) { 
            web["href"] = href; 
        });

        result.web = web;
    });

    return result;
};
[ {
    name: "Joe",
    web: { }
  },
  {
    name: "Frank",
    web: {
        text: "frankssite.com",
        link: "http://frankssite.com"
    }
  } ]
var cardDataToJSON = function() {
    return $$('cards card').map(function (card) {
        var name = card.$('#name').getText(),
            web = card.$('#web a').getText(),
            href = card.$('#web a').getAttribute('href');

        return protractor.promise.all([name, web, href]).then(function (values) {
            return {
                name: values[0],
                web: {
                    text: values[1],
                    link: values[2]
                }
            }
        });
    });
};
browser.executeScript(function() {
  return [].map.call(document.querySelectorAll('cards > card'), function(card) {
    return {
      name: card.querySelector('#name').textContent,
      web: {
        text: card.querySelector('#web a').textContent,
        link: card.querySelector('#web a').getAttribute('href')
      }
    };
  });
}).then(function(result){
  console.log(result);
});