Ale*_*lex 19 javascript overwrite navigator phantomjs casperjs
我想假冒CasperJS(/ PhantomJS)的Navigator平台属性.我找到了在页面加载时覆盖Navigator对象的简单解决方案,这在Web上的许多其他地方都是建议的:
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);
});
});
Run Code Online (Sandbox Code Playgroud)
但问题是,如果我们从Iframe获取Navigator属性,则值仍然是原始值,因为page.initialized仅将其设置为主页面.所以我选择在源代码中更改它并再次构建它.我从git repo下载了Phantomjs,我搜索了一个硬编码的平台值(对于我的情况,Linux x86_64).我找到了硬编码的字符串./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp
我把它改成了我想要作为navigator.platform返回的字符串,但它没有影响navigator.platform.我应该在哪里改变它?它(平台)是一个带编码的字符串还是动态创建的?
查看代码后,我发现应该更改以下文件:
src/qt/qtwebkit/Source/WebCore/page/NavigatorBase.cpp
Run Code Online (Sandbox Code Playgroud)
并 NavigatorBase::platform()应设置为您希望作为 navigator.platform 返回的所需字符串。但我不确定它是否会搞乱其他事情,如果不是合适的解决方案,请给出建议。
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |