-
Notifications
You must be signed in to change notification settings - Fork 0
/
index-playwright.ts
140 lines (127 loc) · 4.31 KB
/
index-playwright.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
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import { ConsoleMessage, Browser, LaunchOptions, Page } from "puppeteer"; //typescript
//import {Test} from "tape"; //typescript
const handler = require("serve-handler");
const http = require("http");
const net = require("net");
function getAvailablePort(startingAt) {
function getNextAvailablePort(currentPort, cb) {
const server = net.createServer();
server.listen(currentPort, _ => {
server.once("close", _ => {
cb(currentPort);
});
server.close();
});
server.on("error", _ => {
getNextAvailablePort(++currentPort, cb);
});
}
return new Promise(resolve => {
getNextAvailablePort(startingAt, resolve);
});
}
const playwright = require("playwright");
export interface IXtalTestRunnerOptions {
path: string;
takeSnapshot?: boolean;
launchOptions?: LaunchOptions;
expectedNoOfSuccessMarkers?: number;
customTest?: (page: Page, options: IXtalTestRunnerOptions) => void;
wait?: number | undefined;
}
async function standardTest(page: Page, options: IXtalTestRunnerOptions) {
const wait = options.wait !== undefined ? options.wait : 5000;
await page.waitFor(wait);
const errorTags = await page.$$("[err=true]");
if (errorTags.length > 0) throw "Found tag with attribute err=true";
const markings = await page.$$("[mark]");
const noOfExpectedMarkings =
options.expectedNoOfSuccessMarkers === undefined
? 0
: options.expectedNoOfSuccessMarkers;
if (markings.length !== noOfExpectedMarkings) {
throw "Found " +
markings.length +
" tags with attribute mark. Expecting " +
noOfExpectedMarkings;
}
}
export interface IXtalTestRunner {
runTests(options: IXtalTestRunnerOptions[]);
launchWebServer(defaultPort?: number);
}
async function launchWebServer(defaultPort: number = 3030) {
let server = http.createServer((request, response) => {
// You pass two more arguments for config and middleware
// More details here: https://github.com/zeit/serve-handler#options
return handler(request, response);
});
const port = await getAvailablePort(defaultPort);
server = require("http-shutdown")(server);
server.listen(port, () => {
console.log("Running at http://localhost:" + port);
});
}
async function runTests(tests: IXtalTestRunnerOptions[]) {
console.log("running tests");
let server = http.createServer((request, response) => {
// You pass two more arguments for config and middleware
// More details here: https://github.com/zeit/serve-handler#options
return handler(request, response);
});
const port = await getAvailablePort(3000);
server = require("http-shutdown")(server);
server.listen(port, () => {
console.log("Running at http://localhost:" + port);
});
const launchOptions = {
headless: true,
args: ["--enable-built-in-module-all"]
} as LaunchOptions;
let passed = true;
for (const browserType of ['chromium', 'firefox']) {
const browser = (await playwright[browserType].launch(launchOptions)) as any;
console.log('testing ' + browserType);
try {
for (const options of tests) {
if (options.launchOptions)
Object.assign(launchOptions, options.launchOptions);
const context = await browser.newContext();
const page = await context.newPage();
page.on("console", (msg: ConsoleMessage) =>
console.log("PAGE LOG:", msg.text())
);
//const devFile = path.resolve(__dirname, 'localhost:3000');
const url = "http://localhost:" + port + "/" + options.path;
console.log("going to " + url);
await page.goto(url);
if (options.takeSnapshot) {
await page.screenshot({ path: "example.png" });
}
if (options.customTest) {
await options.customTest(page, options);
} else {
await standardTest(page, options);
}
}
} catch (e) {
console.log(e);
passed = false;
}
await shutDown(browser, server, browserType === 'firefox');
if (!passed) {
process.exit(1);
}
}
return passed;
}
async function shutDown(browser: Browser, server: any, exit: boolean) {
await browser.close();
if(exit){
server.shutdown(function() {
console.log("Everything is cleanly shutdown.");
process.exit();
});
}
}
module.exports = { runTests: runTests, launchWebServer: launchWebServer };