Siesta Ext JS测试未完成

时间:2015-07-04 16:25:34

标签: javascript extjs automated-tests web-frontend siesta

我正在测试Siesta的Ext JS前端。 这是我的登录/注销测试:

StartTest(function(t) {
    t.diag("Login/Logout");
    t.chain(
        { waitForCQ : '#loginPanel' },
        function(next) {
            t.cq1("#username").setValue();
            t.cq1("#password").setValue();
            next();
        },
        { click: '>> #username' },
        { type: '******', target : '>> #username' },
        { type: '******', target : '>> #password' },
        { click: '>> #loginButton' },
        { waitForCQ: '#mainView' },
        { click: '>> #logoutButton' },
        { waitForCQ: 'messagebox #ok' },
        function(next) {
            t.waitForEvent(Ext.globalEvents, 'logoutComplete', function () {});
            next();
        },
        { click : '>> messagebox #ok' },
        function() {
            t.done();
        }
    );
});

测试将用户名和密码输入登录面板,然后单击登录按钮。加载主视图后,它会注销。 出于某种原因,这个测试永远不会结束。

链中的每个动作都是成功的,但测试仍在停止运行。

我该如何解决这个问题?

我正在使用带有ExtJS 5.1.0的siesta-3.0.2-lite。

2 个答案:

答案 0 :(得分:2)

1#首先,您可以尝试删除t.done(),除非您真的在等待,否则测试中通常不需要它。线束设置中的needDone具有默认值False。

2#您正在使用waitForEvent,这通常在您在那里传递回调时完成。所以你的功能看起来像这样:

function(next) {
    t.waitForEvent(Ext.globalEvents, 'logoutComplete', next);
},

但是如果你只是想知道事件被触发,你可以使用函数firesOnce。不要忘记你需要在执行动作之前注册检查事件才能触发它。

所以你的代码看起来像这样:

 function(next) {
     t.firesOnce(Ext.globalEvents, 'logoutComplete','Logout completed!');
     next();
 },
 { click: '>> #logoutButton' },
 { waitForCQ: 'messagebox #ok' },
 { click : '>> messagebox #ok' },

但我从未使用过Ext.globalEvents来检查事件,所以我不确定它是否有效。

答案 1 :(得分:1)

论坛上的Siesta开发人员建议通过在您的线束配置中将overrideSetTimeout设置为false来解决此问题。

Harness.configure({
    ...
    overrideSetTimeout: false,
    ...
});

Siesta会覆盖本地" setTimeout"从每个测试的上下文中进行异步代码跟踪,但它似乎会引起问题。 它适用于论坛上的许多用户,告诉我它是否适合你,因为它没有解决我的问题。

<强>更新

我身边的问题原因是注销本身,它使用了window.location.reload()。如果有两个单独的页面/应用程序,这会使浏览器动作。

显然,您需要在harness对象中将separateContext 选项设置为true。 此选项仅适用于标准(商业)包。