for循环和if量角器的问题

时间:2016-06-05 23:26:15

标签: angularjs jasmine protractor e2e-testing

我正在尝试对基于浏览器的应用程序进行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');
            }
        });
    }

网页是用角度js编写的,我试图用Protractor和Jasmine框架测试它。

问题是以下错误代码:

错误代码:100 收到的信号:null 在http://localhost:4444/wd/hub使用selenium服务器 [launcher]运行WebDriver的1个实例 [launcher]错误:SyntaxError:意外的令牌

我无法确定这个意外的令牌是什么?

2 个答案:

答案 0 :(得分:2)

首先,您不应该致电break(),而是应该使用break;

尽管如此,后续问题是break不会对此产生任何影响,因为你实际上并不在循环中(好吧,如果你从上到下阅读代码,是的,但是我们工作在这里的异步环境中,此时在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');
            }
        });
    }
});

答案 1 :(得分:1)

您不应该使用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);