-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathpuppeteer-custom-environment.ts
83 lines (69 loc) · 2.33 KB
/
puppeteer-custom-environment.ts
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
const PuppeteerEnvironment = require('jest-environment-puppeteer');
const fs = require('fs-extra');
require('jest-circus');
class PuppeteerCustomEnvironment extends PuppeteerEnvironment {
async setup() {
await super.setup();
}
async teardown() {
// time for screenshots
await this.global.page.waitForTimeout(1000);
await super.teardown();
}
// returns a string corresponding to the local browser's date and time in this format:
// 20201103_084435
localDateTimeString() {
const localTime = new Date();
const fakeUtcTime = new Date(localTime.getTime() - (localTime.getTimezoneOffset() * 60000));
return fakeUtcTime
.toISOString()
.replace(/[-:]/g,'')
.replace('T', '_')
.slice(0, 15);
}
// Take a screenshot right after failure
async handleTestEvent(event, state) {
switch (event.name) {
case 'test_fn_failure':
case 'hook_failure':
const runningTest = state.currentlyRunningTest;
let testName;
if (runningTest != null) {
testName = state.currentlyRunningTest.name.replace(/\W/g, '-');
} else {
testName = event.test.name.replace(/\W/g, '-');
}
const screenshotDir = `logs/screenshot`;
const htmlDir = `logs/html`;
await fs.ensureDir(screenshotDir);
await fs.ensureDir(htmlDir);
const timestamp = this.localDateTimeString();
const screenshotFile = `${screenshotDir}/${testName}_${timestamp}.png`;
await this.takeScreenshot(screenshotFile);
const htmlFile = `${htmlDir}/${testName}_${timestamp}.html`;
await this.savePageToFile(htmlFile);
break;
default:
break;
}
}
async takeScreenshot(filePath) {
await this.global.page.screenshot({path: filePath, fullPage: true});
console.info(`Saved screenshot: ${filePath}`);
}
async savePageToFile(htmlFile) {
const htmlContent = await this.global.page.content();
return new Promise((resolve, reject) => {
fs.writeFile(htmlFile, htmlContent, 'utf8', error => {
if (error) {
console.error(`Failed to save html file. ` + error);
reject(false);
} else {
console.info('Saved html file: ' + htmlFile);
resolve(true);
}
})
});
}
}
module.exports = PuppeteerCustomEnvironment;