我尝试使用以下代码将window.performance对象从网页返回到casper的范围,但我得到了null。有人可以解释原因吗?
performance = casper.evaluate ->
return window.performance
@echo performance
答案 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));