-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
110 lines (96 loc) · 3.71 KB
/
index.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
// Packages
const puppeteer = require('puppeteer');
const filenamify = require('filenamify');
const pages = require('./pages.js');
const { extractDataFromPerformanceTiming, logJSON } = require('./helpers');
// Helpers
const axeUrl = 'https://cdnjs.cloudflare.com/ajax/libs/axe-core/3.2.2/axe.min.js';
const axeOptions = {};
// const iPhone6 = puppeteer.devices['iPhone 6'];
// const iPhoneX = puppeteer.devices['iPhone X'];
async function autoScroll(page) {
await page.evaluate(async () => {
await new Promise((resolve, reject) => {
var totalHeight = 0;
var distance = 400;
var timer = setInterval(() => {
var scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if (totalHeight >= scrollHeight) {
clearInterval(timer);
resolve();
}
}, 100);
});
});
}
// Main Functionality
(async () => {
const browser = await puppeteer.launch();
for (const pageData of pages) {
try {
// Setup Page
const page = await browser.newPage();
// Enable both JavaScript and CSS coverage
await Promise.all([
page.coverage.startJSCoverage(),
page.coverage.startCSSCoverage()
]);
// await page.emulate(iPhoneX);
await page.goto(pageData.url);
// Scroll Entire Page
await autoScroll(page);
// Take Screen Shot
let screenshotFileName = filenamify(pageData.url, { replacement: '-' });
let screenshotPath = './screenshots/' + screenshotFileName + '.png';
await page.screenshot({
path: screenshotPath,
fullPage: true
});
// Test Accessibility
await page.addScriptTag({ url: axeUrl });
const accessibilityReport = await page.evaluate(options => {
return new Promise(resolve => {
setTimeout(resolve, 0);
}).then(() => axe.run(options));
}, axeOptions);
logJSON('results/axe.json', accessibilityReport);
// Calculate Code Coverage
const [jsCoverage, cssCoverage] = await Promise.all([
page.coverage.stopJSCoverage(),
page.coverage.stopCSSCoverage(),
]);
let totalBytes = 0;
let usedBytes = 0;
const coverage = [...jsCoverage, ...cssCoverage];
for (const entry of coverage) {
totalBytes += entry.text.length;
for (const range of entry.ranges)
usedBytes += range.end - range.start - 1;
}
console.log(`Bytes used: ${usedBytes / totalBytes * 100}%`);
// Performance Timing
const performanceTiming = JSON.parse(
await page.evaluate(() => JSON.stringify(window.performance.timing))
);
const extractedPerformanceTiming = extractDataFromPerformanceTiming(
performanceTiming,
'responseEnd',
'domInteractive',
'domContentLoadedEventEnd',
'loadEventEnd'
);
console.log('extractedPerformanceTiming', extractedPerformanceTiming);
// Metrics
const metrics = await page.metrics()
console.log('page.metrics', metrics);
// Done with page
await page.close();
} catch (error) {
console.log('ERROR:', pageData.url, error);
}
}
await browser.close();
console.log('All Done!');
})();