我正在使用Protractor编写JavaScript测试
最近我收到了一个错误:
致命错误:CALL_AND_RETRY_LAST分配失败 - JavaScript堆内存不足
但它肯定不是记忆错误,我发现这个功能出了点问题:
ProfilePage.prototype.removeProgrammingLanguages = function () {
i=0;
while (i < 3) {
browser.findElement(By.css("//div/span")).then(null, function (err) {
if (err.name == "NoSuchElementError") {
i=11;
}
this.programmingLanguagesRemoveButton.click();
i++;
});
}
};
我希望量角器单击一个按钮,直到find元素返回NoSuchElementError(从列表中删除所有元素)。
出了什么问题?
答案 0 :(得分:1)
我终于设法做到了这一点
ProfilePage.prototype.removeProgrammingLanguages = function removeProgrLanguages() {
browser.findElement(By.xpath("//div/span")).then(function (err) {
element(By.css("div.lang-cloud.remove > span")).click().then(removeProgrLanguages);
}, function (err) {
if (err) {
console.log(err.name);
} else {
promise.rejected();
}
})
};
答案 1 :(得分:0)
这个循环以你的cpu可以创建它们的速度来激发promise。你没有让循环等待承诺解决。所以它创建一个然后移动到下一行代码。这是一个创建一个新循环。它将在第一个解决之前创造出数千个承诺。
您可以使用Promise.resolve()等待承诺得到解决。
然而你也可以通过递归链接这样的承诺来解决这个问题:
ProfilePage.prototype.removeProgrammingLanguages = function removeProgrammingLanguages() {
return browser.findElement(By.xpath("//div/span")).then(function() {
this.programmingLanguagesRemoveBttn = element(By.css("div.lang-cloud.remove > span"));
return this.programmingLanguagesRemoveBttn.click().then(removeProgrammingLanguages)
})
};
拒绝承诺时此功能将停止。你将不得不改变'this'参考,因为它们在承诺中变得有趣。