// PhantomJS Cheatsheet

$ brew update && brew install phantomjs  // install PhantomJS with brew

phantom.exit();

var page = require('webpage').create();

page.open('http://example.com', function() {});
page.evaluate(function() { return document.title; });
page.render('example.png');

page.onConsoleMessage = function(msg) { console.log(msg); };
\!h page.onResourceRequested = function(request) { console.log('Request ' + JSON.stringify(request, undefined, 4)); };
page.onResourceReceived = function(response) {  console.log('Receive ' + JSON.stringify(response, undefined, 4)); };
page.onError = function(msg, trace) { console.log(msg); ... }

page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {} );


// CasperJS Module Cheatsheet

$ brew install casperjs --devel  // install CasperJS with brew

var casper = require('casper').create({
  clientScripts: [
    'includes/jquery.js',
    'includes/underscore.js'
  ],
  exitOnError: true,
  httpStatusHandlers: { },
  logLevel: "error",
  onAlert: null,
  onDie: null,
  onError: null,
  onLoadError: null,
  onPageInitialized: null,
  onResourceReceived: null,
  onResourceRequested: null,
  onStepComplete: null,
  onStepTimeout: null,
  onTimeout: null,
  onWaitTimeout: null,
  page: null,
  pageSettings: {
    javascriptEnabled: true,
    loadImages: false,
    loadPlugins: false,
    localToRemoteUrlAccessEnabled: false,
    userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5)",
    userName: null,
    password: null,
    XSSAuditingEnabled: false,
  },
  remoteScripts: [ ],
  safeLogs: [ ],
  stepTimeout: null,
  timeout: null,
  verbose: true,
  viewportSize: null,
  retryTimeout: 100,
  waitTimeout: 5000,
});

casper.options.waitTimeout = 1000;  // alter an option at runtime

casper.cli.args
casper.cli.options
casper.cli.has(); casper.cli.get(); casper.cli.drop();

casper.back(), 
casper.exit([int status]);
caper.forward();
casper.run(fn onComplete[, int time]);
casper.start(String url[, Function then]);
casper.then(Function then);
casper.thenBypass(Number nb);
casper.thenBypassIf(Mixed condition, Number nb);
casper.thenBypassUnless(Mixed condition, Number nb);
casper.thenClick(String selector[, Function then]);
casper.thenEvaluate(Function fn[, arg1[, arg2[, ...]]]);
casper.thenOpen(String location[, mixed options]);
casper.thenOpenAndEvaluate(String location[, Function then[, arg1[, arg2[, ...]]]);

casper.base64encode(String url[, String method, Object data]);
casper.bypass(Numbr nb);

casper.click(String selector);
casper.clickLabel(String label[, String tag]);

casper.capture(String targetFilepath, Object clipRect);
casper.captureBase64(String format[, Mixed area]);
casper.captureSelector(String targetFile, String selector);

casper.clear();  // clears the current page execution environment context
casper.debugHTML([String selector, Boolean outer]);
casper.debugPage();
casper.die(String message[, int status]);

casper.download(String url, String target[, String method, Object data]);

casper.each(Array array, Function fn);
casper.eachThen(String message[, String style]);

casper.echo(String message[, String style]);
casper.evaluate(Function fn[, arg1[, arg2[, …]]]);
casper.evaluateOrDie(Function fn[, String message]);
casper.exists(String selector);
casper.fetchText(String selector);

casper.log(String message[, String level, String space]);

casper.fill(String selector, Object values[, Boolean submit]);  // fields are referenced by name attribute
casper.fillSelectors(String selector, Object values[, Boolean submit]);  // fields are referenced by css3 selectors
casper.fillXPath(String selector, Object values[, Boolean submit]);  // fields are referenced by XPath selectors

casper.getCurrentUrl();
casper.getElement(s)Attribute(String selector, String attribute);
casper.getElement(s)Bounds(String selector);
casper.getElement(s)Info(String selector);
casper.getFormValues(String selector);
casper.getGlobal(String name);
casper.getHTML([String selector, Boolean outer]);
casper.getPageContent();
casper.getTitle();

casper.mouseEvent(String type, String selector);  // mouseup, mousedown, click, mousemove, mouseover, mouseout

casper.open(String location, Object Settings);  // settings: method, data, headers
casper.reload([Function then];
casper.repeat(int times, Function then);
casper.resourceExists(Mixed test);
casper.sendKeys(Selector selector, String keys[, Object options]);  // options: keepFocus, modifiers
casper.setHttpAuth(String username, String password);
casper.status(Boolean asString);

casper.toString();
casper.userAgent(String agent);
casper.viewport(Number width, Number height[, Function then]);
casper.visible(String selector);

casper.unwait();
casper.wait(Number timeout[, Function then]);
casper.waitFor(Function testFx[, Function then, Function onTimeout, Number timeout]);
casper.waitForPopup(String|RegExp urlPattern[, Function then, Function onTimeout, Number timeout]);
casper.waitForResource(Function testFx[, Function then, Function onTimeout, Number timeout]);
casper.waitForUrl(String|RegExp url[, Function then, Function onTimeout, Number timeout]);
casper.waitForSelector(String selector[, Function then, Function onTimeout, Number timeout]);
casper.waitWhileSelector(String selector[, Function then, Function onTimeout, Number timeout]);
casper.waitForSelectorTextChange(String selectors[, Function then, Function onTimeout, Number timeout]);
casper.waitForText(String text[, Function then, Function onTimeout, Number timeout]);
casper.waitUntilVisible(String selector[, Function then, Function onTimeout, Number timeout]);
casper.waitWhileVisible(String selector[, Function then, Function onTimeout, Number timeout]);
casper.warn(String message);
casper.withFrame(String|Number frameInfo, Function then);
casper.withPopup(Mixed popupInfo, Function then);
casper.zoom(Number factor);

casper.on(String event, Function then);
casper.emit(String event);

// Events referenced: back, capture.saved, click, complete.error, die, downloaded.file, error, exit, fill, forward,
// http.auth, http.status.[code], load.started, load.failed, load.finished, log, mouse.click, mouse.down, mouse.move,
// mouse.up, navigation.requested, open, page.created, page.error, page.initialized, page.resource.received, page.resource.requested,
// popup.created, popup.loaded, popup.close, popup.created, remote.alert, remote.callback, remote.message, resource.received, resource.requested,
// run.complete, run.start, starting, started, step.added, step.complete, step.created, step.error, step.start, step.timeout, timeout, url.changed,
// viewport.changed, wait.done, wait.start, waitFor.timeout

casper.setFilter(String event, Function then);

// Filters referenced: capture.target_filename, echo.message, log.message, open.location, page.confirm, page.prompt


// CasperJS Utils Module Cheatsheet

var utils = require('utils');

utils.betterTypeOf(input);
utils.dump(value);
utils.fileExt(file);
utils.fillBlanks(text, pad);
utils.format(f);
utils.getPropertyPath(Object obj, String path);
utils.inherits(ctor, superCtor);

utils.isArray(value);
utils.isCasperObject(value);
utils.isClipRect(value);
utils.isFalsy(subject);
utils.isFunction(value);
utils.isJsFile(file);
utils.isNull(value);
utils.isNumber(value);
utils.isObject(value);
utils.isString(value);
utils.isTruthy(subject);
utils.isType(what, type);
utils.isUndefined(value);
utils.isWebPage(what);
utils.mergeObjects(origin, add);
utils.node(name, attributes);
utils.serialize(value);
utils.unique(array);


// Spooky Cheatsheet (Spooky is used to control CasperJS from the Node environment)

var spooky = new Spooky({
  child: {
    'transport': "http",
    'proxy': '192.128.101.42:9001',  // when you want to switch a proxy (kind of thing I like with Spooky)
    'proxy-auth': 'username:password'
  },
  casper: {
    logLevel: "debug",  // can also be set to "info", "warning" or "error"
    verbose: false
    pageSettings: {
      userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36'
    }
  }
}, function() {
  // The magic begins here.
})

// Passing values between spooky environment (NodeJS) to CasperJS.
spooky.then([{ x: x }, function () { console.log('x:', x); }]); // function tuples
spooky.thenEvaluate(function (x) { console.log('x:', x); }, { x: x }); // argument hashes