I would like to use phantomjs in my node.js script. there is a phantomjs-node library.. but unfortunately the author used this weird coffee script code to explain what he's doing:
phantom = require 'phantom'
phantom.create (ph) ->
ph.createPage (page) ->
page.open http://www.google.com, (status) ->
console.log opened google? , status
page.evaluate (-> document.title), (result) ->
console.log 'Page title is ' + result
ph.exit()
now if I were to use phantomjs directly with javascript, it would look something like this:
var page = require('webpage').create();
page.open(url, function (status) {
var title = page.evaluate(function () {
return document.title;
});
console.log('Page title is ' + title);
});
so basically I'm trying to write up the equivalent of the first snippet of code above in normal javascript (by reading the coffee script documentation.. this is what I did:
// file name: phantomTest.js
var phantom = require('phantom');
phantom.create(function(ph) {
ph.createPage(function(page) {
page.open('http://www.google.com', function(status) {
console.log('opened google?', status);
var title = page.evaluate(function() {
return document.title;
});
console.log('page title is ' + title);
});
});
ph.exit();
});
unfortunately it's not working! If I run
node phantomTest.js
on the shell, nothing happens.. nothing returns and the process doesn't stop.. any ideas?
update:
I just read this in the phantomjs faq:
Q: Why is PhantomJS not written as Node.js module?
A: The short answer: No one can serve two masters.
A longer explanation is as follows.
As of now, it is technically very challenging to do so.
Every Node.js module is essentially a slave to the core of Node.js,
i.e. the master. In its current state, PhantomJS (and its included
WebKit) needs to have the full control (in a synchronous matter) over
everything: event loop, network stack, and JavaScript execution.
If the intention is just about using PhantomJS right from a script
running within Node.js, such a loose binding can be achieved by
launching a PhantomJS process and interact with it.
mmm.. could this have something to do with it? but then that whole library wouldn't make sense!
update 2:
I found this code in the web that does the same thing:
var phantom = require('phantom');
phantom.create(function(ph) {
return ph.createPage(function(page) {
return page.open(http://www.google.com, function(status) {
console.log(opened google? , status);
return page.evaluate((function() {
return document.title;
}), function(result) {
console.log('Page title is ' + result);
return ph.exit();
});
});
});
});
unfortunately that's not working either.. same result!