Javascript 在PhantomJS2中运行测试时拍摄Karma的屏幕截图?

Javascript 在PhantomJS2中运行测试时拍摄Karma的屏幕截图?,javascript,phantomjs,screenshot,karma-runner,qunit,Javascript,Phantomjs,Screenshot,Karma Runner,Qunit,我需要一种方法,在使用QUnit和Karma在PhantomJS 2.0.1中运行的测试期间拍摄屏幕截图 我发现这个命令: window.top.callPhantom('render'); 这不会引发任何错误,但似乎不起作用,或者至少,我不知道在哪里可以找到拍摄的截图 window.top.callPhantom({type: 'render', fname: '/tmp/myscreen.png'}); 有线索吗?找到了办法 解决方案 我必须编辑我的自定义PhantomJS自定义启动器,

我需要一种方法,在使用QUnit和Karma在PhantomJS 2.0.1中运行的测试期间拍摄屏幕截图

我发现这个命令:

window.top.callPhantom('render');
这不会引发任何错误,但似乎不起作用,或者至少,我不知道在哪里可以找到拍摄的截图

window.top.callPhantom({type: 'render', fname: '/tmp/myscreen.png'});
有线索吗?

找到了办法

解决方案 我必须编辑我的自定义PhantomJS自定义启动器,添加一个选项:

PhantomJSCustom: {
    base: 'PhantomJS',
    options: {
        onCallback: function(data){
            if (data.type === "render") {
                // this function will not have the scope of karma.conf.js so we must define any global variable inside it
                if (window.renderId === undefined) { window.renderId = 0; }
                page.render(data.fname || ("screenshot_" + (window.renderId++) + ".png"));
            }
        }
    }
}
如您所见,我们正在定义该选项,它将被注入由
phantomjs
启动的脚本中。 那么,脚本将包含:

page.onCallback = <our function>
拍摄将保存在应用程序根目录中的屏幕截图

此外,如果定义
fname
,则可以为屏幕截图定义自定义路径和文件名

window.top.callPhantom({type: 'render', fname: '/tmp/myscreen.png'});

全部打包以便于使用 我已经创建了一个方便的函数,可以在测试中使用。onCallback函数被减少到所需的最小值,通过这种方式,所有逻辑都在我的测试环境中进行管理:

karma.conf.js 帮手
信用
我从中获得了这个脚本,对其进行了改编,并自己找到了将其放置在何处,以使其与karma一起工作。

我为一个定制的phantomjs创建的karma条目,用于拍摄快照,如下所示:

module.exports=函数(配置){
config.set({
..
浏览器:['PhantomJSCustom'],
自定义启动器:{
“幻影自定义”:{
base:'PhantomJS',
选项:{
onCallback:函数(数据){
如果(data.type==“渲染”){
//这个函数不属于karma.conf.js的范围,因此我们必须在其中定义任何全局变量
如果(window.renderId==未定义){window.renderId=0;}
render(data.fname | |(“屏幕截图”+(window.renderId++)+.png”);
}
}
}
}
},
幻影发射器:{
//如果遇到资源错误,让phantomjs退出(如果因果报应退出而不杀死//phantomjs很有用)
exitOnResourceError:true
},
..

})
很棒的东西!我很好奇,你在哪里找到一个好地方来添加常见的助手函数?使用karma和qunit,我们在加载所有此类助手的测试之前加载了一些文件。
PhantomJSCustom: {
    base: 'PhantomJS',
    options: {
        onCallback: function(data){
            if (data.type === 'render' && data.fname !== undefined) {
                page.render(data.fname);
            }
        }
    }
}
// With this function you can take screenshots in PhantomJS!
// by default, screenshots will be saved in .tmp/screenshots/ folder with a progressive name (n.png)
var renderId = 0;
function takeScreenshot(file) {
    // check if we are in PhantomJS
    if (window.top.callPhantom === undefined) return;

    var options = {type: 'render'};
    // if the file argument is defined, we'll save the file in the path defined eg: `fname: '/tmp/myscreen.png'
    // otherwise we'll save it in the default directory with a progressive name
    options.fname = file || '.tmp/screenshots/' + (renderId++) + '.png';

    // this calls the onCallback function of PhantomJS, the type: 'render' will trigger the screenshot script
    window.top.callPhantom(options);
}