dceky 1.2.1 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -17
- package/lib/setup/addToGitIgnore.js +2 -0
- package/lib/setup/addToGitIgnore.js.map +1 -1
- package/lib/src/genConfiguration/index.js +0 -9
- package/lib/src/genConfiguration/index.js.map +1 -1
- package/lib/start/constants/DEFAULT_THREADS_PER_COMBO.d.ts +1 -1
- package/lib/start/constants/DEFAULT_THREADS_PER_COMBO.js +1 -1
- package/lib/start/helpers/embedScreenshotsInReportData.d.ts +14 -0
- package/lib/start/helpers/embedScreenshotsInReportData.js +139 -0
- package/lib/start/helpers/embedScreenshotsInReportData.js.map +1 -0
- package/lib/start/helpers/executeCypress.js +1 -1
- package/lib/start/helpers/executeCypress.js.map +1 -1
- package/lib/start/helpers/generateHtmlReport.js +7 -0
- package/lib/start/helpers/generateHtmlReport.js.map +1 -1
- package/lib/start/helpers/getCypressDetectedBrowsersForChooser.d.ts +2 -1
- package/lib/start/helpers/getCypressDetectedBrowsersForChooser.js +34 -22
- package/lib/start/helpers/getCypressDetectedBrowsersForChooser.js.map +1 -1
- package/lib/start/helpers/mergeAllReportsAndGenerateHtml.js +52 -0
- package/lib/start/helpers/mergeAllReportsAndGenerateHtml.js.map +1 -1
- package/lib/start/helpers/reportHomepage.ejs +18 -7
- package/lib/start/index.d.ts +2 -2
- package/lib/start/index.js +214 -175
- package/lib/start/index.js.map +1 -1
- package/package.json +2 -1
- package/setup/addToGitIgnore.ts +2 -0
- package/src/genConfiguration/index.ts +0 -13
- package/start/constants/DEFAULT_THREADS_PER_COMBO.ts +1 -1
- package/start/helpers/embedScreenshotsInReportData.ts +171 -0
- package/start/helpers/executeCypress.ts +1 -1
- package/start/helpers/generateHtmlReport.ts +12 -0
- package/start/helpers/getCypressDetectedBrowsersForChooser.ts +41 -23
- package/start/helpers/mergeAllReportsAndGenerateHtml.ts +60 -0
- package/start/helpers/reportHomepage.ejs +18 -7
- package/start/index.ts +218 -181
- package/start/helpers/extractArgValue.ts +0 -42
package/README.md
CHANGED
|
@@ -36,23 +36,39 @@ You'll have a bunch of changes to commit and push. Do that now.
|
|
|
36
36
|
|
|
37
37
|
### Start Ky Tests: `npm run ky:start`
|
|
38
38
|
|
|
39
|
-
To start running ky tests, use
|
|
39
|
+
To start running ky tests, use one of these two options:
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
1. Run `npm run ky:start` and follow the chooser prompts.
|
|
42
|
+
2. Set environment variables before running `npm run ky:start`, either in your shell or in a `.env` file at the project root.
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
The chooser guides you through whether tests run visibly or headless, which profile(s) to use, which browser(s) to use, which e2e test folder to run, and the "Num Test Files in Parallel Per Combo" for headless runs.
|
|
45
|
+
|
|
46
|
+
To set environment variables directly in your shell, run:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
HEADLESS=true BROWSER=chrome,webkit PROFILE=Stage E2E_TEST_FOLDER=Activities THREADS_PER_COMBO=2 npm run ky:start
|
|
46
50
|
```
|
|
47
51
|
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
Or create a `.env` file:
|
|
53
|
+
|
|
54
|
+
```sh
|
|
50
55
|
HEADLESS=true
|
|
51
56
|
BROWSER=chrome,webkit
|
|
52
57
|
PROFILE=Stage
|
|
53
58
|
E2E_TEST_FOLDER=Activities
|
|
59
|
+
THREADS_PER_COMBO=2
|
|
54
60
|
```
|
|
55
61
|
|
|
62
|
+
Environment variables:
|
|
63
|
+
|
|
64
|
+
| Variable | Description |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| `HEADLESS` | Set to `true` to run without opening the Cypress UI. Set to `false` to run visibly. If omitted, ky asks in the chooser. |
|
|
67
|
+
| `BROWSER` | Browser(s) to use for headless runs, as a comma-separated list such as `chrome,webkit`. Available browsers are `chrome`, `webkit`, `edge`, and `firefox`. If omitted during a headless run, ky asks in the chooser. |
|
|
68
|
+
| `PROFILE` | Profile(s) to run, as a comma-separated list such as `Stage` or `Stage,Prod`. Visible runs use one profile; headless runs can use multiple. If omitted, ky asks in the chooser. |
|
|
69
|
+
| `E2E_TEST_FOLDER` | E2E test folder to run for headless runs. Use a folder path under `cypress/e2e`, such as `Activities` or `Activities/Respond`. Use `all`, `*`, or `.` to run all e2e tests. If omitted, ky asks in the chooser. |
|
|
70
|
+
| `THREADS_PER_COMBO` | Number of test files to run in parallel for each profile and browser combination during headless runs. Use a positive whole number. If omitted, ky asks for a number and uses `1` when left blank. |
|
|
71
|
+
|
|
56
72
|
### Setup Ky: `npm run ky:setup`
|
|
57
73
|
|
|
58
74
|
Whenever you update the version of ky or make changes to supporting project-specific commands or other non-test files, you should run `ky:setup`.
|
|
@@ -137,13 +153,3 @@ const myReturnValue = { hello: 'world' };
|
|
|
137
153
|
|
|
138
154
|
return ky.wrap(myReturnValue);
|
|
139
155
|
```
|
|
140
|
-
|
|
141
|
-
### Adding a Custom Setup Node Events Script
|
|
142
|
-
|
|
143
|
-
If you want to add a custom `setupNodeEvents` script, create a `/cypress/support/setupNodeEvents.ts` module that exports a single default function of the following type:
|
|
144
|
-
|
|
145
|
-
```ts
|
|
146
|
-
((on: Cypress.PluginEvents, config: Cypress.PluginConfigOptions) => Cypress.PluginConfigOptions | void)
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
Ky will automatically look for this file and add it to the configuration if it exists, so there's no need to import it or add it to the config manually. This is useful for adding custom functionality that happens _outside the browser_.
|
|
@@ -20,6 +20,8 @@ const addToGitIgnore = () => {
|
|
|
20
20
|
'cypress/screenshots',
|
|
21
21
|
'cypress/videos',
|
|
22
22
|
'cypress/globals/GlobalCredentials.ts',
|
|
23
|
+
'cypress/parallel-weights.json',
|
|
24
|
+
'multi-reporter-config.json',
|
|
23
25
|
];
|
|
24
26
|
let gitignoreContent = '';
|
|
25
27
|
if ((0, fs_1.existsSync)(gitignorePath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addToGitIgnore.js","sourceRoot":"","sources":["../../setup/addToGitIgnore.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,2BAA6D;AAC7D,gDAAwB;AACxB,wEAAgD;AAEhD;;;GAGG;AACH,MAAM,cAAc,GAAG,GAAS,EAAE;IAChC,MAAM,IAAI,GAAG,IAAA,qBAAW,GAAE,CAAC;IAE3B,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG;QACd,kBAAkB;QAClB,mBAAmB;QACnB,qBAAqB;QACrB,gBAAgB;QAChB,sCAAsC;
|
|
1
|
+
{"version":3,"file":"addToGitIgnore.js","sourceRoot":"","sources":["../../setup/addToGitIgnore.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,2BAA6D;AAC7D,gDAAwB;AACxB,wEAAgD;AAEhD;;;GAGG;AACH,MAAM,cAAc,GAAG,GAAS,EAAE;IAChC,MAAM,IAAI,GAAG,IAAA,qBAAW,GAAE,CAAC;IAE3B,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG;QACd,kBAAkB;QAClB,mBAAmB;QACnB,qBAAqB;QACrB,gBAAgB;QAChB,sCAAsC;QACtC,+BAA+B;QAC/B,4BAA4B;KAC7B,CAAC;IAEF,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,IAAA,eAAU,EAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,gBAAgB,GAAG,IAAA,iBAAY,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,kCAAkC;IAClC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9C,kDAAkD;QAClD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,sBAAsB;IACtB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,gBAAgB,IAAI,IAAI,CAAC;QAC3B,CAAC;QACD,gBAAgB,IAAI,sDAAsD,CAAC;QAC3E,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,gBAAgB,IAAI,GAAG,KAAK,IAAI,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,IAAA,kBAAa,EAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,SAAS,cAAc,CAAC,MAAM,wBAAwB,CAAC,CAAC;IACtE,CAAC;AACH,CAAC,CAAC;AAEF,kBAAe,cAAc,CAAC"}
|
|
@@ -7,7 +7,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
/* eslint-disable global-require */
|
|
8
8
|
/* eslint-disable import/no-dynamic-require */
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const fs_1 = __importDefault(require("fs"));
|
|
11
10
|
// Import cypress
|
|
12
11
|
const cypress_1 = require("cypress");
|
|
13
12
|
// Import external libraries
|
|
@@ -92,19 +91,11 @@ const genConfiguration = () => {
|
|
|
92
91
|
else if (!baseUrl.startsWith('http')) {
|
|
93
92
|
baseUrl = `https://${baseUrl}`;
|
|
94
93
|
}
|
|
95
|
-
// Look for a /cypress/support/setupNodeEvents.ts file and add it to the config if it exists
|
|
96
|
-
const setupNodeEventsPath = path_1.default.join(CWD, '/cypress/support/setupNodeEvents.ts');
|
|
97
|
-
const setupNodeEventsExists = fs_1.default.existsSync(setupNodeEventsPath);
|
|
98
|
-
let setupNodeEvents;
|
|
99
|
-
if (setupNodeEventsExists) {
|
|
100
|
-
setupNodeEvents = require(setupNodeEventsPath).default;
|
|
101
|
-
}
|
|
102
94
|
// Return the configuration object
|
|
103
95
|
return (0, cypress_1.defineConfig)({
|
|
104
96
|
e2e: {
|
|
105
97
|
experimentalWebKitSupport: true,
|
|
106
98
|
experimentalOriginDependencies: true,
|
|
107
|
-
setupNodeEvents,
|
|
108
99
|
baseUrl,
|
|
109
100
|
expose: exposed,
|
|
110
101
|
env: securedEnv,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/genConfiguration/index.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,mCAAmC;AACnC,8CAA8C;AAC9C,gDAAwB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/genConfiguration/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
* Default number of threads per combo
|
|
5
5
|
* @author Yuen Ler Chow
|
|
6
6
|
*/
|
|
7
|
-
const DEFAULT_THREADS_PER_COMBO =
|
|
7
|
+
const DEFAULT_THREADS_PER_COMBO = 1;
|
|
8
8
|
exports.default = DEFAULT_THREADS_PER_COMBO;
|
|
9
9
|
//# sourceMappingURL=DEFAULT_THREADS_PER_COMBO.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add screenshot context to failed tests in a merged Mochawesome JSON report.
|
|
3
|
+
* @author Yuen Ler Chow
|
|
4
|
+
* @param opts object of arguments
|
|
5
|
+
* @param opts.reportDataPath path to report-data.json
|
|
6
|
+
* @param opts.screenshotsDir path to Cypress screenshots for this report
|
|
7
|
+
* @param opts.reportDir path where marge will generate the HTML report
|
|
8
|
+
*/
|
|
9
|
+
declare const embedScreenshotsInReportData: (opts: {
|
|
10
|
+
reportDataPath: string;
|
|
11
|
+
screenshotsDir: string;
|
|
12
|
+
reportDir: string;
|
|
13
|
+
}) => void;
|
|
14
|
+
export default embedScreenshotsInReportData;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/* eslint-disable no-console */
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
/**
|
|
10
|
+
* Normalize Cypress screenshot names and Mochawesome test titles for matching.
|
|
11
|
+
* @author Yuen Ler Chow
|
|
12
|
+
* @param value raw screenshot filename or test title
|
|
13
|
+
* @returns normalized value used for screenshot/test matching
|
|
14
|
+
*/
|
|
15
|
+
const normalize = (value) => {
|
|
16
|
+
return (value
|
|
17
|
+
.replace(/\s+\(failed\)(?:\s+\(attempt\s+\d+\))?$/i, '')
|
|
18
|
+
.replace(/\s+\(attempt\s+\d+\)$/i, '')
|
|
19
|
+
.replace(/[^a-z0-9]+/gi, '')
|
|
20
|
+
.toLowerCase());
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Recursively collect screenshots and store paths relative to the HTML report.
|
|
24
|
+
* @author Yuen Ler Chow
|
|
25
|
+
* @param dir screenshot directory to scan
|
|
26
|
+
* @param reportDir directory where marge will generate the HTML report
|
|
27
|
+
* @returns screenshot metadata used for report embedding
|
|
28
|
+
*/
|
|
29
|
+
const collectScreenshots = (dir, reportDir) => {
|
|
30
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
return fs_1.default.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
|
|
34
|
+
const entryPath = path_1.default.join(dir, entry.name);
|
|
35
|
+
if (entry.isDirectory()) {
|
|
36
|
+
return collectScreenshots(entryPath, reportDir);
|
|
37
|
+
}
|
|
38
|
+
if (!entry.isFile() || !entry.name.endsWith('.png')) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
return [{
|
|
42
|
+
href: path_1.default.relative(reportDir, entryPath).replace(/\\/g, '/'),
|
|
43
|
+
matchKey: normalize(entry.name.replace(/\.png$/i, '')),
|
|
44
|
+
}];
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Convert Mochawesome's context field into an array while preserving existing entries.
|
|
49
|
+
* @author Yuen Ler Chow
|
|
50
|
+
* @param context raw Mochawesome context value
|
|
51
|
+
* @returns context entries as an array
|
|
52
|
+
*/
|
|
53
|
+
const getContextItems = (context) => {
|
|
54
|
+
if (!context) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(context)) {
|
|
58
|
+
return context;
|
|
59
|
+
}
|
|
60
|
+
if (typeof context !== 'string') {
|
|
61
|
+
return [context];
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(context);
|
|
65
|
+
return Array.isArray(parsed) ? parsed : [parsed];
|
|
66
|
+
}
|
|
67
|
+
catch (_a) {
|
|
68
|
+
return [context];
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Walk a Mochawesome report node and attach matching screenshots to failed tests.
|
|
73
|
+
* @author Yuen Ler Chow
|
|
74
|
+
* @param node Mochawesome report node, suite, test, or array of nodes
|
|
75
|
+
* @param screenshots screenshots available for matching
|
|
76
|
+
* @returns number of failed tests that received screenshot context
|
|
77
|
+
*/
|
|
78
|
+
const embedScreenshotsInNode = (node, screenshots) => {
|
|
79
|
+
if (!node || typeof node !== 'object') {
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
if (Array.isArray(node)) {
|
|
83
|
+
return node.reduce((sum, child) => {
|
|
84
|
+
return sum + embedScreenshotsInNode(child, screenshots);
|
|
85
|
+
}, 0);
|
|
86
|
+
}
|
|
87
|
+
let numEmbedded = 0;
|
|
88
|
+
if (node.fail) {
|
|
89
|
+
const testKey = normalize(node.fullTitle || node.title || '');
|
|
90
|
+
const matches = screenshots.filter((screenshot) => {
|
|
91
|
+
return screenshot.matchKey.endsWith(testKey);
|
|
92
|
+
});
|
|
93
|
+
if (matches.length > 0) {
|
|
94
|
+
const contextItems = getContextItems(node.context);
|
|
95
|
+
const existingHrefs = new Set(contextItems.map((item) => {
|
|
96
|
+
return typeof item === 'string' ? item : item.value;
|
|
97
|
+
}));
|
|
98
|
+
matches.forEach((screenshot, index) => {
|
|
99
|
+
if (!existingHrefs.has(screenshot.href)) {
|
|
100
|
+
contextItems.push({
|
|
101
|
+
title: matches.length === 1 ? 'Screenshot' : `Screenshot ${index + 1}`,
|
|
102
|
+
value: screenshot.href,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// eslint-disable-next-line no-param-reassign
|
|
107
|
+
node.context = JSON.stringify(contextItems.length === 1 ? contextItems[0] : contextItems, null, 2);
|
|
108
|
+
numEmbedded += 1;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return (numEmbedded
|
|
112
|
+
+ embedScreenshotsInNode(node.suites, screenshots)
|
|
113
|
+
+ embedScreenshotsInNode(node.tests, screenshots));
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Add screenshot context to failed tests in a merged Mochawesome JSON report.
|
|
117
|
+
* @author Yuen Ler Chow
|
|
118
|
+
* @param opts object of arguments
|
|
119
|
+
* @param opts.reportDataPath path to report-data.json
|
|
120
|
+
* @param opts.screenshotsDir path to Cypress screenshots for this report
|
|
121
|
+
* @param opts.reportDir path where marge will generate the HTML report
|
|
122
|
+
*/
|
|
123
|
+
const embedScreenshotsInReportData = (opts) => {
|
|
124
|
+
const { reportDataPath, screenshotsDir, reportDir } = opts;
|
|
125
|
+
const screenshots = collectScreenshots(screenshotsDir, reportDir);
|
|
126
|
+
if (!fs_1.default.existsSync(reportDataPath) || screenshots.length === 0) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const report = JSON.parse(fs_1.default.readFileSync(reportDataPath, 'utf8'));
|
|
130
|
+
const numEmbedded = embedScreenshotsInNode(report.results, screenshots);
|
|
131
|
+
if (numEmbedded === 0) {
|
|
132
|
+
console.warn('⚠️ Screenshots were found, but none matched failed tests in the Mochawesome report.');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
fs_1.default.writeFileSync(reportDataPath, JSON.stringify(report, null, 2));
|
|
136
|
+
console.log(` ✅ Embedded screenshots into ${numEmbedded} failed test(s)`);
|
|
137
|
+
};
|
|
138
|
+
exports.default = embedScreenshotsInReportData;
|
|
139
|
+
//# sourceMappingURL=embedScreenshotsInReportData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedScreenshotsInReportData.js","sourceRoot":"","sources":["../../../start/helpers/embedScreenshotsInReportData.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,7 +36,7 @@ const executeCypress = (opts) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
36
36
|
console.log(`Headless: ${isHeadless}`);
|
|
37
37
|
if (isHeadless) {
|
|
38
38
|
console.log(`E2E test folder: ${e2eTestFolder}`);
|
|
39
|
-
console.log(`
|
|
39
|
+
console.log(`Num Test Files in Parallel Per Combo: ${threadsPerCombo}`);
|
|
40
40
|
}
|
|
41
41
|
console.log('═══════════════════════════════════════════════════════════\n');
|
|
42
42
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeCypress.js","sourceRoot":"","sources":["../../../start/helpers/executeCypress.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;;;;;;;;;;AAK/B,iBAAiB;AACjB,4EAAoD;AACpD,sGAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,cAAc,GAAG,CACrB,IAOC,EACc,EAAE;IACjB,MAAM,EACJ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,GACf,GAAG,IAAI,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"executeCypress.js","sourceRoot":"","sources":["../../../start/helpers/executeCypress.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;;;;;;;;;;AAK/B,iBAAiB;AACjB,4EAAoD;AACpD,sGAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,cAAc,GAAG,CACrB,IAOC,EACc,EAAE;IACjB,MAAM,EACJ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,GACf,GAAG,IAAI,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,yCAAyC,eAAe,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,wCAAwC;YACxC,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAA,2BAAiB,EAAC,WAAW,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,IAAA,wCAA8B,EAAC;gBACnC,gBAAgB;gBAChB,gBAAgB;gBAChB,eAAe;gBACf,cAAc;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,kBAAe,cAAc,CAAC"}
|
|
@@ -8,6 +8,7 @@ const child_process_1 = require("child_process");
|
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const fs_1 = require("fs");
|
|
10
10
|
const getRootPath_1 = __importDefault(require("./getRootPath"));
|
|
11
|
+
const embedScreenshotsInReportData_1 = __importDefault(require("./embedScreenshotsInReportData"));
|
|
11
12
|
/**
|
|
12
13
|
* Generate HTML report from merged JSON report using mochawesome-report-generator (marge)
|
|
13
14
|
* @author Yuen Ler Chow
|
|
@@ -20,6 +21,7 @@ const generateHtmlReport = (opts) => {
|
|
|
20
21
|
const { resultsDir, profileName, browserName } = opts;
|
|
21
22
|
const reportDataPath = path_1.default.join(resultsDir, `${profileName}-${browserName}`, 'report-data.json');
|
|
22
23
|
const reportDir = path_1.default.join(resultsDir, `${profileName}-${browserName}`, 'report');
|
|
24
|
+
const screenshotsDir = path_1.default.join(resultsDir, `${profileName}-${browserName}`, 'screenshots');
|
|
23
25
|
const expectedHtmlPath = path_1.default.join(reportDir, 'report-data.html');
|
|
24
26
|
console.log(`\n📄 Generate HTML Report Debug for ${profileName} + ${browserName}:`);
|
|
25
27
|
console.log(` Report data path: ${reportDataPath}`);
|
|
@@ -30,6 +32,11 @@ const generateHtmlReport = (opts) => {
|
|
|
30
32
|
throw new Error(errorMsg);
|
|
31
33
|
}
|
|
32
34
|
try {
|
|
35
|
+
(0, embedScreenshotsInReportData_1.default)({
|
|
36
|
+
reportDataPath,
|
|
37
|
+
screenshotsDir,
|
|
38
|
+
reportDir,
|
|
39
|
+
});
|
|
33
40
|
const command = `npx marge "${reportDataPath}" --reportDir "${reportDir}"`;
|
|
34
41
|
console.log(` Running: ${command}`);
|
|
35
42
|
console.log(`Generating HTML report for ${profileName} + ${browserName}...`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateHtmlReport.js","sourceRoot":"","sources":["../../../start/helpers/generateHtmlReport.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,iDAAyC;AACzC,gDAAwB;AACxB,2BAAgC;AAChC,gEAAwC;
|
|
1
|
+
{"version":3,"file":"generateHtmlReport.js","sourceRoot":"","sources":["../../../start/helpers/generateHtmlReport.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,iDAAyC;AACzC,gDAAwB;AACxB,2BAAgC;AAChC,gEAAwC;AACxC,kGAA0E;AAE1E;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAAG,CACzB,IAIC,EACK,EAAE;IACR,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAEtD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAC9B,UAAU,EACV,GAAG,WAAW,IAAI,WAAW,EAAE,EAC/B,kBAAkB,CACnB,CAAC;IACF,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CACzB,UAAU,EACV,GAAG,WAAW,IAAI,WAAW,EAAE,EAC/B,QAAQ,CACT,CAAC;IACF,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAC9B,UAAU,EACV,GAAG,WAAW,IAAI,WAAW,EAAE,EAC/B,aAAa,CACd,CAAC;IACF,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,MAAM,WAAW,GAAG,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IAElD,IAAI,CAAC,IAAA,eAAU,EAAC,cAAc,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,6CAA6C,cAAc,EAAE,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC;QACH,IAAA,sCAA4B,EAAC;YAC3B,cAAc;YACd,cAAc;YACd,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,cAAc,cAAc,kBAAkB,SAAS,GAAG,CAAC;QAE3E,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW,MAAM,WAAW,KAAK,CAAC,CAAC;QAE7E,IAAA,wBAAQ,EAAC,OAAO,EAAE;YAChB,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,IAAA,qBAAW,GAAE;SACnB,CAAC,CAAC;QAEH,qCAAqC;QACrC,IAAI,CAAC,IAAA,eAAU,EAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,4CAA4C,gBAAgB,EAAE,CAAC;YAChF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+CAA+C,gBAAgB,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oCAAoC,WAAW,MAAM,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
|
|
@@ -4,6 +4,7 @@ import AVAILABLE_BROWSERS from '../constants/AVAILABLE_BROWSERS';
|
|
|
4
4
|
* `npx cypress info` reports (`- Name:` lines), plus Webkit (always shown
|
|
5
5
|
* because `cypress info` omits WebKit; https://github.com/cypress-io/cypress/issues/27304).
|
|
6
6
|
* @author Yuen Ler Chow
|
|
7
|
+
* @returns promise containing browsers to show in the chooser
|
|
7
8
|
*/
|
|
8
|
-
declare const getCypressDetectedBrowsersForChooser: () => typeof AVAILABLE_BROWSERS
|
|
9
|
+
declare const getCypressDetectedBrowsersForChooser: () => Promise<typeof AVAILABLE_BROWSERS>;
|
|
9
10
|
export default getCypressDetectedBrowsersForChooser;
|
|
@@ -14,33 +14,45 @@ const AVAILABLE_BROWSERS_1 = __importDefault(require("../constants/AVAILABLE_BRO
|
|
|
14
14
|
* `npx cypress info` reports (`- Name:` lines), plus Webkit (always shown
|
|
15
15
|
* because `cypress info` omits WebKit; https://github.com/cypress-io/cypress/issues/27304).
|
|
16
16
|
* @author Yuen Ler Chow
|
|
17
|
+
* @returns promise containing browsers to show in the chooser
|
|
17
18
|
*/
|
|
18
19
|
const getCypressDetectedBrowsersForChooser = () => {
|
|
19
|
-
var _a, _b;
|
|
20
20
|
const root = (0, getRootPath_1.default)();
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const detected = new Set();
|
|
23
|
+
let output = '';
|
|
24
|
+
const cypressInfo = (0, child_process_1.spawn)('npx', ['cypress', 'info'], {
|
|
25
|
+
cwd: root,
|
|
26
|
+
shell: true,
|
|
27
|
+
});
|
|
28
|
+
cypressInfo.stdout.on('data', (chunk) => {
|
|
29
|
+
output += chunk.toString();
|
|
30
|
+
});
|
|
31
|
+
cypressInfo.stderr.on('data', (chunk) => {
|
|
32
|
+
output += chunk.toString();
|
|
33
|
+
});
|
|
34
|
+
cypressInfo.on('error', () => {
|
|
35
|
+
console.warn('Could not detect installed browsers (cypress info failed).');
|
|
36
|
+
resolve([]);
|
|
37
|
+
});
|
|
38
|
+
cypressInfo.on('close', (code) => {
|
|
39
|
+
if (code !== 0) {
|
|
40
|
+
console.warn('Could not detect installed browsers (cypress info failed).');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
output.split('\n').forEach((line) => {
|
|
44
|
+
const match = line.match(/^\s*-\s*Name:\s*(\S+)/);
|
|
45
|
+
if (match) {
|
|
46
|
+
const [, name] = match;
|
|
47
|
+
detected.add(name.toLowerCase());
|
|
48
|
+
}
|
|
49
|
+
});
|
|
35
50
|
}
|
|
51
|
+
resolve(AVAILABLE_BROWSERS_1.default.filter((b) => {
|
|
52
|
+
// Always include Webkit in the chooser because "npx cypress info" omits WebKit
|
|
53
|
+
return b.name === 'webkit' || detected.has(b.name);
|
|
54
|
+
}));
|
|
36
55
|
});
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
console.warn('Could not detect installed browsers (cypress info failed).');
|
|
40
|
-
}
|
|
41
|
-
return AVAILABLE_BROWSERS_1.default.filter((b) => {
|
|
42
|
-
// Always include Webkit in the chooser because "npx cypress info" omits WebKit
|
|
43
|
-
return b.name === 'webkit' || detected.has(b.name);
|
|
44
56
|
});
|
|
45
57
|
};
|
|
46
58
|
exports.default = getCypressDetectedBrowsersForChooser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCypressDetectedBrowsersForChooser.js","sourceRoot":"","sources":["../../../start/helpers/getCypressDetectedBrowsersForChooser.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"getCypressDetectedBrowsersForChooser.js","sourceRoot":"","sources":["../../../start/helpers/getCypressDetectedBrowsersForChooser.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,iDAAsC;AAEtC,iBAAiB;AACjB,gEAAwC;AAExC,mBAAmB;AACnB,yFAAiE;AAEjE;;;;;;GAMG;AACH,MAAM,oCAAoC,GAAG,GAAuC,EAAE;IACpF,MAAM,IAAI,GAAG,IAAA,qBAAW,GAAE,CAAC;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;YACpD,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC3E,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAClD,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;wBACvB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CACL,4BAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9B,+EAA+E;gBAC/E,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,kBAAe,oCAAoC,CAAC"}
|
|
@@ -47,6 +47,56 @@ const annotateMochawesomeSuites = (node, label) => {
|
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* Rewrite screenshot paths so they resolve from the combined all-runs.html report.
|
|
52
|
+
* @author Yuen Ler Chow
|
|
53
|
+
* @param node Mochawesome report node, suite, test, or array of nodes
|
|
54
|
+
* @param comboFolderName folder name for the profile+browser run
|
|
55
|
+
*/
|
|
56
|
+
const rewriteScreenshotContextPaths = (node, comboFolderName) => {
|
|
57
|
+
if (!node || typeof node !== 'object') {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (Array.isArray(node)) {
|
|
61
|
+
node.forEach((child) => {
|
|
62
|
+
rewriteScreenshotContextPaths(child, comboFolderName);
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (typeof node.context === 'string') {
|
|
67
|
+
try {
|
|
68
|
+
const parsed = JSON.parse(node.context);
|
|
69
|
+
const contextItems = Array.isArray(parsed) ? parsed : [parsed];
|
|
70
|
+
let didRewrite = false;
|
|
71
|
+
contextItems.forEach((context) => {
|
|
72
|
+
if (typeof context !== 'string'
|
|
73
|
+
&& typeof context.value === 'string'
|
|
74
|
+
&& context.value.startsWith('../screenshots/')) {
|
|
75
|
+
// eslint-disable-next-line no-param-reassign
|
|
76
|
+
context.value = `${comboFolderName}/${context.value.replace(/^\.\.\//, '')}`;
|
|
77
|
+
didRewrite = true;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
if (didRewrite) {
|
|
81
|
+
// eslint-disable-next-line no-param-reassign
|
|
82
|
+
node.context = JSON.stringify(Array.isArray(parsed) ? contextItems : contextItems[0], null, 2);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (_a) {
|
|
86
|
+
// Ignore non-JSON contexts generated outside of ky.
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (Array.isArray(node.suites)) {
|
|
90
|
+
node.suites.forEach((suite) => {
|
|
91
|
+
rewriteScreenshotContextPaths(suite, comboFolderName);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (Array.isArray(node.tests)) {
|
|
95
|
+
node.tests.forEach((test) => {
|
|
96
|
+
rewriteScreenshotContextPaths(test, comboFolderName);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
50
100
|
/**
|
|
51
101
|
* Merge all per-combination mochawesome JSON reports into a single JSON
|
|
52
102
|
* and generate one combined HTML report for all runs.
|
|
@@ -68,11 +118,13 @@ const mergeAllReportsAndGenerateHtml = (outputDir, results) => {
|
|
|
68
118
|
const raw = fs_1.default.readFileSync(jsonPath, 'utf-8');
|
|
69
119
|
const data = JSON.parse(raw);
|
|
70
120
|
const label = `[${result.profileName}][${result.browser}] `;
|
|
121
|
+
const comboFolderName = `${result.profileName}-${result.browser}`;
|
|
71
122
|
if (Array.isArray(data.results)) {
|
|
72
123
|
data.results.forEach((res) => {
|
|
73
124
|
if (res && res.suites) {
|
|
74
125
|
annotateMochawesomeSuites(res.suites, label);
|
|
75
126
|
}
|
|
127
|
+
rewriteScreenshotContextPaths(res, comboFolderName);
|
|
76
128
|
});
|
|
77
129
|
}
|
|
78
130
|
// Annotate tests with their profile+browser
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeAllReportsAndGenerateHtml.js","sourceRoot":"","sources":["../../../start/helpers/mergeAllReportsAndGenerateHtml.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;AAE/B,cAAc;AACd,iDAAyC;AACzC,4CAAoB;AACpB,gDAAwB;AAExB,iBAAiB;AACjB,gEAAwC;AAGxC;;;;;;GAMG;AACH,MAAM,yBAAyB,GAAG,CAAC,IAAS,EAAE,KAAa,EAAQ,EAAE;IACnE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,sDAAsD;IACtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;YAC1B,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,gEAAgE;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxE,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,6CAA6C;YAC7C,IAAI,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACvC,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACvC,6CAA6C;YAC7C,IAAI,CAAC,SAAS,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;YACjC,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,8BAA8B,GAAG,CACrC,SAAiB,EACjB,OAAoB,EACd,EAAE;IACR,0EAA0E;IAC1E,MAAM,kBAAkB,GAAa,EAAE,CAAC;IAExC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACzB,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CACxB,SAAS,EACT,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,EACzC,kBAAkB,CACnB,CAAC;QACF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"mergeAllReportsAndGenerateHtml.js","sourceRoot":"","sources":["../../../start/helpers/mergeAllReportsAndGenerateHtml.ts"],"names":[],"mappings":"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"}
|
|
@@ -179,11 +179,20 @@
|
|
|
179
179
|
background: #115293;
|
|
180
180
|
border-color: #115293;
|
|
181
181
|
}
|
|
182
|
-
.screenshots-
|
|
182
|
+
.screenshots-details {
|
|
183
183
|
margin-top: 0.875rem;
|
|
184
|
+
border-top: 0.0625rem solid #e5e5e5;
|
|
185
|
+
padding-top: 0.75rem;
|
|
186
|
+
}
|
|
187
|
+
.screenshots-details summary {
|
|
188
|
+
cursor: pointer;
|
|
184
189
|
font-weight: 600;
|
|
190
|
+
color: #333;
|
|
191
|
+
list-style-position: inside;
|
|
185
192
|
}
|
|
186
193
|
.screenshot-list {
|
|
194
|
+
margin-top: 0.625rem;
|
|
195
|
+
margin-bottom: 0;
|
|
187
196
|
padding-left: 1.25rem;
|
|
188
197
|
padding-right: 0.5rem;
|
|
189
198
|
}
|
|
@@ -265,12 +274,14 @@
|
|
|
265
274
|
<p class="no-report">Report not available</p>
|
|
266
275
|
<% } %>
|
|
267
276
|
<% if (report.screenshots && report.screenshots.length > 0) { %>
|
|
268
|
-
<
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
277
|
+
<details class="screenshots-details">
|
|
278
|
+
<summary>Screenshots from failed tests (<%= report.screenshots.length %>)</summary>
|
|
279
|
+
<ul class="screenshot-list">
|
|
280
|
+
<% report.screenshots.forEach((screenshot) => { %>
|
|
281
|
+
<li><a href="<%= screenshot.href %>" target="_blank"><%= screenshot.name %></a></li>
|
|
282
|
+
<% }) %>
|
|
283
|
+
</ul>
|
|
284
|
+
</details>
|
|
274
285
|
<% } %>
|
|
275
286
|
</div>
|
|
276
287
|
<% }) %>
|
package/lib/start/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Checks
|
|
3
|
-
* asks user for missing selections, and launches Cypress
|
|
2
|
+
* Checks environment variables (for PROFILE, BROWSER, and HEADLESS),
|
|
3
|
+
* asks the user for missing selections, and launches Cypress
|
|
4
4
|
* @author Gardenia Liu
|
|
5
5
|
* @author Yuen Ler Chow
|
|
6
6
|
*/
|