-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
108 lines (86 loc) · 2.87 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
import libCoverage from 'istanbul-lib-coverage';
import pngjs from 'pngjs';
import builderFirefox from './builder-firefox.js';
import builderChrome from './builder-chrome.js';
const png = pngjs.PNG.sync;
async function build(builder) {
try {
const selenium = await builder().build();
/* Verify the browser can start */
await selenium.get('data:text/plain,');
return selenium;
} catch {}
}
export async function grabImage(element) {
const image64 = await element.takeScreenshot();
return png.write(png.read(Buffer.from(image64, 'base64')));
}
async function getBaseURL(daemon) {
if (typeof daemon === 'string') {
return daemon;
}
await daemon.start();
return daemon.baseURL;
}
async function stopDaemon(daemon) {
if (typeof daemon === 'string') {
return;
}
await daemon.stop();
}
export async function testBrowser(t, browser, daemon, pages) {
let builder;
let foundCoverage = false;
const coverageMap = libCoverage.createCoverageMap();
switch (browser) {
case 'chrome':
builder = builderChrome;
break;
case 'firefox':
builder = builderFirefox;
break;
default:
if (typeof browser !== 'function') {
throw new TypeError(`Unknown browser: ${browser}`);
}
builder = browser;
browser = builder.name;
}
const selenium = await build(builder);
if (!selenium) {
t.skip(browser);
return false;
}
const baseURL = await getBaseURL(daemon);
await t.test(browser, {buffered: false}, async t => {
for (const [page, implementation] of Object.entries(pages)) {
t.test(page, {buffered: false}, async t => {
await selenium.get(`${baseURL}${page}`);
await implementation(t, selenium);
/* istanbul ignore else: coverage is always enabled in testing */
if (coverageMap) {
const coverage = await selenium.executeScript(
/* istanbul ignore next: sent to browser */
() => window.__coverage__
);
if (coverage) {
foundCoverage = true;
/* Merge coverage object from the browser running this test. */
coverageMap.merge(coverage);
}
}
});
}
});
await selenium.quit();
await stopDaemon(daemon);
/* istanbul ignore else: coverage is always enabled in testing */
if (foundCoverage) {
/* istanbul ignore else: coverage is always enabled in testing */
if (global.__coverage__) {
coverageMap.merge(global.__coverage__);
}
global.__coverage__ = coverageMap.toJSON();
}
return true;
}