The call page.evaluate() runs your evaluated code in a sandbox. The sandbox's console is not the same as PhantomJS's console.
The following lines added to your script will print your page's console to stderr.
var system = require('system');
page.onConsoleMessage = function(msg) {
system.stderr.writeLine('console: ' + msg);
};
A more complete implementation would be:
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
}
);
Outputs:
$ phantomjs /tmp/idiot.js
console: 42
Done
By the way, you can call page.open using "about:blank" as your URL if you just want to sandbox test the evaluate function.
Output to standard error did not work for me
a work around is assigning :
window.console.log = function(msg) { alert(msg) };
inside the page.evaluate
Then use :
page.onAlert = function(msg) {
console.log(msg);
};
to catch the alert
There were some problems in the past with console logging, but with the current version on phantomjs (1.9.8), you can do:
page.onConsoleMessage = function (msg) {
console.log(msg);
};
then fire away your console.log
s in the evaluate
's callback:
page.evaluate(function() {
console.log("some logged message");
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With