// modules var system = require('system'),
page = require('webpage').create(), helper = require('./_helper.js')(system.args[2]);
// command line arguments var url = system.args,
dimensions = helper.dimensions, image_name = system.args[3], selector = system.args[4], globalBeforeCaptureJS = system.args[5], pathBeforeCaptureJS = system.args[6], dimensionsProcessed = 0, currentDimensions;
globalBeforeCaptureJS = globalBeforeCaptureJS === 'false' ? false : globalBeforeCaptureJS; pathBeforeCaptureJS = pathBeforeCaptureJS === 'false' ? false : pathBeforeCaptureJS;
var current_requests = 0; var last_request_timeout; var final_timeout;
var setupJavaScriptRan = false;
var waitTime = 300,
maxWait = 5000, beenLoadingFor = 0;
if (helper.takingMultipleScreenshots(dimensions)) {
currentDimensions = dimensions[0]; image_name = helper.replaceImageNameWithDimensions(image_name, currentDimensions);
} else {
currentDimensions = dimensions;
}
page.settings = { loadImages: true, javascriptEnabled: true}; page.settings.userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.17';
page.onError = function(msg, trace) {
// suppress JS errors from Wraith output // http://stackoverflow.com/a/19538646
};
page.onResourceRequested = function(req) {
current_requests += 1;
};
page.onResourceReceived = function(res) {
if (res.stage === 'end') { current_requests -= 1; }
};
console.log('Loading ' + url + ' at dimensions: ' + currentDimensions.viewportWidth + 'x' + currentDimensions.viewportHeight); page.viewportSize = { width: currentDimensions.viewportWidth, height: currentDimensions.viewportHeight};
page.open(url, function(status) {
if (status !== 'success') { console.log('Error with page ' + url); phantom.exit(); } setTimeout(checkStatusOfAssets, waitTime);
});
function checkStatusOfAssets() {
if (current_requests >= 1) { if (beenLoadingFor > maxWait) { // sometimes not all assets will download in an acceptable time - continue anyway. markPageAsLoaded(); } else { beenLoadingFor += waitTime; setTimeout(checkStatusOfAssets, waitTime); } } else { markPageAsLoaded(); }
}
function markPageAsLoaded() {
if (!setupJavaScriptRan) { runSetupJavaScriptThen(captureImage); } else { captureImage(); }
}
function runSetupJavaScriptThen(callback) {
setupJavaScriptRan = true; if (globalBeforeCaptureJS && pathBeforeCaptureJS) { require(globalBeforeCaptureJS)(page, function thenExecuteOtherBeforeCaptureFile() { require(pathBeforeCaptureJS)(page, callback); }); } else if (globalBeforeCaptureJS) { require(globalBeforeCaptureJS)(page, callback); } else if (pathBeforeCaptureJS) { require(pathBeforeCaptureJS)(page, callback); } else { callback(); }
}
function captureImage() {
takeScreenshot(); dimensionsProcessed++; if (helper.takingMultipleScreenshots(dimensions) && dimensionsProcessed < dimensions.length) { currentDimensions = dimensions[dimensionsProcessed]; image_name = helper.replaceImageNameWithDimensions(image_name, currentDimensions); setTimeout(resizeAndCaptureImage, waitTime); } else { exit_phantom(); }
}
function resizeAndCaptureImage() {
console.log('Resizing ' + url + ' to: ' + currentDimensions.viewportWidth + 'x' + currentDimensions.viewportHeight); page.viewportSize = { width: currentDimensions.viewportWidth, height: currentDimensions.viewportHeight}; setTimeout(captureImage, 5000); // give page time to re-render properly
}
function takeScreenshot() {
console.log('Snapping ' + url + ' at: ' + currentDimensions.viewportWidth + 'x' + currentDimensions.viewportHeight); page.clipRect = { top: 0, left: 0, height: currentDimensions.viewportHeight, width: currentDimensions.viewportWidth }; page.render(image_name);
}
function exit_phantom() {
// prevent CI from failing from 'Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL' errors. See https://github.com/n1k0/casperjs/issues/1068 setTimeout(function(){ phantom.exit(); }, 30);
}