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