The navigator
属性是只读的,因此您无法设置它们,并且 PhantomJS 不提供设置它的功能。
解决办法是做一个代理navigator
目的。老人navigator
留在后台,但它被替换为一个行为相同的新的,但带有一个appName
“Internet Explorer”的。整个引导过程可以从page.initialized http://docs.casperjs.org/en/latest/events-filters.html#page-initialized打回来。
casper.on('page.initialized', function(){
this.evaluate(function(){
(function(oldNav){
var newNav = {};
[].forEach.call(Object.getOwnPropertyNames(navigator), function(prop){
if (prop === 'appName') {
Object.defineProperty(newNav, prop, {
enumerable: false,
configurable: false,
writable: false,
value: 'Internet Explorer'
});
} else {
Object.defineProperty(newNav, prop, {
enumerable: false,
configurable: false,
get: function(){
return oldNav[prop];
}
});
}
});
window.navigator = newNav;
})(window.navigator);
});
});
对于普通的 PhantomJS 来说也是如此page.onInitialized
事件处理程序。
解决浏览器检测并不能保证页面在 PhantomJS 上正常工作或看起来良好。有些页面针对 IE 进行“优化”是有原因的,原因是大多数时候使用了其他浏览器中没有的一些专有功能。