循环永不结束时的JavaScript量角器

循环永不结束时的JavaScript量角器,javascript,protractor,Javascript,Protractor,我正在用量角器编写JavaScript测试 最近我犯了一个错误: 致命错误:调用和重试上次分配失败-JavaScript堆内存不足 但这肯定不是内存错误,我发现该函数有问题: ProfilePage.prototype.removeProgrammingLanguages = function () { i=0; while (i < 3) { browser.findElement(By.css("//div/span")).then(null, func

我正在用量角器编写JavaScript测试

最近我犯了一个错误:

致命错误:调用和重试上次分配失败-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,从列表中删除所有元素


出什么问题了?

这个循环以cpu创建承诺的最快速度激发承诺。你不会让循环等待承诺的解决。所以它创建一个,然后移动到下一行代码。这是一个要创建的新循环。在第一个承诺解决之前,它将创造数千个承诺

您可以使用等待承诺得到解决

但是,您也可以通过递归链接承诺来解决此问题,如下所示:

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”引用,因为它们在承诺中很有趣。

我终于做到了这一点

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();
        }
    })
};

因为它是一个无限循环,是单击代码在while循环中实际触发并运行,还是while循环将其锁定。我无法理解,我得到了一个JavaScript堆内存不足错误,而日志中没有其他内容。这个函数应该做什么?假设上述方法有效,如果按钮不可点击怎么办?我们会找到该按钮并单击该按钮,但如果它没有导航到下一页,那么它将继续循环,直到出现堆外错误。首先要注意,您正在使用承诺。在使用循环之前,首先需要解决这些问题。这个循环永远不会工作。我使用上面的承诺检查更改了函数,但仍然失败,出现相同的错误。查找元素和单击函数在while循环外正常工作,这很奇怪,因为量角器甚至没有导航到目标页面,在页面代码检查时崩溃,所以循环实际上并没有开始,如何在量角器中使用while循环?谢谢,但是有一些小错误我无法解决,你能看看这个吗?:如果使用Promise.resolve,会是什么样子?抱歉,对于jsthis.programmingLanguagesRemoveButton.click,应该是function not=>for jsthis.programmingLanguagesRemoveButton.click抛出失败:无法读取未定义的属性'click',函数外部工作正常,您知道这可能是什么原因吗?现在指向函数。因此,您必须将此.programmingLanguagesRemoveButton存储在函数内部可访问的变量中。或者将其作为参数。抱歉,是findElement函数崩溃了,失败了:使用locator:Byxpath,//div/span找不到元素。奇怪的是,在sleenium服务器控制台中,我可以看到14:28:36.902信息正在执行:[查找元素:By.xpath://div/span]14:28:36.913信息-完成:[查找元素:By.xpath://div/span]并且在其工作的函数之外