blob: a0394e8345a51144ade61e4225d1210cd95b538e [file] [log] [blame]
// This script assumes the following:
// 1. You've installed wd with `npm install wd'.
// 2. You've set the environment variables $SAUCE_USERNAME and $SAUCE_ACCESS_KEY.
// 3. If the environment variable $CIRCLE_ARTIFACTS is not set imanges will be saved in /tmp
//
// The intention of this script is that it will be ran from CircleCI
//
// Example usage:
// node screenshots.js http://localhost:9292/test/visual.html
// node screenshots.js http://google.com
var wd = require('wd');
var username = process.env['SAUCE_USERNAME'];
var accessKey = process.env['SAUCE_ACCESS_KEY'];
var dir = process.env['CIRCLE_ARTIFACTS'] || '/tmp';
var url = process.argv[2];
var browserVersions = [
{
'browserName': 'Internet Explorer',
'platform': 'Windows XP'
},
{
'browserName': 'firefox',
'platform': 'OS X 10.11'
},
{
'browserName': 'safari'
//'platform': 'OS X 10.10'
},
{
'browserName': 'chrome',
'platform': 'OS X 10.11'
}
];
browserVersions.forEach(function(cfg) {
var browserDriver = wd.remote('ondemand.saucelabs.com', 80, username, accessKey);
// The following is in the style of
// https://github.com/admc/wd/blob/62f2b0060d36a402de5634477b26a5ed4c051967/examples/async/chrome.js#L25-L40
browserDriver.init(cfg, function(err, _, cap) {
if (err) console.log(err);
browserDriver.get(url, function(err) {
if (err) console.log(err);
browserDriver.safeExecute('document.documentElement.scrollHeight', function(err,scrollHeight) {
if (err) console.log(err);
browserDriver.safeExecute('document.documentElement.clientHeight', function(err,windowHeight) {
if (err) console.log(err);
var position = 0;
// loop generates the image(s). Firefox and Internet Explorer will take
// a screenshot of the entire webpage, but Opera, Safari, and Chrome
// do not. For those browsers we scroll through the page and take
// incremental screenshots.
(function loop() {
var browser = cfg.browserName.replace(/\s/g, '_')+(!!cap ? '_'+cap.version : '');
var platform = (cap ? cap : cfg).platform.replace(/\s/g, '_');
var shot = (position/windowHeight) + 1;
if (cfg.browserName == 'firefox' || cfg.browserName == 'Internet Explorer') {
// saves file in the file `dir/browser_version_platform.png`
var filename = dir+'/'+browser+'_'+platform+'.png';
browserDriver.saveScreenshot(filename, function(err) {
if (err) console.log(err);
browserDriver.quit();
});
} else {
// Use `window.scrollTo` because thats what jQuery does
// https://github.com/jquery/jquery/blob/1.12.3/src/offset.js#L186
browserDriver.safeEval('window.scrollTo(0,'+position+');', function(err) {
if (err) console.log(JSON.stringify(err));
// saves file in the file `dir/browser_version_platform_#.png`
var filename = dir+'/'+browser+'_'+platform+'_'+shot+'.png';
browserDriver.saveScreenshot(filename, function(err) {
if (err) console.log(err);
position += windowHeight;
if (position >= scrollHeight) {
browserDriver.quit();
} else {
loop();
}
});
});
}
})();
});
});
});
});
});