var phantom = require('phantom'), vows = require('vows'), assert = require('assert'); // nesting tests inside phantom callback so we only // have to create it once phantom.create(function(ph) { var get_page_result = function(url, fn, result) { ph.createPage(function(page) { page.open(url, function(status) { if (status != 'success') result(new Error('Could not connect'), null) else { page.evaluate(fn, function(r) { result(null, r) ph.exit() }) } }) }) } vows.describe('Correct UI state').addBatch({ 'pending requests': { topic: function() { get_page_result('http://localhost:8081/something', function() { return document.querySelectorAll('#something .item') }, this.callback) }, 'is there': function(err, result) { assert.isNull(err) assert.isNotNull(result) } } }).run({}, function() { // kill the phantom object after tests run ph.exit() }) })