Node.js + mocha + webdriverjs:失败的testingkill套件

我正在使用Mocha和WebDriverJStesting一个Web应用程序,或多或less地在这里描述 。 当testing通过,一切都很好。 但是,如果一个testing失败,套件中的其余testing将超时,跑步者将在套件结束时退出,而不closuresWebdriver实例。 示例testing用例:

var assert = require('assert'), client = require("webdriverjs").remote({ logLevel: 'silent' }); describe('Self-test', function() { before(function(done) { client .init() .url('http://www.wikipedia.org/', function() { done(); }); }); after(function(done) { client.end(function() { done(); }); }); // tests it('should fail properly', function(done) { client.getTitle(function(result) { assert(false, 'This should fail'); done(); }); }); it('should pass afterwards', function(done) { client.getTitle(function(result) { assert(true, 'This should still pass'); done(); }); }); }); 

输出:

 ~> mocha test/self-test.js Self-test 1) should fail properly 2) should pass afterwards 3) "after all" hook ✖ 3 of 2 tests failed: 1) Self-test should fail properly: AssertionError: This should fail at null.<anonymous> (./test/self-test.js:24:17) at QueueItem (./node_modules/webdriverjs/lib/webdriverjs.js:242:15) at null.<anonymous> (./node_modules/webdriverjs/lib/commands/getTitle.js:12:6) at QueueItem (./node_modules/webdriverjs/lib/webdriverjs.js:242:15) at IncomingMessage.WebdriverJs.proxyResponse (./node_modules/webdriverjs/lib/webdriverjs.js:782:6) at IncomingMessage.EventEmitter.emit (events.js:115:20) at IncomingMessage._emitEnd (http.js:366:10) at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23) at Socket.socketOnData [as ondata] (http.js:1366:20) at TCP.onread (net.js:402:27) 2) Self-test should pass afterwards: Error: timeout of 10000ms exceeded at Object.<anonymous> (./node_modules/mocha/lib/runnable.js:158:14) at Timer.list.ontimeout (timers.js:101:19) 3) Self-test "after all" hook: Error: timeout of 10000ms exceeded at Object.<anonymous> (./node_modules/mocha/lib/runnable.js:158:14) at Timer.list.ontimeout (timers.js:101:19) 

据我所知,这是因为WebDriverJS队列在testing失败时会停滞。 有没有什么办法解决这一问题? 即使对于本地的命令行testing也是次优的,并且使得自动和/或在后台运行testing是困难的。

更新:我想我可以通过为每个testing实例化一个新的客户端来解决队列故障,但是这会让事情变得更慢(因为WebDriver实例每次都需要从头开始),并且会使WebDriver进程挂起testing失败。 理想情况下,我想要像苏打水提供的结构,在队列中的某处失败跳到队列的末尾,然后抛出错误的testing框架赶上。

如果每个testing都依赖于WebDriverJS队列的状态,则应该设置并拆除beforeEach()afterEach()而不是before()after()

webdriverjs写入每个testing的方式应该是一个单独的会话,因此从init()开始并以end()结束。 在你的testing中的一个例外将冒泡摩卡咖啡和搞乱webdriverjs队列。 因此,您正在尝试以不支持的方式使用webdriverjs。

看苏打水的源代码,这似乎也是如此。 在client.js中:处理了223个exception,并将错误传回给callback。 这个callback是使用.end()设置的函数,因此对于每个testing都没有.end()将直接跳过同一会话的所有后续testing,直到调用最后一个testing的.end()callback。

这是你的意思,“队列中的某处失败跳到队列的末尾”? 如果这是您想要的行为,则必须用try catch附上webdriver.js:244 ,并在发生exception时调用.end()命令。

Selenium有自己的官方webdriverjs绑定,现在在节点上运行

http://code.google.com/p/selenium/wiki/WebDriverJs

在npm上https://npmjs.org/package/selenium-webdriver

你需要一个listner来捕获未捕获的exception

 webdriver.promise.controlFlow().on('uncaughtException', function(e) { console.error('Unhandled error: ' + e); driver.quit(); }); 

这是我正在做的。 唯一的问题是它也捕获断言错误。 希望这可以帮助。