phantom-proxy
Version:
a lightweight proxy that lets you to drive phantomjs from node.
141 lines (129 loc) • 5.26 kB
JavaScript
// features/support/world.js
var phantomProxy = require('phantom-proxy'),
colors = require('colors'),
_ = require('underscore'),
Q = require('Q'),
rimraf = require('rimraf');
colors.setTheme({
silly:'rainbow',
input:'grey',
verbose:'cyan',
prompt:'grey',
info:'green',
data:'grey',
help:'cyan',
warn:'yellow',
debug:'cyan',
error:'red'
});
var World = function World(worldCallback) {
var self = this;
self.baseUrl = 'http://localhost:8002/#';
_.extend(self, {
initialize:function (callbackFn) {
//remove images
require("rimraf").sync('./test/features/screen_captures');
phantomProxy.create({}, function (proxy) {
self.proxy = proxy;
// proxy.page.on('alert', function (msg) {
// console.log('alert: %s'.info.bold, msg);
// });
proxy.page.on('callback', function (data) {
console.log(JSON.stringify(data).green.bold);
});
proxy.page.on('closing', function (closingPage) {
console.log('page is closing url is %s'.info.bold, closingPage);
});
proxy.page.on('onConfirm', function (msg) {
console.log('CONFIRM: %s'.info.bold, msg);
return true;
});
proxy.page.on('consoleMessage', function (msg, line, sourceId) {
console.log('%s %s %s'.debug, msg, line, sourceId);
});
proxy.page.on('error', function (msg, trace) {
console.log('%s %s'.error, msg, trace);
});
proxy.page.on('initialized', function () {
console.log('initialized'.info.bold);
});
proxy.page.on('loadFinished', function (status) {
console.log('load finished: %s'.status.bold);
});
proxy.page.on('loadStarted', function () {
console.log('loadStarted'.info.bold);
});
proxy.page.on('navigationRequested', function (url, type, willNavigate, main) {
console.log('navigationRequested %s'.info.bold, url);
});
proxy.page.on('pageCreated', function (newPage) {
console.log('pageCreated %s'.info.bold, newPage);
});
proxy.page.on('prompt', function (msg, defaultVal) {
console.log('PROMPT: %s'.info.bold, msg);
});
proxy.page.on('resourceRequested', function (resource) {
console.log('resource requested: %s'.data, resource.url);
});
proxy.page.on('resourceReceived', function (response) {
console.log('resource received: %s'.data, response.url);
});
proxy.page.on('urlChanged', function (targetUrl) {
console.log('url changed: %s'.info, JSON.stringify(targetUrl));
});
proxy.page.set('viewportSize', { width:320, height:480 }, function (result) {
callbackFn();
});
});
},
render:function (filename, callbackFn) {
var deferred = Q.defer();
self.proxy.page.render(filename, function () {
deferred.resolve(self);
callbackFn.call(self);
});
return deferred.promise;
},
exit:function (callbackFn) {
phantomProxy.end();
},
waitForSelector:function (selector, callbackFn) {
self.proxy.page.waitForSelector(selector, callbackFn);
},
evaluate:function (expression, callbackFn) {
self.proxy.page.evaluate(expression, function (result) {
callbackFn(result);
});
},
saveImage:function (fileName, callbackFn) {
if (typeof fileName === 'function') {
callbackFn = fileName;
fileName = Date.now().toString() + '.png'
}
var deferred = Q.defer();
var path = 'test/features/screen_captures/' + fileName;
self.proxy.page.render(path, function (result) {
deferred.resolve(result);
callbackFn && callbackFn(result);
});
return deferred.promise;
},
enterField:function (selector, fieldValue, callbackFn) {
var deferred = Q.defer();
self.proxy.page.evaluate(function (selector, fieldValue) {
$(selector).val(fieldValue);
return true;
}, function (result) {
deferred.resolve(result);
callbackFn && callbackFn();
}, selector, fieldValue);
return deferred.promise;
},
visit:function (url, callbackFn) {
self.proxy.page.open(self.baseUrl + url, function (result) {
callbackFn.call(self, result);
});
}});
worldCallback.call(this);
};
exports.World = World;