1

我有一个使用 Dojo 在页面之间导航的单页应用程序。我正在使用实习生编写一些功能测试,并且我正在尝试清除一些琐碎的问题。具体来说,我很难让实习生处理超时。超时似乎对我没有任何影响。我正在尝试使用“setPageLoadTimeout(30000)”设置初始加载超时,但这似乎被忽略了。我也称“setImplicitWaitTimeout(10000)”,但这似乎没有效果。

我遇到的主要问题是,在我的测试环境中,发送请求以及解析响应并将其注入 DOM 可能需要几秒钟。我能够解决这个问题的唯一方法是例如显式调用“sleep(3000)”,但这可能有点命中注定,有时 DOM 元素在我查询它们时还没有准备好。(如前所述 setImplicitWaitTimeout(10000) 似乎对我没有影响)

使用该应用程序,当 DOM 更新时,我会触发一个事件。我使用 dojo.subscribe 在应用程序中挂钩。是否可以在实习生中使用 dojo.subscribe 来控制我的测试的执行?

这是我的代码示例。我还应该提到我使用 Dijit,所以当响应返回并且正在创建小部件(通过 data-dojo-type 声明)时也会有轻微的延迟......

    define([
    'intern!object',
    'intern/chai!assert',
    'require',
    'intern/node_modules/dojo/topic'
], function (registerSuite, assert, require, topic) {
    registerSuite({
        name: 'Flow1',  
        // login to the application
        'Login': function(remote) {
            return remote
                .setPageLoadTimeout(30000)
                .setImplicitWaitTimeout(10000)
                .get(require.toUrl('https://localhost:8080/'))
                .elementById('username').clickElement().type('user').end()
                .elementById('password').clickElement().type('password').end()
                .elementByCssSelector('submit_button').clickElement().end();
        },
        // check the first page
        'Page1':function() {
            return this.remote
                .setPageLoadTimeout(300000)      // i've tried these calls in various places...
                .setImplicitWaitTimeout(10000)   // i've tried these calls in various places...         
                .title()
                    .then(function (text) {
                        assert.strictEqual(text, 'Page Title');})
                    .end()              
                .active().type('test').end()
                .elementByCssSelector("[title='Click Here for Help']").clickElement().end()             
                .elementById('next_button').clickElement().end()
                .elementByCssSelector("[title='First Name']").clear().type('test').end()
                .elementByCssSelector("[title='Gender']").clear().type('Female').end()
                .elementByCssSelector("[title='Date Of Birth']").type('1/1/1980').end()             
                .elementById('next_button').clickElement().end();
        },
        // check the second page
        'Page2':function() {            
            return this.remote
                .setImplicitWaitTimeout(10000)              
                .sleep(2000) // need to sleep here to wait for request & response injection and DOM parsing etc...
                .source().then(function(source){
                    assert.isTrue(source.indexOf('test') > -1, 'Should contain First Name: "test"');
                    }).end()
                // more tests etc...
        }
    });
});

我正在从实习生 dojo 节点模块导入相关的 Dojo 模块,但我不确定如何使用它。

谢谢

4

1 回答 1

2

您的测试正在超时,因为实习生测试有一个明确的超时设置为 30 秒,无法通过他们的 API 访问。可以通过添加'intern/lib/Test'到您的定义数组来更改它,然后覆盖测试对象的超时,例如Test.prototype.timeout = 60000;.

例如:

define([
    'intern!object',
    'intern/chai!assert',
    'require',
    'intern/node_modules/dojo/topic',
    'intern/lib/Test'
], function (registerSuite, assert, require, topic, Test) {
  Test.prototype.timeout = 60000;
  ...
}

这应该将超时更改为一分钟而不是 30 秒,以防止您的测试超时。

于 2015-01-15T14:50:13.683 回答