2013-05-22 1 views
27

Ich bin ein PhantomJs Neuling. Habe gerade einen ähnlichen Beitrag auf dieser Seite überprüft. Meine Frage ist, warum 'foo' nicht auf der Konsole geloggt oder gedruckt wird?phantomjs page.evaluate nicht Anmeldung an Konsole

var page = require('webpage').create() 
var foo = 42; 

function evaluate(page, func) { 
    var args = [].slice.call(arguments, 2); 
    var fn = "function() { return (" + func.toString() + ").apply(this, " + JSON.stringify(args) + ");}"; 
    return page.evaluate(fn); 
} 

page.open('http://google.com', function() { 
    var foo = 42; 
    evaluate(page, function(foo) { 
    console.log(foo); 
     },foo); 

}); 

Antwort

48

Der Aufruf page.evaluate() führt Ihren ausgewerteten Code in einer Sandbox aus. Die Konsole der Sandbox ist nicht mit der Konsole von PhantomJS identisch.

Die folgenden Zeilen, die zu Ihrem Skript hinzugefügt wurden, drucken die Konsole Ihrer Seite in stderr.

var page = require('webpage').create() 
var system = require('system'); 
var foo = 42; 

page.onConsoleMessage = function(msg) { 
    system.stderr.writeLine('console: ' + msg); 
}; 

function evaluate(page, func) { 
    var args = [].slice.call(arguments, 2); 
    var fn = "function() { return (" + func.toString() + ").apply(this, " +  JSON.stringify(args) + ");}"; 
    return page.evaluate(fn); 
} 

page.open(
    'http://google.com', 
    function() { 
    var foo = 42; 
    evaluate(
     page, 
     function(foo) { 
     console.log(foo); 
     }, 
     foo 
    ); 

    console.log("Done"); 

    phantom.exit(0); // must exit somewhere in the script 
    } 
); 

Ausgänge:

$ phantomjs /tmp/idiot.js 
console: 42 
Done 

By the way, können Sie rufen page.open mit "about: blank" als URL wenn

var system = require('system'); 

page.onConsoleMessage = function(msg) { 
    system.stderr.writeLine('console: ' + msg); 
}; 

Eine vollständigere Umsetzung wäre Sie möchten nur die Evaluierungsfunktion testen.

+0

ich habe gerade hinzugefügt und nichts ist passiert. es hängt. nicht einmal aussteigen. das bedeutet, dass er nicht weiß, welche Funktion er zuerst erfüllen muss. page.open oder page.onConsoleMessage! und es gibt keine Hauptfunktion! Gibt es einen Debugger? – Raaj

+0

Ich vermisste die wütende Vogel 'foo' Variable hier: ** '}, foo)' **. Vielen Dank. Woher bekomme ich eine Seite? Funktionen? Gibt es irgendwelche Ctags für sie? Echtzeitverschwendung ohne Werkzeuge diese Javascripte.Gibt es etwas was ich von Python importieren kann? wenn nicht, wie importiere ich diese phantomjs javascripts in python außer os.shell. Ich habe Pyphantomjs versucht, aber nicht so überzeugend. – Raaj

+0

habe diese [link] (http://stackoverflow.com/questions/13287490/is-there-a-way-to-use-phantomjs-in-python). sieht gut aus. frage mich, ob es wartet, bis Ajax Werte lädt. Lass es mich versuchen. – Raaj

17

Ausgabe auf Standardfehler nicht für mich arbeiten

eine Arbeit um zuweist:

window.console.log = function(msg) { alert(msg) }; 

innerhalb des page.evaluate

Dann nutzen:

page.onAlert = function(msg) { 
    console.log(msg); 
}; 

zu fangen Sie die Warnung

+0

Arbeitete für mich. +1 –

+0

Arbeitete auch für mich. +1 – timwebdev

0

Ich verwende Phantomjs, um einige Google Closure-Tests zu automatisieren, und stieß auf ein Problem, das ich zum Debuggen benötigte. Ich war in der Lage, benutzerdefinierte Ereignisse von meiner Testseite zu senden und sie innerhalb page.evaluate zu empfangen.

Datei-Nachrichten zu protokollieren:

function logger(msg) { 
    var evt = document.createEvent('CustomEvent'); // MUST be 'CustomEvent' 
    evt.initCustomEvent('logger', false, false, msg); 
    document.dispatchEvent(evt); 
} 

logger('my debug message'); 

PhantomJS Datei. Hier verwende ich eine saveMessage Methode, um die Zeichenkette zu speichern, aber Sie können das etwas passender zu Ihren Notwendigkeiten machen.

var exec = page.evaluate(function() { 
    window.phantomRunner = new window.goog.testing.TestRunner(); 
    window.phantomTest = new window.goog.testing.TestCase(); 

    // Listen for `logger` events. The message is stored inside the event's detail property. 
    document.addEventListener('logger', function(e) { 
    window.phantomTest.saveMessage(e.detail); 
    }); 

    window.phantomTest.autoDiscoverTests(); 
    window.phantomRunner.initialize(window.phantomTest); 
    window.phantomRunner.execute(); 
    return (window.phantomTest.result_.messages); 
}) 
0

Stellen Sie sicher, Ihre PhantomJS Einstellung kein Javascript

Ausführung nicht deaktiviert
page.settings.javascriptEnabled = true; 
8

Es gab einige Probleme in der Vergangenheit mit Konsolenprotokollierung, aber mit der aktuellen Version auf PhantomJS (1.9.8) können Sie tun: Ihre console.log s in den evaluate ‚s Rückruf

page.onConsoleMessage = function (msg) { 
    console.log(msg); 
}; 

dann Feuer weg:

page.evaluate(function() { 
    console.log("some logged message"); 
});