假导航属性

时间:2016-07-08 01:09:49

标签: javascript phantomjs casperjs overwrite navigator

我想假冒CasperJS(/ PhantomJS)的Navigator平台属性。我找到了在页面加载时覆盖Navigator对象的简单解决方案,这在网络上的许多其他地方都有建议:

    casper.on('page.initialized', function(){
    this.evaluate(function(){
        (function(oldNav){
            var newNav = {};
            [].forEach.call(Object.getOwnPropertyNames(navigator), function(prop){
                 if (prop === 'platform') {
                    Object.defineProperty(newNav, prop, {
                        value: 'Win64'
                    }); }else {
                    Object.defineProperty(newNav, prop, {
                        get: function(){
                            return oldNav[prop];
                        }
                    });
                }
            });
            window.navigator = newNav;
        })(window.navigator);
    });
});

但问题是,如果我们从Iframe获取Navigator属性,则值仍然是原始值,因为page.initialized仅为主页面设置它。 所以我选择在源代码中更改它并再次构建它。我从git repo下载了Phantomjs,我搜索了一个硬编码的平台值(对于我的情况,Linux x86_64)。我在./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp

中找到了硬编码字符串

我把它改成了我希望作为navigator.platform返回的字符串,但它没有影响navigator.platform。我应该在哪里改变它?它(平台)是一个带编码的字符串还是动态创建的?

1 个答案:

答案 0 :(得分:4)

在查看代码后,我发现应该更改以下文件:

src/qt/qtwebkit/Source/WebCore/page/NavigatorBase.cpp

NavigatorBase::platform()应设置为您希望作为navigator.platform返回的所需字符串。 但是我不确定它是否会弄乱其他东西,如果它不是一个合适的解决方案,请提出建议。