javascript - While 循环导致异步问题

标签 javascript protractor

我有以下代码。我对 Protractor 和 JavaScript 比较陌生,所以如果这是一个愚蠢的问题,我深表歉意,但我做了很多研究,但没有运气。我想做的就是从下拉列表中选择一个选项,直到出现某个按钮。我的所有代码都有效,但是当我将其放入 while 循环中时,它不会执行任何操作。谁能解释为什么会发生这种情况?我知道这与它的异步方式有关,但我自己思考,无法弄清楚这一点。提前致谢。

 function selectProject(i){
            var selectSecondProject = element(by.id('translation-brief--select-project')).all(by.tagName('option')).get(i);
            selectSecondProject.click().then(function() {
                browser.sleep(2000);
            });
        };

    it('should select a different project from the drop down menu', function(){
        var loop = true;
        var i = 1;
        while(loop == true){
            selectProject(i).then(function(){
                browser.sleep(2000);
            });
                element(by.id('brief-button')).isDisplayed().then(function (isVisible) {
                    if (isVisible) {
                        loop = false;
                    }
                    else{
                        i++;
                    }
                });
        }

最佳答案

sleep 函数是异步执行的,因此它并不是真正发生在循环的计时内。事实上,循环可能会永远持续下去,永远不会给 then 函数以及 sleep 执行的机会。

异步循环函数的方法是使用setIntervalsetTimeout重新启动循环。如果不清楚的话我可以更详细地讨论。

更新:

这是我建议的一个粗略想法(我还没有实际测试过这段代码,所以要小心。这只是一个粗略的想法!):

it('should select a different project from the drop down menu', function(){
    var i = 1;
    function myLoop () {
        selectProject(i).then(function(){
            browser.sleep(2000);
            element(by.id('brief-button')).isDisplayed().then(function (isVisible) {
                if (!isVisible) {
                    i++;
                    setTimeout(myLoop);
                }
            });
        })
    }

    myLoop();
});

关于javascript - While 循环导致异步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49440628/

相关文章:

javascript - 如何让 Jasmine 测试加载数据并以正确的顺序执行

javascript - Angular 7 应用程序在 IE 11 中出错,在所有其他浏览器中运行良好

javascript - 如果我使用慢速模式对象,Object.assign 的结果会处于字典模式吗?

javascript - 在表格中打印 For 循环结果

javascript - 由于元素引用过时而导致测试不稳定

javascript - 如果客户端产生错误,则 Protractor 测试失败

angularjs - 使用 browser.get 导致异步脚本超时

node.js - 如何使用 Node.js 创建超链接 'Click here'

javascript - javascript 函数中变量的测试值 - sinon/chai

javascript - 将可编辑的文本框添加到图表中的特定数据点