javascript - CasperJS 无法设置 window.navigator 对象

标签 javascript phantomjs casperjs headless-browser

尝试使用 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/

相关文章:

javascript - 通过删除一个参数及其值来清理 URL

javascript - 通过未显式设置的 css 属性查找元素

javascript - 在 CasperJS 中为请求设置 cookie

javascript - 使用 Angular 上传后使用 Node 存储图像

javascript - 使用 *ngFor Angular v5 访问数组

javascript - 当我调整页面大小时,我的菜单和标题移动,我做错了什么?

javascript - PhantomJS 上的阻止请求

python - 在 Selenium 上切换窗口

javascript - 如何使用共享浏览器实例正确拆分 casperjs 测试

javascript - 使用 CasperJS 提交表格内容