我正在使用Mocha和WebDriverJS测试一个Web应用程序,或多或少地描述here。测试通过后,一切都很好。但是,如果一个测试失败,套件中的其余测试将超时,并且运行器将在套件的末尾退出,而不关闭Webdriver实例。示例测试用例:
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队列在测试失败时会停止。 有没有办法解决这个问题?即使对于本地命令行测试,它也是次优的,并且它会自动和/或在后台运行测试很难做到。
更新:我认为我可以通过为每个测试实例化一个新客户端来修复队列失败,但这会使事情变得更慢(因为WebDriver实例需要每次都从头开始并且会让WebDriver进程在测试失败时不熟练。理想情况下,我喜欢Soda提供的结构,其中队列中某处的故障跳到队列的末尾,然后抛出错误以便测试框架捕获。
答案 0 :(得分:2)
如果每项测试都取决于WebDriverJS队列的状态,则应使用beforeEach()
和afterEach()
而不是before()
和after()
进行设置和拆除。
答案 1 :(得分:2)
webdriverjs的编写方式每个测试应该是一个单独的会话,因此从init()开始,以end()结束。你的测试中的一个例外将冒泡到mocha并搞乱webdriverjs队列。因此,您正试图以不受支持的方式使用webdriverjs。
查看苏打水的源代码,情况似乎也是如此。在client.js:223处理异常并将错误传递回回调。此回调是使用.end()设置的函数,因此每次测试都没有.end(),只会跳过同一会话的所有后续测试,直到调用最后一次测试的.end()回调。
你的意思是'队列中某处的故障跳到队列的末尾'是什么意思?如果这是您想要的行为,则必须使用try catch包含webdriver.js:244,并且当捕获到异常时,请调用.end()命令。
答案 2 :(得分:1)
Selenium有自己的官方webdriverjs绑定,现在在节点上运行
答案 3 :(得分:0)
你需要一个监听器才能捕获未捕获的异常
webdriver.promise.controlFlow().on('uncaughtException', function(e) {
console.error('Unhandled error: ' + e);
driver.quit();
});
这就是我在做的事情。唯一的问题是它还会捕获断言错误。 希望这有帮助。