1

我正在用 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();
        }
    );
});

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

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

我怎样才能解决这个问题?

我正在使用 siesta-3.0.2-lite 和 ExtJS 5.1.0。

4

2 回答 2

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 来检查事件,所以我不确定它是否有效。

于 2015-07-08T12:58:41.180 回答
1

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

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

Siesta 会从每个测试的上下文中覆盖本机“setTimeout”以进行异步代码跟踪,但这似乎会导致问题。它适用于论坛上的许多用户,告诉我它是否适用于您,因为它没有解决我的问题。

更新:

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

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

于 2015-08-05T14:21:43.863 回答