尝试使用 CasperJS 抓取网页。网页检查浏览器是否为 IE 6/7。
使用 casperjs 传递 userAgent 似乎不满足其条件。 UserAgent 通过:Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.1) 以下是页面进行的检查以确定浏览器
agt = navigator.userAgent.toLowerCase();
browserType = navigator.appName;
if( ((browserType.indexOf("xplorer") != -1)
&& (agt.indexOf("msie 6.") != -1))
|| ((browserType.indexOf("xplorer") != -1)
&& (agt.indexOf("msie 7.") != -1)) )
{
}
else
{
alert("This "+ browserType + " Version is not supported by this application. Please use Internet Explorer 6.x or Internet Explorer 7.x.");
window.close();
}
以下是来自 casperjs 的调试信息。
[info] [remote] [alert] This Netscape Version is not supported by this applicat on. Please use Internet Explorer 6.x or Internet Explorer 7.x.
[warning] [phantom] Loading resource failed with status=fail (HTTP 200): http://
在页面重定向之前设置 window.navigator
对象有什么指示吗?
最佳答案
navigator
属性是只读的,因此您无法设置它们,并且 PhantomJS 不提供设置它的功能。
解决方案是创建 navigator
对象的代理。旧的 navigator
保留在后台,但它被行为相同的新导航器所取代,但 appName
为“Internet Explorer”。整个引导过程可以从 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);
});
});
对于带有 page.onInitialized
事件处理程序的普通 PhantomJS 来说也是如此。
解决浏览器检测问题并不能保证页面在 PhantomJS 上正常工作或看起来良好。有些页面针对 IE 进行“优化”是有原因的,原因是大多数时候使用了其他浏览器中没有的某些专有功能。
关于javascript - CasperJS 无法设置 window.navigator 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27523682/