JavaScript量角器虽然循环永无止境

时间:2017-06-23 20:00:17

标签: javascript protractor

我正在使用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(从列表中删除所有元素)。

出了什么问题?

2 个答案:

答案 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'参考,因为它们在承诺中变得有趣。