【问题标题】:Issue with for loop and if in protractorfor循环和量角器中的问题
【发布时间】:2016-06-05 23:26:14
【问题描述】:

我正在尝试对基于浏览器的应用程序进行 e2e 测试,该应用程序将操作发送到设备然后对其进行监控。然后网页从应用程序获取更新,但不会自动刷新。我的以下代码的目的是刷新浏览器以获取操作状态的更新,启动循环计数器,检查操作的状态,如果状态是固定的 - 将该状态发送到控制台并退出循环,否则递增计数器并重复循环,直到计数器到期或返回固定或失败或锁定状态。此外,将最终操作状态发送到控制台。

代码如下:

    browser.sleep(30000);

    browser.refresh();

    for (var i = 0; i < 50; ++i) {

        console.log('i is: ', i);

        element(by.css('.deployment-card-status, result.status')).getText().then(function(text){

            var action_status = text;

            if (action_status == 'Fixed'){

                console.log('Action Passed');

                break();
            } 
            else {
                browser.sleep(30000);
                browser.refresh();
            }

            if (action_status == 'Failed' || action_status == 'Blocked'){

                console.log('Action Failed');
            }
        });
    }

网页是用 Angular js 编写的,我正在尝试使用 Protractor 和 Jasmine 框架对其进行测试。

问题是以下错误代码:

错误代码:100 收到的信号:空 在http://localhost:4444/wd/hub 使用 selenium 服务器 [启动器] 运行 1 个 WebDriver 实例 [启动器] 错误:SyntaxError: Unexpected token

我不知道这个意外令牌是什么?

【问题讨论】:

    标签: angularjs jasmine protractor e2e-testing


    【解决方案1】:

    首先,您不应该调用break(),而应该使用break;

    不过,后续问题是 break 不会在此处产生任何影响,因为您实际上不在循环中(好吧,如果您从上到下阅读代码,是的,但是我们在asynchronous 环境,此时在 Promise 解析函数中)。所以,你会得到SyntaxError: Illegal break statement 错误。

    解决这个问题的一种方法是使用done() 函数——类似于茉莉花测试的“返回”:

    it("should test something", function (done) {
        browser.sleep(30000);
    
        browser.refresh();
    
        for (var i = 0; i < 50; ++i) {
            console.log('i is: ', i);
            element(by.css('.deployment-card-status, result.status')).getText().then(function(text){
                var action_status = text;
                if (action_status == 'Fixed'){
                    console.log('Action Passed');
                    done();
                }
                else {
                    browser.sleep(30000);
                    browser.refresh();
                }
    
                if (action_status == 'Failed' || action_status == 'Blocked'){
                    console.log('Action Failed');
                }
            });
        }
    });
    

    【讨论】:

    • 好的,我尝试了您提出的解决方案。现在,我看到的不是之前的错误,而是错误:bold [31m 错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内未调用异步回调。[0m 堆栈:错误:超时 - 未在内调用异步回调jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时。在 [object Object]._onTimeout (C:\Users\hk-sel1\e2e-testing\node_modules\protractor\node_modules\jasmine\node_modules\jasmine-core\lib\jasmine-core\jasmine.js:1812:23)
    • 此外,jasmine.DEFAULT_TIMEOUT_INTERVAL 设置为 30000,但将其增加到 60000 仍会导致相同的错误。
    • @HiteshKapur 是的,恐怕还有更多内容,FlorentB 是正确的,您应该避免使用 for 循环。你试过他的解决方案吗?谢谢。
    • @HiteshKapur 请注意,尽管在循环中调用多个browser.sleep(30000) 可能需要更大的茉莉花默认超时间隔:)
    • 将 jasmine 默认超时间隔增加到 2500000 仍然会产生相同的错误。我也会尝试 FlorentB 方法。
    【解决方案2】:

    您不应该使用for 循环,因为循环中的代码是异步的。你正在处理Promises,所以这里正确的做法是将代码放在一个函数中,然后再次调用它,直到你得到预期的状态:

    (function checkActionStatus(i) {
        console.log('i is: ', i);
    
        $('.deployment-card-status, result.status').getText().then((action_status) => {
    
            // break if the status is Fixed or Failed or Blocked
            if (/^(Fixed|Failed|Blocked)$/.test(action_status)) {
                console.log('Action ', action_status);
                return;
            }
    
            // wait, refresh and retry if the counter is not expired
            if (++i < 50) {
                browser.sleep(1000);
                browser.refresh();
                checkActionStatus(i);
            }
        });
    
    })(0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多