CI: Fix screenshots.js to get only browser/OS version from Sauce The browser and OS names reported by Sauce are inconsistent (Chrome on macOS is reported as being on "Mac OS X"; Firefox and Safari on macOS is reported as being on "MAC") and poorly formatted (all-caps or all lowercase). Note that .platformVersion is only reported by some drivers, so it's optional.
diff --git a/script/screenshots.js b/script/screenshots.js index a063287..2b03786 100644 --- a/script/screenshots.js +++ b/script/screenshots.js
@@ -81,25 +81,29 @@ var browserDriver = wd.promiseChainRemote('ondemand.saucelabs.com', 80, username, accessKey); return browserDriver.init(browser.config) .then(function(args) { - var cfg = args[1] || browser.config; - console.log(cfg.browserName, cfg.version, cfg.platform, 'init', args); + var cfg = browser.config, capabilities = args[1]; + var sessionName = [cfg.browserName, capabilities.version, cfg.platform].join(' '); + if (capabilities.platformVersion) sessionName += ' ' + capabilities.platformVersion; + console.log(sessionName, 'init', args); - var pinned = browser.pinned ? 'PINNED' : 'EVERGREEN'; - var filename = [pinned, cfg.platform, cfg.browserName].join('_').replace(/ /g, '_'); + var evergreen = browser.pinned ? '' : '_(evergreen)'; + var fileName = [cfg.browserName, capabilities.version + evergreen, cfg.platform].join('_'); + if (capabilities.platformVersion) fileName += ' ' + capabilities.platformVersion; + fileName = fileName.replace(/ /g, '_'); return browserDriver.get(url) .then(function() { - console.log(cfg.browserName, cfg.version, cfg.platform, 'get'); + console.log(sessionName, 'get'); return [browserDriver.safeExecute('document.documentElement.scrollHeight'), browserDriver.safeExecute('document.documentElement.clientHeight')]; }) .spread(function(scrollHeight, viewportHeight) { - console.log(cfg.browserName, cfg.version, cfg.platform, 'get scrollHeight, clientHeight', scrollHeight, viewportHeight); + console.log(sessionName, 'get scrollHeight, clientHeight', scrollHeight, viewportHeight); // the easy case: Firefox and IE return a screenshot of the entire webpage if (cfg.browserName === 'Firefox' || cfg.browserName === 'Internet Explorer') { return browserDriver.saveScreenshot(baseDir + '/imgs/' + filename + '.png') - .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'saveScreenshot')) + .then(willLog(sessionName, 'saveScreenshot')) // the hard case: for Chrome, Safari, and Edge, scroll through the page and // take screenshots of each piece; circle.yml will stitch them together } else { @@ -111,7 +115,7 @@ return (function loop() { return browserDriver.saveScreenshot(piecesDir + index + '.png') .then(function() { - console.log(cfg.browserName, cfg.version, cfg.platform, 'saveScreenshot'); + console.log(sessionName, 'saveScreenshot'); scrollTop += viewportHeight; index += 1; @@ -124,7 +128,7 @@ // Use `window.scrollTo` instead of jQuery because jQuery was // causing a stackoverflow in Safari. return browserDriver.safeEval('window.scrollTo(0,'+scrollTop+');') - .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'scrollTo()')) + .then(willLog(sessionName, 'scrollTo()')) .then(loop); } else { // we are past the bottom edge of the page, reduce window size to // fit only the part of the page that hasn't been screenshotted. @@ -134,17 +138,17 @@ return browserDriver.getWindowSize() .then(function(windowSize) { - console.log(cfg.browserName, cfg.version, cfg.platform, 'getWindowSize'); + console.log(sessionName, 'getWindowSize'); // window size is a little bigger than the viewport because of address // bar and scrollbars and stuff var windowPadding = windowSize.height - viewportHeight; var newWindowHeight = scrollHeight - scrollTop + windowPadding; return browserDriver.setWindowSize(windowSize.width, newWindowHeight) - .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'setWindowSize')) + .then(willLog(sessionName, 'setWindowSize')) .safeEval('window.scrollTo(0,'+scrollHeight+');') - .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'scrollTo() Final')) + .then(willLog(sessionName, 'scrollTo() Final')) .saveScreenshot(piecesDir + index + '.png') - .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'saveScreenshot Final')); + .then(willLog(sessionName, 'saveScreenshot Final')); }); } }); @@ -153,23 +157,23 @@ }) .log('browser') .then(function(logs) { - var logfile = baseDir + '/browser_logs/' + [cfg.browserName, cfg.version, cfg.platform].join('_').replace(/ /g, '_') + '.log'; + var logfile = baseDir + '/browser_logs/' + sessionName.replace(/ /g, '_') + '.log'; return new Promise(function(resolve, reject) { fs.writeFile(logfile, JSON.stringify(logs, null, 2), function(err) { if (err) return reject(err); - console.log(cfg.browserName, cfg.version, cfg.platform, 'writeFile'); + console.log(sessionName, 'writeFile'); return resolve(browserDriver.quit()); }); }); }, function(err) { // the Edge/Internet Explorer drivers don't support logs, but the others do - console.log(cfg.browserName, cfg.platform, 'Error fetching logs:', JSON.stringify(err, null, 2)); + console.log(sessionName, 'Error fetching logs:', JSON.stringify(err, null, 2)); return []; }); }) .fail(function(err) { - console.log('ERROR:', cfg.browserName, cfg.platform); + console.log('ERROR:', sessionName); console.log(JSON.stringify(err, null, 2)); });