2016-07-08 2 views
18

Je voudrais simuler la propriété de la plate-forme Navigator de CasperJS (/ PhantomJS). J'ai trouvé les solutions faciles d'écraser l'objet Navigator à la charge de la page qui est proposée dans beaucoup d'autres endroits sur le web:Faux propriétés du navigateur

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); 
    }); 
}); 

Mais le problème est que si nous obtenons les propriétés du navigateur d'un Iframe, les valeurs sont encore celui d'origine car, la page.initialized ne le définit que pour la page principale. J'ai donc décidé de le changer dans son code source et de le reconstruire. J'ai téléchargé Phantomjs à partir du repo git, et j'ai cherché une valeur de plate-forme codée en dur (Linux x86_64 pour mon cas). J'ai trouvé la chaîne codée en dur dans ./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp

Je l'ai changé en la chaîne que je voulais être retourné en tant que navigator.platform, mais cela n'affectait pas le navigator.platform. Où devrais-je le changer? Est-ce (plateforme) une chaîne codée ou est-elle créée dynamiquement?

+0

Je suggère de changer casperjs ou remplacer certaines méthodes au lieu de construire une version propre de PhantomJS. Vous avez peut-être plus de chance de poser votre question dans leur groupe Google https://groups.google.com/forum/#!forum/casperjs – CSchulz

+0

Merci pour votre commentaire. Je l'ai fait. – Alex

+0

Peut-être que vous pouvez poster votre solution comme réponse. – CSchulz

Répondre

3

Après avoir examiné le code, j'ai trouvé que le fichier suivant doit être modifié:

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

et NavigatorBase::platform() doit être réglé sur la chaîne désirée que vous souhaitez être retourné comme navigator.platform. Mais je ne suis pas sûr si cela va gâcher d'autres choses, s'il vous plaît donner des suggestions si ce n'est pas une solution appropriée.