当mocha测试超时时停止webdriver

时间:2015-01-20 15:54:26

标签: selenium webdriver mocha

我遇到运行mocha和webdriverio的问题。当测试超时时,webdriver客户端仍然继续运行。

var assert = require('assert');                                                     
var webdriverio = require('webdriverio');                                           

describe('suite', function() {                                                      

    beforeEach(function(callback) {                                                 
        this.client = webdriverio.remote().init(callback);                          
    });                                                                             

    it('test1', function(callback) {                                                
        this.timeout(500);                                                          
        this.client                                                                 
            .pause(550)                                                             
            .call(function() {                                                      
                assert(false, 'You shouldn\'t be here!');                           
            })                                                                      
            .call(callback);                                                        
    });                                                                             

    afterEach(function(callback) {                                                  
        this.client.end(callback);                                                  
    });                                                                             

});

当我执行mocha test.js时,我得到:

  suite
    1) test1
    2) "after each" hook

  0 passing (2s)
  2 failing

  1) suite test1:
     Error: timeout of 500ms exceeded
      at null.<anonymous> (/usr/local/lib/node_modules/mocha/lib/runnable.js:158:19)
      at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

  2) suite "after each" hook:
     Uncaught AssertionError: You shouldn't be here!
      at WebdriverIO.<anonymous> (/Users/user/Documents/test/test.js:15:17)
      at WebdriverIO.<anonymous> (/Users/user/Documents/test/node_modules/webdriverio/lib/utils/PromiseHandler.js:146:26)
      at /Users/user/Documents/test/node_modules/webdriverio/node_modules/chainit/index.js:137:22
      at process._tickCallback (node.js:419:13)

我不希望或期望发生第二个错误。我如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

我最终编写了自己的mocha包装器,扩展了常规的mocha运行器,然后能够捕获第一个错误并停止执行第二个错误。不幸的是,没有简单的解决方案......

答案 1 :(得分:0)

可以使用包含发生的错误的参数调用Mocha为异步函数提供的回调。捕获断言抛出的异常并将其传递给callback允许Mocha继续执行其工作。摩卡只是忽略了对callback的调用。

it('test1', function(callback) {
    this.timeout(500);
    this.client
        .pause(550)
        .call(function() {
            try {
                assert(false, 'You shouldn\'t be here!');
                callback();
            }
            catch (e) {
                callback(e);
            }
        });
});

必须删除第二个.call()调用,因为在代码没有超时的情况下,callback将被调用两次。

如果您想避免在任何地方添加try... catch...,可以使用:

function handle_errors(test_code, callback) {
    return function () {
        try {
            test_code();
            callback();
        }
        catch (e) {
            callback(e);
        }
    };
}

并将通话更改为:

    this.client
        .pause(550)
        .call(handle_errors(function() {
            assert(false, 'You shouldn\'t be here!');
        }, callback));