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绑定,现在在节点上运行
你需要一个listner来捕获未捕获的exception
webdriver.promise.controlFlow().on('uncaughtException', function(e) { console.error('Unhandled error: ' + e); driver.quit(); });
这是我正在做的。 唯一的问题是它也捕获断言错误。 希望这可以帮助。