This repository has been archived by the owner on Jul 12, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 76
/
Copy pathaudits.js
111 lines (93 loc) · 3.35 KB
/
audits.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/* eslint-env phantomjs, browser */
/* globals axs */
'use strict';
/**
* Conducts audits using the Chrome Accessibility Tools and PhantomJS.
*/
var system = require('system');
var webpage = require('webpage').create();
var opts = JSON.parse(system.args[1]);
var PAGE_TIMEOUT = 9000;
var TOOLS_PATH = 'node_modules/accessibility-developer-tools/dist/js/axs_testing.js';
var BIND_POLYFILL_PATH = 'node_modules/phantomjs-polyfill/bind-polyfill.js';
function formatTrace(trace) {
var src = trace.file || trace.sourceURL;
var fn = (trace.function ? ' in function ' + trace.function : '');
return '→ ' + src + ' on line ' + trace.line + fn;
}
// `console.error` is broken in PhantomJS
console.error = function () {
system.stderr.writeLine([].slice.call(arguments).join(' '));
};
// Need to polyfill bind...
webpage.onInitialized = function () {
webpage.injectJs(BIND_POLYFILL_PATH);
};
webpage.settings.resourceTimeout = PAGE_TIMEOUT;
webpage.viewportSize = {
width: opts.width,
height: opts.height
};
webpage.onResourceTimeout = function (err) {
console.error('Error code:' + err.errorCode + ' ' + err.errorString + ' for ' + err.url);
phantom.exit(1);
};
webpage.onError = opts.verbose ? function (err, trace) {
console.error(err + '\n' + formatTrace(trace[0]) + '\n');
} : function () {
};
webpage.open(opts.url, function (status) {
if (status === 'fail') {
console.error('Couldn\'t load url: ' + JSON.stringify(opts.url));
phantom.exit(1);
}
// Inject axs_testing
webpage.injectJs(TOOLS_PATH);
window.setTimeout(function () {
var ret = webpage.evaluate(function () {
var results = axs.Audit.run();
var audit = results.map(function (result) {
var DOMElements = result.elements;
var message = '';
if (DOMElements !== undefined) {
for (var i = 0; i < DOMElements.length; i++) {
var el = DOMElements[i];
message += '\n';
// Get query selector not browser independent. catch any errors and
// default to simple tagName.
try {
message += axs.utils.getQuerySelectorText(el);
} catch (err) {
message += ' tagName:' + el.tagName;
message += ' id:' + el.id;
}
}
}
return {
code: result.rule.code,
heading: result.rule.heading,
result: result.result,
severity: result.rule.severity,
url: result.rule.url,
elements: message
};
});
return {
audit: audit,
report: axs.Audit.createReport(results)
};
});
if (!ret) {
console.error('Audit failed');
phantom.exit(1);
return;
}
console.log(JSON.stringify(ret));
// Must do crazy song and dance to get phantom to exit properly
// https://github.com/ariya/phantomjs/issues/12697
webpage.close();
setTimeout(function () {
phantom.exit();
}, 0);
}, opts.delay * 1000);
});