Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
136
rated 0 times [  137] [ 1]  / answers: 1 / hits: 39234  / 11 Years ago, mon, april 1, 2013, 12:00:00

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!


More From » jquery

 Answers
6

phantomjs-node isn't an official supported npm package for phantomjs. Instead, it implements a nauseously clever bridge between node and phantom by creating a web server that uses websockets to serve as an IPC channel between node and phantom. I'm not making this up:




So we communicate with PhantomJS by spinning up an instance of ExpressJS, opening Phantom in a subprocess, and pointing it at a special webpage that turns socket.io messages into alert() calls. Those alert() calls are picked up by Phantom and there you go!




So I wouldn't be surprised if phantomjs-node works, doesn't work, fails silently, or fails spectacularly. Nor would I expect anyone other than the author of phantomjs-node to be able to troubleshoot phantomjs-node.



The answer to your original question is the answer from the phantomjs faq: No. Phantom and node have irreconcilable differences. Both expect to have complete control over fundamental low-level functionality like the event loop, the network stack, and JS execution so they can't cooperate within the same process.


[#79191] Sunday, March 31, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
pranavrorys

Total Points: 466
Total Questions: 87
Total Answers: 115

Location: Barbados
Member since Sun, Nov 27, 2022
2 Years ago
pranavrorys questions
Fri, May 27, 22, 00:00, 2 Years ago
Thu, Oct 28, 21, 00:00, 3 Years ago
Sat, May 30, 20, 00:00, 4 Years ago
Fri, Dec 20, 19, 00:00, 5 Years ago
;