html2canvas/tests/mocha/selenium.js

100 lines
3.6 KiB
JavaScript

var wd = require('wd');
var http = require('http');
var https = require('https');
var url = require('url');
var path = require('path');
var Promise = require('bluebird');
var _ = require('lodash');
var humanizeDuration = require('humanize-duration');
var utils = require('../utils');
var colors = utils.colors;
var port = 8080;
function runTestWithRetries(browser, test, retries) {
retries = retries || 0;
return runTest(browser, test).timeout(30000).catch(Promise.TimeoutError, function() {
if (retries < 3) {
console.log(colors.violet, 'Retry', retries + 1, test);
return runTestWithRetries(browser, test, retries + 1);
} else {
throw new Error("Couldn't run test after 3 retries");
}
});
}
function getResults(browser) {
return function() {
return Promise.props({
dataUrl: browser
.waitForElementByCss("body[data-complete='true']", 90000)
.then(function() {
return browser.elementsByCssSelector('.test.fail');
})
.then(function(nodes) {
return Array.isArray(nodes)
? Promise.map(nodes, function(node) {
return browser.text(node).then(function(error) {
return Promise.reject(error);
});
})
: Promise.resolve([]);
})
});
};
}
function runTest(browser, test) {
return Promise.resolve(
browser.then(utils.loadTestPage(browser, test, port)).then(getResults(browser))
).cancellable();
}
exports.tests = function(browsers, singleTest) {
var path = 'tests/mocha';
return (singleTest ? Promise.resolve([singleTest]) : utils.getTests(path)).then(function(
tests
) {
return Promise.map(
browsers,
function(settings) {
var name = [settings.browserName, settings.version, settings.platform].join('-');
var count = 0;
var browser = utils.initBrowser(settings);
return Promise.using(browser, function() {
return Promise.map(
tests,
function(test, index, total) {
console.log(
colors.green,
'STARTING',
'(' + ++count + '/' + total + ')',
name,
test,
colors.clear
);
var start = Date.now();
return runTestWithRetries(browser, test).then(function() {
console.log(
colors.green,
'COMPLETE',
humanizeDuration(Date.now() - start),
'(' + count + '/' + total + ')',
name,
colors.clear
);
});
},
{concurrency: 1}
)
.settle()
.catch(function(error) {
console.error(colors.red, 'ERROR', name, error);
throw error;
});
});
},
{concurrency: 3}
);
});
};