Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

phantomjs page.evaluate not logging onto console

Tags:

phantomjs

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.logs in the evaluate's callback:

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