2013-09-16 10 views
5

Ich bin neu in Javascript und PhantomJS, aber mein scheinbar einfaches Ziel hat sich als schwieriger als erwartet erwiesen. Ich möchte ein Skript schreiben, das eine Website lädt und dann den Wert einer Javascript-Variablen ausgibt, die auf dieser Seite verwendet wird. Wenn ich diese Seite in einem Browser öffne und die Javascript-Konsole öffne, kann ich den Variablennamen eingeben und er teilt mir den Wert mit, der dieser Variable zugeordnet ist. Ich versuche nur diese Funktion zu reproduzieren, aber mit PhantomJS, damit ich diese Aufgabe automatisieren kann.JavaScript-Variable von Website mit PhantomJS lesen

Könnte mir jemand auf die richtige Dokumentation dafür hinweisen? Ich habe nicht herausgefunden, wie man so etwas macht, vorausgesetzt, PhantomJS ist der richtige Weg, dies zu tun. Vielleicht gibt es eine einfachere Alternative?

Danke.

+1

Einer der folgenden Punkte könnte Ihnen helfen: https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage#wiki-webpage-evaluate oder https://github.com/ariya/phantomjs/wiki/API-Referenz-WebPage # onconsolemessage –

Antwort

15

Was Sie verstehen müssen, ist, dass phantomJS zwei JavaScript-Umgebungen hat und diese beiden unabhängig voneinander sind. Der innere ist das Dokumentenskript (das Sie in jedem Browser haben). Der äußere steuert, was phantomJS tun soll. Es simuliert den Benutzer.

In gewisser Weise müssen Sie sagen phantomJS "der Benutzer öffnete die JavaScript-Konsole alle typisierten ...". Die evaluate command tut dies.

so dass der Wert der Variablen foo zu lesen, schreiben Sie diesen Code:

var foo = page.evaluate(function() { 
    return document.foo; 
}); 

Hinweis: Die document nicht unbedingt erforderlich ist, aber es hilft, die beiden Umgebungen auseinander in den Kopf des Entwicklers zu halten .

+0

Ich konnte das zum Laufen bringen, ich hatte keine Ahnung, dass man die globalen Variablen auf "der anderen Seite" bewerten könnte, wie toll! Diese ganze Zeit habe ich die Informationen auf Tabellen auf dem Bildschirm ausgedruckt und dann die Tabellen physisch ausgewertet, um die Informationen zu erhalten, das ist so viel effizienter! –

3

Aarons Antwort funktionierte nicht für mich. Vielleicht war es schon 2013 gültig, aber jetzt (2016) funktioniert es mit der aktuellen Version nicht mehr. In Aarons Beispiel gibt foo ein Versprechen zurück, keinen Wert. console.log(foo) Ausgänge .

Hier ist, was ich herausgefunden:

page 
    .evaluate(function(){ return window.foo }) 
    .then (function(foo){ console.log "foo = ", foo}); 

nun wirklich Sie den Wert von foo erhalten.