如何将window.performance对象返回到CasperJS范围

时间:2015-07-01 14:59:59

标签: coffeescript phantomjs casperjs

我尝试使用以下代码将window.performance对象从网页返回到casper的范围,但我得到了null。有人可以解释原因吗?

    performance = casper.evaluate ->
        return window.performance
    @echo performance

1 个答案:

答案 0 :(得分:0)

PhantomJS 1.x未实现window.performance,因此您无法使用它。

PhantomJS 2.0.0实现了它,但它没有实现window.performance.toJSON()功能。 PhantomJS的问题在于您必须通过evaluate()访问此信息,但它有以下限制:

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等将工作!

您必须在页面上下文中找到自己的序列化方法并将其传递到外部(JavaScript):

var performance = casper.evaluate(function(){
    var t = window.performance.timing;
    var n = window.performance.navigation;
    return {
        timing: {
            connectStart: t.connectStart,
            connectEnd: t.connectEnd,
            ...
        },
        navigation: {
            type: n.type,
            redirectCount: n.redirectCount
        },
        ...
    };
});

或寻找生成可序列化对象(from here)的深层复制算法:

var perf = casper.evaluate(function(){
    function cloneObject(obj) {
        var clone = {};
        for(var i in obj) {
            if(typeof(obj[i])=="object" && obj[i] != null)
                clone[i] = cloneObject(obj[i]);
            else
                clone[i] = obj[i];
        }
        return clone;
    }
    return cloneObject(window.performance);
});
console.log(JSON.stringify(perf, undefined, 4));