12

我正在使用 Mocha 和WebDriverJS测试一个 Web 应用程序,或多或少如此所述。当测试通过时,一切都很好。但是,如果一个测试失败,套件中的其余测试将超时,并且运行器将在套件结束时退出,而不关闭 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提供的结构,其中队列中某处的失败会跳到队列的末尾,然后抛出错误以供测试框架捕获。

4

4 回答 4

2

编写 webdriverjs 的方式每个测试应该是一个单独的会话,因此以 init() 开始并以 end() 结束。测试中的异常将冒泡到 mocha 并弄乱 webdriverjs 队列。因此,您正在尝试以不受支持的方式使用我们的 webdriverjs。

查看 soda 的源代码似乎也是如此。在client.js:223中处理异常并将错误传递回回调。此回调是使用.end()设置的函数,因此没有为每个测试设置 .end() 将简单地跳过同一会话的所有后续测试,直到调用最后一个测试的 .end() 回调。

这就是您所说的“队列中某处的故障跳到队列末尾”的意思吗?如果这是您想要的行为,则必须将webdriver.js:244包含在 try catch 中,当捕获到异常时,调用.end()命令。

于 2012-11-22T08:04:19.817 回答
2

如果每个测试都依赖于 WebDriverJS 队列的状态,您应该使用beforeEach()andafterEach()而不是设置before()和拆除。after()

于 2012-11-13T18:16:03.627 回答
1

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

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

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

于 2013-02-16T13:57:17.357 回答
0

您需要一个侦听器来捕获未捕获的异常

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

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

于 2014-03-26T00:45:14.760 回答