2016-07-08 31 views
18

Vorrei simulare la proprietà della piattaforma Navigator di CasperJS (/ PhantomJS). Ho trovato le soluzioni facili di sovrascrivere l'oggetto del navigatore al caricamento della pagina che viene suggerito in molti altri luoghi sul web:Proprietà del navigatore falso

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

Ma il problema è che se otteniamo le proprietà Navigator da un Iframe, i valori sono ancora quello originale perché, il page.initialized lo ha impostato solo per la pagina principale. Così ho deciso di cambiarlo nel suo codice sorgente e ricostruirlo. Ho scaricato Phantomjs dal repository git e ho cercato un valore di piattaforma hardcoded (Linux x86_64 per il mio caso). Ho trovato la stringa codificata in ./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp

Ho cambiato la stringa che volevo essere restituita come navigator.platform, ma non ha influenzato il navigator.platform. Dove dovrei cambiarlo? È (piattaforma) una stringa harcoded o viene creata dinamicamente?

+0

Vorrei suggerire di modificare casperjs o sovrascrivere alcuni metodi invece di creare una propria versione di PhantomJS. Forse hai più fortuna nel porre la tua domanda nel loro Gruppo Google https://groups.google.com/forum/#!forum/casperjs – CSchulz

+0

Grazie per il tuo commento. L'ho fatto. – Alex

+0

Forse puoi pubblicare la tua soluzione come risposta. – CSchulz

risposta

3

Dopo aver esaminato il codice, ho scoperto che il seguente file deve essere cambiato:

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

e NavigatorBase::platform() dovrebbe essere impostata la stringa desiderata che si desidera essere restituito come il navigator.platform. Ma non sono sicuro che rovinerà altre cose, per favore fornisca suggerimenti se non è una soluzione appropriata.