@auxcode/auxta 1.3.119 → 1.3.120

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.
@@ -0,0 +1,14 @@
1
+ import puppeteer = require("puppeteer");
2
+ export type UserConsoleEntry = {
3
+ level: puppeteer.ConsoleMessageType;
4
+ text: string;
5
+ args: string[];
6
+ location?: {
7
+ url?: string;
8
+ lineNumber?: number;
9
+ columnNumber?: number;
10
+ };
11
+ pageUrl: string;
12
+ ts: number;
13
+ };
14
+ export declare function attachUserConsoleCapture(page: puppeteer.Page, push: (e: UserConsoleEntry) => void): void;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.attachUserConsoleCapture = attachUserConsoleCapture;
13
+ function safeStringify(v) {
14
+ if (typeof v === "string")
15
+ return v;
16
+ try {
17
+ return JSON.stringify(v);
18
+ }
19
+ catch (_a) {
20
+ return String(v);
21
+ }
22
+ }
23
+ function attachUserConsoleCapture(page, push) {
24
+ page.on("console", (msg) => __awaiter(this, void 0, void 0, function* () {
25
+ const level = msg.type();
26
+ if (!["debug", "log", "info", "warning", "error"].includes(level))
27
+ return;
28
+ const loc = typeof msg.location === "function" ? msg.location() : undefined;
29
+ const args = [];
30
+ try {
31
+ const handles = msg.args();
32
+ for (let i = 0; i < Math.min(handles.length, 5); i++) {
33
+ try {
34
+ const val = yield handles[i].jsonValue();
35
+ args.push(safeStringify(val));
36
+ }
37
+ catch (_a) {
38
+ try {
39
+ const s = yield handles[i].evaluate((x) => Object.prototype.toString.call(x));
40
+ args.push(String(s));
41
+ }
42
+ catch (_b) {
43
+ args.push(String(handles[i]));
44
+ }
45
+ }
46
+ }
47
+ }
48
+ catch (_c) { }
49
+ push({
50
+ level: level,
51
+ text: msg.text(),
52
+ args,
53
+ location: loc,
54
+ pageUrl: page.url(),
55
+ ts: Date.now(),
56
+ });
57
+ }));
58
+ }
@@ -8,6 +8,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
11
22
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
23
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
24
  };
@@ -21,12 +32,22 @@ const start_suite_helper_1 = require("../utilities/start-suite.helper");
21
32
  const status_of_step_1 = require("../enums/status-of.step");
22
33
  function onTestEnd(body, featureName, scenarioName, statusCode, screenshotBuffer, errMessage) {
23
34
  return __awaiter(this, void 0, void 0, function* () {
35
+ var _a, _b;
24
36
  let isFinal = false;
25
37
  if (process.env.ENVIRONMENT == "LIVE") {
26
38
  console.log('--- Uploading scenario and feature for AUXTA report ---');
27
39
  const stepsArr = log_service_1.default.returnScenarioReport();
28
40
  try {
29
- const stepRes = yield (0, report_service_1.uploadStep)(stepsArr, scenarioName, screenshotBuffer, errMessage);
41
+ const _c = errMessage || {}, { debugCandidate = [] } = _c, restErrors = __rest(_c, ["debugCandidate"]);
42
+ let errorPayload = restErrors;
43
+ const failed = statusCode !== 200;
44
+ const hasScreenshot = !!(screenshotBuffer &&
45
+ ((typeof Buffer !== 'undefined' && ((_b = (_a = Buffer).isBuffer) === null || _b === void 0 ? void 0 : _b.call(_a, screenshotBuffer)) && screenshotBuffer.length > 0) ||
46
+ (typeof screenshotBuffer.byteLength === 'number' && screenshotBuffer.byteLength > 0)));
47
+ if (failed && hasScreenshot && Array.isArray(debugCandidate) && debugCandidate.length) {
48
+ errorPayload = Object.assign(Object.assign({}, restErrors), { debug: debugCandidate });
49
+ }
50
+ const stepRes = yield (0, report_service_1.uploadStep)(stepsArr, scenarioName, screenshotBuffer, errorPayload);
30
51
  const scenarioRes = yield (0, report_service_1.uploadScenario)(stepRes, featureName, (0, path_1.basename)(__filename), (statusCode != 200));
31
52
  const scenario = {
32
53
  scenarioId: scenarioRes.scenarioRef,
@@ -31,7 +31,7 @@ function captureScreenshot() {
31
31
  while (count <= RETRY_NUMBERS) {
32
32
  try {
33
33
  const lastPage = pages[pages.length - 1] || puppeteer_1.default.defaultPage;
34
- log_service_1.default.push('When', log_service_1.default.tag, `Just before retry ${count}. Pages: ${pages.length}`, status_of_step_1.default.PASSED);
34
+ log_service_1.default.push('When', log_service_1.default.tag, `Just before retry ${count}. Pages: ${pages.length}. Is last page closed?: ${lastPage.isClosed()}`, status_of_step_1.default.PASSED);
35
35
  const screenshotBuffer = yield lastPage.screenshot({
36
36
  captureBeyondViewport: false,
37
37
  encoding: 'binary'
@@ -3,6 +3,7 @@ import puppeteer = require("puppeteer");
3
3
  export declare class Puppeteer {
4
4
  defaultPage: puppeteer.Page;
5
5
  private browser;
6
+ private userConsoleMessages;
6
7
  private static setupHeader;
7
8
  startBrowser(): Promise<void>;
8
9
  close(): Promise<void>;
@@ -21,7 +21,11 @@ const status_of_step_1 = require("../auxta/enums/status-of.step");
21
21
  const config_1 = require("../auxta/configs/config");
22
22
  const start_suite_helper_1 = require("../auxta/utilities/start-suite.helper");
23
23
  const puppeteer = require("puppeteer");
24
+ const console_debug_helper_1 = require("../auxta/helpers/console-debug.helper");
24
25
  class Puppeteer {
26
+ constructor() {
27
+ this.userConsoleMessages = [];
28
+ }
25
29
  static setupHeader(event, uploadModel) {
26
30
  let close = true;
27
31
  if (process.env.ENVIRONMENT !== 'LOCAL' && event) {
@@ -82,10 +86,50 @@ class Puppeteer {
82
86
  initiateBrowser(consoleMessage, httpsMessage) {
83
87
  return __awaiter(this, void 0, void 0, function* () {
84
88
  yield this.startBrowser();
85
- this.defaultPage.on('console', (message) => consoleMessage.push(`${message.type().substr(0, 3).toUpperCase()} ${message.text()}`))
89
+ this.browser.on('targetcreated', (target) => __awaiter(this, void 0, void 0, function* () {
90
+ try {
91
+ if (target.type() !== 'page')
92
+ return;
93
+ const page = yield target.page();
94
+ if (!page)
95
+ return;
96
+ (0, console_debug_helper_1.attachUserConsoleCapture)(page, (entry) => {
97
+ this.userConsoleMessages.push(entry);
98
+ if (this.userConsoleMessages.length > 300)
99
+ this.userConsoleMessages.shift();
100
+ });
101
+ }
102
+ catch (_a) { }
103
+ }));
104
+ this.defaultPage.on('console', (msg) => {
105
+ var _a;
106
+ const t = typeof msg.type === 'function' ? msg.type() : (msg.type || '');
107
+ if (t !== 'error')
108
+ return;
109
+ let loc = '';
110
+ try {
111
+ const l = typeof msg.location === 'function' ? msg.location() : undefined;
112
+ if (l) {
113
+ const at = `${l.url || ''}` +
114
+ `${l.lineNumber != null ? ':' + l.lineNumber : ''}` +
115
+ `${l.columnNumber != null ? ':' + l.columnNumber : ''}`;
116
+ loc = at ? ` @ ${at}` : '';
117
+ }
118
+ }
119
+ catch (_b) { }
120
+ const text = typeof msg.text === 'function' ? msg.text() : String((_a = msg.text) !== null && _a !== void 0 ? _a : '');
121
+ if (text === 'pages' || /^\d+$/.test(text))
122
+ return;
123
+ consoleMessage.push(`${String(t).toUpperCase()} ${text}${loc}`);
124
+ })
86
125
  .on('pageerror', ({ message }) => consoleMessage.push(message))
87
126
  .on('response', (response) => httpsMessage.push(`${response.status()} ${response.url()}`))
88
127
  .on('requestfailed', (request) => { var _a; return httpsMessage.push(`${request.failure() !== null ? (_a = request.failure()) === null || _a === void 0 ? void 0 : _a.errorText : ""} ${request.url()}`); });
128
+ (0, console_debug_helper_1.attachUserConsoleCapture)(this.defaultPage, (entry) => {
129
+ this.userConsoleMessages.push(entry);
130
+ if (this.userConsoleMessages.length > 300)
131
+ this.userConsoleMessages.shift();
132
+ });
89
133
  });
90
134
  }
91
135
  logFail(consoleMessage) {
@@ -150,17 +194,20 @@ class Puppeteer {
150
194
  let url = this.defaultPage.url();
151
195
  if (close)
152
196
  yield this.close();
197
+ const debugCandidate = this.userConsoleMessages.slice(-150);
153
198
  return yield (0, report_hook_1.onTestEnd)(uploadModel, featureName, scenarioName, statusCode, screenshotBuffer, !errMessage ? undefined : {
154
199
  currentPageUrl: url,
155
200
  console: consoleMessage,
156
201
  https: httpsMessage,
157
- error: errMessage
202
+ error: errMessage,
203
+ debugCandidate
158
204
  });
159
205
  }
160
206
  catch (e) {
161
207
  console.log("Lib error:", e);
162
208
  }
163
209
  finally {
210
+ this.userConsoleMessages = [];
164
211
  log_service_1.default.clear();
165
212
  }
166
213
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@auxcode/auxta",
3
- "version": "1.3.119",
3
+ "version": "1.3.120",
4
4
  "description": "",
5
5
  "main": "./build/AuxTA.js",
6
6
  "types": "./build/AuxTA.d.ts",