2016-07-08 28 views
18

Ich möchte die Plattform-Eigenschaft von CasperJS (/ PhantomJS) faken. Ich fand die einfachen Lösungen des Navigators Objekt bei Laden der Seite zu überschreiben, die in vielen anderen Orten auf dem Netz vorgeschlagen wird:Fake Navigator Eigenschaften

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

Aber das Problem ist, dass, wenn wir die Navigator-Eigenschaften von einem Iframe erhalten, die Werte sind immer noch die ursprüngliche, weil die Seite initialisiert nur für die Hauptseite festgelegt. Also entschied ich mich, es in seinem Quellcode zu ändern und es erneut zu erstellen. Ich habe Phantomjs aus dem Git-Repo heruntergeladen und nach einem fest codierten Plattformwert gesucht (Linux x86_64 für meinen Fall). Ich fand die fest codierte Zeichenfolge in ./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp

Ich änderte es in die Zeichenfolge, die ich als navigator.platform zurückgegeben werden wollte, aber es hat die navigator.platform nicht betroffen. Wo sollte ich es ändern? Ist es (Plattform) eine codierte Zeichenfolge oder wird sie dynamisch erstellt?

+0

Ich würde vorschlagen, casperjs zu ändern oder einige Methoden zu überschreiben, anstatt eine eigene Version von PhantomJS zu erstellen. Vielleicht haben Sie mehr Glück, wenn Sie Ihre Frage in ihrer Google-Gruppe stellen https://groups.google.com/forum/#!forum/casperjs – CSchulz

+0

Vielen Dank für Ihren Kommentar. Ich habe das gemacht. – Alex

+0

Vielleicht können Sie Ihre Lösung als Antwort veröffentlichen. – CSchulz

Antwort

3

Nach dem Code überprüft, fand ich heraus, dass die folgende Datei geändert werden soll:

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

und NavigatorBase::platform() sollen Sie als navigator.platform zurückgegeben werden möchten auf die gewünschte Zeichenfolge eingestellt werden. Aber ich bin mir nicht sicher, ob es andere Dinge vermasselt, bitte geben Sie Vorschläge, wenn es keine angemessene Lösung ist.