我正在测试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。
答案 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。 此选项仅适用于标准(商业)包。