phantomstream

Streaming interface to the PhantomJS headless browser

phantomstream

Write and automate PhantomJS scripts inside node, using a standard Stream interface.

Getting Started

First off, install the phantomstream module.

npm install phantomstream

Next, create a simple script named "myscript.js".

phantomstream = require("../phantomstream")
 
// Open up a PhantomJS stream that listens for commands that look like 
// "TITLE <url>". Browse to the URL and write the title back via the stream. 
var conf = {logger: console}
var ps = phantomstream.open(conf, function(nodestreamphantomrequireglobal) {
 
  // This callback executes inside of PhantomJS, not node.  To see the API 
  // available to you in PhantomJS, check out their documentation: 
  // http://code.google.com/p/phantomjs/wiki/Interface 
  var page = require("webpage").create()
 
  // Listen for the "TITLE <url>" commands via the streaming interface. 
  nodestream.on("data", function(data) {
    var matches = /TITLE\s*(.+)/.exec(data)
    if (matches) {
      var url = matches[1]
 
      // Got a TITLE command, use the PhantomJS page object to browse 
      // to that page, get the document title, and write it back to the stream. 
      console.info("opening", url)
      page.open(url, function() {
        var title = page.evaluate(function() {
          return document.title
        })
        console.info("sending title =", title)
        nodestream.write(title)
      })
    }
  })
 
})
 
// Send an TITLE command to our PhantomJS process and echo the response. 
ps.write("TITLE http://www.google.com")
ps.on("data", function(data) {
  console.info("node received:", data.toString())
  process.exit()
})

Run your script with node.

node myscript.js

...you should see output like this:

[phantom-stdout] opening http://www.google.com
[phantom-stdout] sending title = Google
node received: Google

Enjoy! For more ideas on what is possible inside the callback for phantomstream.open(), read the PhantomJS documentation.

Don't forget try out some demos from the examples/ directory :)

Alternatives

If you are looking for higher-level implementations that wrap the PhantomJS API, check these out: