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?
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
Vielen Dank für Ihren Kommentar. Ich habe das gemacht. – Alex
Vielleicht können Sie Ihre Lösung als Antwort veröffentlichen. – CSchulz