Javascript Jasmine测试在div中迭代多个结果时以不合逻辑的顺序运行代码?

Javascript Jasmine测试在div中迭代多个结果时以不合逻辑的顺序运行代码?,javascript,angularjs,selenium,jasmine,protractor,Javascript,Angularjs,Selenium,Jasmine,Protractor,我正试图编写一个测试来获取div的内容,并将其与我的期望进行比较 我知道我可以预期多个结果,所以我一直在尝试一次迭代一个结果,并将它们连接成一个字符串,然后与我的预期进行比较 下面的代码片段似乎无法按预期工作。我的控制台返回“要返回的结果:”,在返回“while:1内部结果”和“while:12内部结果”之前,没有任何结果 这对我来说没有任何意义。。。希望我已经很好地解释了我要做的事情。代码目前不是很好,因为我一直在切块和更改位来测试正在发生的事情 A'tl;博士的总结,我希望有人能帮我:)

我正试图编写一个测试来获取div的内容,并将其与我的期望进行比较

我知道我可以预期多个结果,所以我一直在尝试一次迭代一个结果,并将它们连接成一个字符串,然后与我的预期进行比较

下面的代码片段似乎无法按预期工作。我的控制台返回
“要返回的结果:”
,在返回
“while:1内部结果”和
“while:12内部结果”之前,没有任何结果

这对我来说没有任何意义。。。希望我已经很好地解释了我要做的事情。代码目前不是很好,因为我一直在切块和更改位来测试正在发生的事情

A'tl;博士的总结,我希望有人能帮我:)

  • 如何迭代
    元素.all
    行返回的每个项,并将值连接成字符串,以便函数返回到我的测试
  • 有人能帮我理解为什么在我事先设置为0时if/else看起来是真的(我确信在这种情况下
    items.length
    是2)
  • 有人能给我指一个好地方,让我仔细阅读承诺吗?我有一种感觉,我对承诺的理解太差了,这让我望而却步
测试:

var resultPage = require('../page/result.page.js');
var ExpectedArticle1Details = browser.params.articleInTransitInTransit[0];
var ExpectedArticle2Details = browser.params.articleNotCompliantPossibleDelay[0];
var ExpectedIDs = ' ' + ExpectedArticle1Details.TrackingID + '  ' + ExpectedArticle2Details.TrackingID

expect(resultPage.allTrackingIDsAreVisible()).toEqual(ExpectedIDs);
this.allTrackingIDsAreVisible = function () {
    var result = "";
    element.all(by.css(trackingIDs)).then(function (items) { var i = 0;
      while (i <= items.length) {
        if (i === items.length) {
          console.log("result to be returned: " + result);
          return result;
        }
        else
        {
          items[i].getAttribute("innerHTML").then(function (value){result += value; console.log("result INSIDE while: " + result)})
        }
        i = i + 1;
      }
    })  
  };
结果页:

var resultPage = require('../page/result.page.js');
var ExpectedArticle1Details = browser.params.articleInTransitInTransit[0];
var ExpectedArticle2Details = browser.params.articleNotCompliantPossibleDelay[0];
var ExpectedIDs = ' ' + ExpectedArticle1Details.TrackingID + '  ' + ExpectedArticle2Details.TrackingID

expect(resultPage.allTrackingIDsAreVisible()).toEqual(ExpectedIDs);
this.allTrackingIDsAreVisible = function () {
    var result = "";
    element.all(by.css(trackingIDs)).then(function (items) { var i = 0;
      while (i <= items.length) {
        if (i === items.length) {
          console.log("result to be returned: " + result);
          return result;
        }
        else
        {
          items[i].getAttribute("innerHTML").then(function (value){result += value; console.log("result INSIDE while: " + result)})
        }
        i = i + 1;
      }
    })  
  };
this.allTrackingIDsAreVisible=函数(){
var结果=”;
元素.all(by.css(trackingid)).then(函数(项){var i=0;

而(i我将首先解释为什么会发生这种情况,然后提出解决方案。 你调用一个while循环,它总是做一些异步的事情(一个承诺),所以它总是把它添加到队列中,然后去同步地做下一行,那就是i+=1;,所以循环在所有承诺都可以解决之前结束,
result
甚至还没有改变,它已经返回空了

您应该使用的是element.all(by.css(trackingIDs))上的递归函数,其签名为:

addToResult(elementArray, i, result) {};
每次你这样做:

items[i].getAttribute("innerHTML").then(function (value){
    addToResult(elementArray, i + 1, result += value)
})

i===elementArray.length
时,不要忘记停止递归,然后返回结果

解决此问题的简单方法是使用量角器的内置
.each()
函数,而不是使用for或while循环遍历元素-

element.all(by.css(trackingIDs)).each(function (eachItem){
    eachItem.getAttribute("innerHTML").then(function (value){
        addToResult(elementArray, i + 1, result += value);
    });
});
由于量角器的异步性质,上述数据可能不同步,并且可能会按照通常发生的顺序变化。在这种情况下,请使用
.map()
函数以同步形式检索数据。下面是一个示例-

element.all(by.css(trackingIDs)).map(function (items){
    return items.getAttribute("innerHTML").then(function (value){
        return value;
    });
}).then(function(val){
    addToResult(elementArray, i + 1, result += val);
});

希望能有帮助。

Hi@vrachlin,谢谢你的建议。我现在正在努力解决这个问题,但这是我一天工作的结束,所以我的大脑可能已经关闭了。如果你能澄清:在你的建议中,
addToResult
函数在哪里运行?我的结果页面中是否有
elementArray===items
e?我将在早上研究如何实施您的建议,并让您知道我的做法。:@ShaneNayler elementArray确实是您代码中的项,因此第一个调用将是
var result=addToResult(items,0,”)
,addToResult将与使用它的位置在同一范围内,在本例中,或在
此内。所有TrackingID均可见
,或与它在同一范围内。