phantomjs page.evaluate not logging onto console

前端 未结 5 598
梦如初夏
梦如初夏 2020-12-29 20:54

I am a PhantomJs newbie. Just checked a similar post on this site. My question is why \'foo\' is not logged to console or printed?

var page = require(\'webpa         


        
相关标签:
5条回答
  • 2020-12-29 21:01

    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

    0 讨论(0)
  • 2020-12-29 21:20

    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");
    });
    
    0 讨论(0)
  • 2020-12-29 21:22

    I'm using phantomjs to automate some Google Closure tests and ran into an issue I needed to debug. I was able to dispatch custom events from my test page and receive them inside page.evaluate.

    File to log messages:

    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 file. Here I'm using a saveMessage method to store the string, but you can make that something more appropriate to your needs.

    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 讨论(0)
  • 2020-12-29 21:22

    Make sure your phantomjs setting does not disable executing javascript

    page.settings.javascriptEnabled = true;
    
    0 讨论(0)
  • 2020-12-29 21:25

    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.

    0 讨论(0)
提交回复
热议问题