Mr Cold
Mr Cold

Reputation: 1573

Cannot put phantom.exit() inside page.evaluate() in phantomjs

I have 2 code samples as following:

var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
  console.log(s);
  page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
    var t = page.evaluate(function() {
      console.log('here');
       phantom.exit();     // case 1: inside page.evaluate()
    });

  });
});

-> In this case, phantom.exit() is put inside page.evaluate(), and error appears: "ReferenceError: Can't find variable: phantom"

var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
  console.log(s);
  page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
    var t = page.evaluate(function() {
      console.log('here');
    });
    phantom.exit();            // case 2: outside page.evaluate()
  });
});

-> In case 2: phantom.exit() is put outside page.evaluate(). There is no error, but 'here' is not printed out.

=> Neither of 2 above ways can print out 'here'. Is there any effective way to print 'here' without error?

Upvotes: 1

Views: 2157

Answers (2)

Sayed Hussain Mehdi
Sayed Hussain Mehdi

Reputation: 151

Try returning required data back and do console.log() after evaluation

Example

var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
console.log(s);
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
var t = page.evaluate(function() {
  return "here";
});
console.log(t);
phantom.exit();            // case 2: outside page.evaluate()
  });
});

Upvotes: -1

ssube
ssube

Reputation: 48257

You can't use any of the phantom method inside of the page, in the same way the page itself can't use them.

The phantom object is a special host object provided by the runtime to the script it initially launches. Once a page has been loaded, the page runs in its own context with the usual browser variables, which do not include phantom.

You need to wait for the page.evaluate to call back to the phantom script, then call exit from there. The Phantom docs show this exact case, with exit being called after evaluate has returned. They don't seem to cover whether evaluate is blocking or not, but the example suggests that it may be.

To capture the log messages from the page, you need to subscribe to its onConsoleMessage event. The Phantom console only picks up messages from the script it is running, not any pages that it may load. All you need to do is route page messages to the phantom console:

page.onConsoleMessage = function(msg) {
  console.log('PAGE: ' + msg);
};

Upvotes: 4

Related Questions