0

我正在使用 PhantomJS (via selenium-webdriver) 和 Mocha 编写一个测试套件。对于报告,每次测试失败时我都需要一个屏幕截图,因此我基于报告器为 Mocha 编写了一个自定义报告器spec

module.exports = Screenshot;

var Spec = require('mocha/lib/reporters/spec');
var fs = require('fs');

// custom library generating PhantomJS instances
var phantoms = require("phantoms"); 

function Screenshot(runner) {
    Spec.call(this, runner);

    runner.on('fail', function(test, err){
        var driver = phantoms.getDriver();

        driver.getCurrentUrl().then(function(url) {
            console.log(url);
        });

        console.log('This works');    

        driver.takeScreenshot().then(function(img) {
            console.log("Writing screenshot");
            fs.writeFileSync("/tmp/selenium.png", img, 'base64');
            return "/tmp/selenium.png";
        });

        console.log('This also works');    

    });
}

Screenshot.prototype.__proto__ = Spec.prototype;

现在,当测试失败时,我遇到了一个有趣的情况:Mocha 从钩子回调(例如两个日志语句)同步执行所有操作,但是getCurrentUrlpromise 和 for都没有takeScreenshot得到解决,这显然不是我所期望的。

但是,我发现如果我在定义这些承诺之后(例如 after driver.takeScreenshot())抛出异常,Mocha 会立即终止而没有正确的报告或错误消息(到目前为止还可以,即使我更喜欢获得“Reporter”引发了意外的异常”消息),但同时解决了两个 WebDriver 承诺,因此会截取屏幕截图,并且在退出之前打印当前 URL。

我正在玩一个仅包含几个测试的小型测试套件,所以我认为也许 Mocha 认为钩子已完成并在承诺有机会解决之前返回操作系统。有没有另一种解释?我在这里有错还是摩卡咖啡?我该如何正确解决这个问题?

PS:完全有可能selenium-webdriver它的承诺框架在这里有问题。但是,我不想责怪,而是找到解决方案,我很高兴对这种现象的任何解释。

4

1 回答 1

1

回答我自己的问题:似乎 Mocha 目前无法在其钩子中使用异步功能。我已经在 Github 上打开了一个关于此的问题。

更新:我已经解决了这个问题并记录在上面的问题中。问题是 Mocha 上的一个 wiki 条目,描述了程序化测试运行,它采用了直接process.exit()而不是 async process.on("exit", ...)

于 2013-09-20T14:23:20.430 回答