@auxcode/auxta 1.3.9 → 1.3.11-beta.0

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.
Files changed (72) hide show
  1. package/README.md +60 -60
  2. package/build/cjs/AuxTA.d.ts +42 -0
  3. package/build/cjs/AuxTA.js +148 -0
  4. package/build/cjs/auxta/configs/config.d.ts +51 -0
  5. package/build/cjs/auxta/configs/config.js +66 -0
  6. package/build/cjs/auxta/enums/status-of.step.d.ts +7 -0
  7. package/build/cjs/auxta/enums/status-of.step.js +11 -0
  8. package/build/cjs/auxta/helpers/response.helper.d.ts +10 -0
  9. package/build/cjs/auxta/helpers/response.helper.js +15 -0
  10. package/build/cjs/auxta/helpers/start.helper.d.ts +1 -0
  11. package/build/cjs/auxta/helpers/start.helper.js +26 -0
  12. package/build/cjs/auxta/hooks/report.hook.d.ts +4 -0
  13. package/build/cjs/auxta/hooks/report.hook.js +66 -0
  14. package/build/cjs/auxta/models/upload.model.d.ts +32 -0
  15. package/build/cjs/auxta/models/upload.model.js +75 -0
  16. package/build/cjs/auxta/services/log.service.d.ts +26 -0
  17. package/build/cjs/auxta/services/log.service.js +47 -0
  18. package/build/cjs/auxta/services/report.service.d.ts +36 -0
  19. package/build/cjs/auxta/services/report.service.js +164 -0
  20. package/build/cjs/auxta/services/runtime.service.d.ts +16 -0
  21. package/build/cjs/auxta/services/runtime.service.js +41 -0
  22. package/build/cjs/auxta/utilities/runtime.helper.d.ts +15 -0
  23. package/build/cjs/auxta/utilities/runtime.helper.js +19 -0
  24. package/build/cjs/auxta/utilities/screenshot.helper.d.ts +2 -0
  25. package/build/cjs/auxta/utilities/screenshot.helper.js +36 -0
  26. package/build/cjs/auxta/utilities/start-suite.helper.d.ts +12 -0
  27. package/build/cjs/auxta/utilities/start-suite.helper.js +31 -0
  28. package/build/cjs/macros/helpers/Aux2faAuth.d.ts +7 -0
  29. package/build/cjs/macros/helpers/Aux2faAuth.js +29 -0
  30. package/build/cjs/macros/helpers/code.helper.d.ts +21 -0
  31. package/build/cjs/macros/helpers/code.helper.js +192 -0
  32. package/build/cjs/macros/helpers/extend-default-page.d.ts +6 -0
  33. package/build/cjs/macros/helpers/extend-default-page.js +88 -0
  34. package/build/cjs/puppeteer/puppeteer.d.ts +15 -0
  35. package/build/cjs/puppeteer/puppeteer.js +200 -0
  36. package/build/esm/AuxTA.d.ts +42 -0
  37. package/build/esm/AuxTA.js +119 -0
  38. package/build/esm/auxta/configs/config.d.ts +51 -0
  39. package/build/esm/auxta/configs/config.js +61 -0
  40. package/build/esm/auxta/enums/status-of.step.d.ts +7 -0
  41. package/build/esm/auxta/enums/status-of.step.js +8 -0
  42. package/build/esm/auxta/helpers/response.helper.d.ts +10 -0
  43. package/build/esm/auxta/helpers/response.helper.js +11 -0
  44. package/build/esm/auxta/helpers/start.helper.d.ts +1 -0
  45. package/build/esm/auxta/helpers/start.helper.js +24 -0
  46. package/build/esm/auxta/hooks/report.hook.d.ts +4 -0
  47. package/build/esm/auxta/hooks/report.hook.js +58 -0
  48. package/build/esm/auxta/models/upload.model.d.ts +32 -0
  49. package/build/esm/auxta/models/upload.model.js +71 -0
  50. package/build/esm/auxta/services/log.service.d.ts +26 -0
  51. package/build/esm/auxta/services/log.service.js +43 -0
  52. package/build/esm/auxta/services/report.service.d.ts +36 -0
  53. package/build/esm/auxta/services/report.service.js +150 -0
  54. package/build/esm/auxta/services/runtime.service.d.ts +16 -0
  55. package/build/esm/auxta/services/runtime.service.js +37 -0
  56. package/build/esm/auxta/utilities/runtime.helper.d.ts +15 -0
  57. package/build/esm/auxta/utilities/runtime.helper.js +15 -0
  58. package/build/esm/auxta/utilities/screenshot.helper.d.ts +2 -0
  59. package/build/esm/auxta/utilities/screenshot.helper.js +29 -0
  60. package/build/esm/auxta/utilities/start-suite.helper.d.ts +12 -0
  61. package/build/esm/auxta/utilities/start-suite.helper.js +26 -0
  62. package/build/esm/macros/helpers/Aux2faAuth.d.ts +7 -0
  63. package/build/esm/macros/helpers/Aux2faAuth.js +25 -0
  64. package/build/esm/macros/helpers/code.helper.d.ts +21 -0
  65. package/build/esm/macros/helpers/code.helper.js +185 -0
  66. package/build/esm/macros/helpers/extend-default-page.d.ts +6 -0
  67. package/build/esm/macros/helpers/extend-default-page.js +81 -0
  68. package/build/esm/puppeteer/puppeteer.d.ts +15 -0
  69. package/build/esm/puppeteer/puppeteer.js +192 -0
  70. package/build/tsconfig-cjs.tsbuildinfo +1 -0
  71. package/build/tsconfig.tsbuildinfo +1 -0
  72. package/package.json +29 -29
@@ -0,0 +1,15 @@
1
+ import { RunTime } from "../services/runtime.service";
2
+ export declare class CalculateRuntime {
3
+ private runtime;
4
+ startTimeSeconds: string;
5
+ startTimeMinutes: string;
6
+ startTimeHours: string;
7
+ startTimeDay: string;
8
+ startTimeMonth: string;
9
+ endTimeSeconds: string;
10
+ endTimeMinutes: string;
11
+ endTimeHours: string;
12
+ endTimeDay: string;
13
+ endTimeMonth: string;
14
+ constructor(r: RunTime);
15
+ }
@@ -0,0 +1,15 @@
1
+ export class CalculateRuntime {
2
+ constructor(r) {
3
+ this.runtime = r;
4
+ this.startTimeSeconds = (this.runtime.startTime.getSeconds() < 10) ? `0${this.runtime.startTime.getSeconds()}` : `${this.runtime.startTime.getSeconds()}`;
5
+ this.startTimeMinutes = (this.runtime.startTime.getMinutes() < 10) ? `0${this.runtime.startTime.getMinutes()}` : `${this.runtime.startTime.getMinutes()}`;
6
+ this.startTimeHours = (this.runtime.startTime.getHours() < 10) ? `0${this.runtime.startTime.getHours()}` : `${this.runtime.startTime.getHours()}`;
7
+ this.startTimeDay = (this.runtime.startTime.getDate() < 10) ? `0${this.runtime.startTime.getDate()}` : `${this.runtime.startTime.getDate()}`;
8
+ this.startTimeMonth = (this.runtime.startTime.getMonth() + 1 < 10) ? `0${this.runtime.startTime.getMonth() + 1}` : `${this.runtime.startTime.getMonth() + 1}`;
9
+ this.endTimeSeconds = (this.runtime.endTime.getSeconds() < 10) ? `0${this.runtime.endTime.getSeconds()}` : `${this.runtime.endTime.getSeconds()}`;
10
+ this.endTimeMinutes = (this.runtime.endTime.getMinutes() < 10) ? `0${this.runtime.endTime.getMinutes()}` : `${this.runtime.endTime.getMinutes()}`;
11
+ this.endTimeHours = (this.runtime.endTime.getHours() < 10) ? `0${this.runtime.endTime.getHours()}` : `${this.runtime.endTime.getHours()}`;
12
+ this.endTimeDay = (this.runtime.endTime.getDate() < 10) ? `0${this.runtime.endTime.getDate()}` : `${this.runtime.endTime.getDate()}`;
13
+ this.endTimeMonth = (this.runtime.endTime.getMonth() + 1 < 10) ? `0${this.runtime.endTime.getMonth() + 1}` : `${this.runtime.endTime.getMonth() + 1}`;
14
+ }
15
+ }
@@ -0,0 +1,2 @@
1
+ /// <reference types="node" />
2
+ export declare function captureScreenshot(): Promise<Buffer | undefined>;
@@ -0,0 +1,29 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import puppeteer from "../../puppeteer/puppeteer";
11
+ export function captureScreenshot() {
12
+ return __awaiter(this, void 0, void 0, function* () {
13
+ try {
14
+ const pages = yield puppeteer.defaultPage.browser().pages();
15
+ if (!pages.length)
16
+ return undefined;
17
+ const lastPage = pages[pages.length - 1] || puppeteer.defaultPage;
18
+ const screenshotBuffer = yield lastPage.screenshot({
19
+ fullPage: true,
20
+ encoding: 'binary'
21
+ });
22
+ if (Buffer.isBuffer(screenshotBuffer))
23
+ return screenshotBuffer;
24
+ }
25
+ catch (e) {
26
+ }
27
+ return undefined;
28
+ });
29
+ }
@@ -0,0 +1,12 @@
1
+ export declare function startSuite(suites: string[], reportId?: string): Promise<{
2
+ nextSuites: string[];
3
+ reportId: string | undefined;
4
+ currentSuite: string | undefined;
5
+ retries: string;
6
+ } | undefined>;
7
+ export declare function retrySuite(suites: string[], reportId: string, currentSuite: string, retries: number): Promise<false | {
8
+ nextSuites: string[];
9
+ reportId: string;
10
+ currentSuite: string;
11
+ retries: number;
12
+ }>;
@@ -0,0 +1,26 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ export function startSuite(suites, reportId) {
11
+ return __awaiter(this, void 0, void 0, function* () {
12
+ if (suites.length === 0)
13
+ return;
14
+ const next = suites.shift();
15
+ return { nextSuites: suites, reportId: reportId, currentSuite: next, retries: "0" };
16
+ });
17
+ }
18
+ export function retrySuite(suites, reportId, currentSuite, retries) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ console.log('I repeat again the current suite: ' + currentSuite);
21
+ if (retries >= 2) {
22
+ return false;
23
+ }
24
+ return { nextSuites: suites, reportId: reportId, currentSuite: currentSuite, retries: retries };
25
+ });
26
+ }
@@ -0,0 +1,7 @@
1
+ export declare class Aux2faAuth {
2
+ authenticator(): any;
3
+ verifyToken(token: string): boolean;
4
+ private getSecret;
5
+ }
6
+ declare const _default: Aux2faAuth;
7
+ export default _default;
@@ -0,0 +1,25 @@
1
+ const twofactor = require("node-2fa");
2
+ export class Aux2faAuth {
3
+ authenticator() {
4
+ const aux2fe_secret = this.getSecret();
5
+ return twofactor.generateToken(aux2fe_secret).token;
6
+ }
7
+ verifyToken(token) {
8
+ const aux2fe_secret = this.getSecret();
9
+ const result = twofactor.verifyToken(aux2fe_secret, token);
10
+ if (result != null) {
11
+ if (result.delta == 0) {
12
+ return true;
13
+ }
14
+ }
15
+ return false;
16
+ }
17
+ getSecret() {
18
+ const aux2fe_secret = process.env.aux2fe_secret;
19
+ if (!aux2fe_secret) {
20
+ throw new Error('No 2fe secret set');
21
+ }
22
+ return aux2fe_secret;
23
+ }
24
+ }
25
+ export default new Aux2faAuth();
@@ -0,0 +1,21 @@
1
+ import { StatusOfStep } from "../../auxta/enums/status-of.step";
2
+ import { ExtendDefaultPage } from "./extend-default-page";
3
+ export declare class FunctionHelper extends ExtendDefaultPage {
4
+ log(keyword: string, name: string, status: StatusOfStep): void;
5
+ suggest(name: string): void;
6
+ private getEscapedText;
7
+ clickByText(selector: string, text: string, dotOrText?: string, page?: import("puppeteer").Page, time?: number, log_message?: boolean): Promise<void>;
8
+ clickByTextWithClass(class_selector: string, class_name: string, selector: string, text: string, dotOrText?: string, page?: import("puppeteer").Page): Promise<void>;
9
+ waitForSelectorWithText(selector: string, text: string, dotOrText?: string, page?: import("puppeteer").Page): Promise<boolean>;
10
+ timeout(timeout?: number, page?: import("puppeteer").Page): Promise<void>;
11
+ waitForSelector(option: string, selector: string, time?: number, page?: import("puppeteer").Page, log_message?: boolean): Promise<void>;
12
+ urlContains(selector: string, page?: import("puppeteer").Page): Promise<void>;
13
+ pressEnter(page?: import("puppeteer").Page): Promise<void>;
14
+ emulate(phone_name: string, page?: import("puppeteer").Page): Promise<void>;
15
+ restartBrowser(): Promise<void>;
16
+ clickAndWaitForPageToBeCreated(selector: string, page?: import("puppeteer").Page): Promise<void>;
17
+ closeLastPage(page?: import("puppeteer").Page): Promise<void>;
18
+ microsoftLogin(button: string, email: string, password: string): Promise<void>;
19
+ }
20
+ declare const _default: FunctionHelper;
21
+ export default _default;
@@ -0,0 +1,185 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import log from "../../auxta/services/log.service";
11
+ import puppeteer from "../../puppeteer/puppeteer";
12
+ import { StatusOfStep } from "../../auxta/enums/status-of.step";
13
+ import { StepStatus } from "../../AuxTA";
14
+ import { ExtendDefaultPage } from "./extend-default-page";
15
+ import { KnownDevices } from "puppeteer";
16
+ export class FunctionHelper extends ExtendDefaultPage {
17
+ log(keyword, name, status) {
18
+ log.push(keyword, name, status);
19
+ }
20
+ suggest(name) {
21
+ log.addSuggestion(name);
22
+ }
23
+ getEscapedText(text) {
24
+ const splitedQuotes = text.replace(/'/g, `', "'", '`);
25
+ return `concat('${splitedQuotes}', '')`;
26
+ }
27
+ clickByText(selector, text, dotOrText = '.', page = puppeteer.defaultPage, time = this.defaultTimeout, log_message = true) {
28
+ return __awaiter(this, void 0, void 0, function* () {
29
+ const message = `I clicked on the '${text}' '${selector}'`;
30
+ try {
31
+ const [linkHandlers] = yield page.$x(`//${selector}[contains(${dotOrText},"${text}")]`);
32
+ if (linkHandlers) {
33
+ yield linkHandlers.click();
34
+ log.push('Then', message, StatusOfStep.PASSED);
35
+ }
36
+ }
37
+ catch (e) {
38
+ if (log_message) {
39
+ log.push('And', `${message}, but it didn't appear in ${time / 1000} seconds.`, StatusOfStep.FAILED);
40
+ }
41
+ throw new Error(message);
42
+ }
43
+ if (log_message) {
44
+ log.push('And', message, StatusOfStep.PASSED);
45
+ }
46
+ });
47
+ }
48
+ clickByTextWithClass(class_selector, class_name, selector, text, dotOrText = '.', page = puppeteer.defaultPage) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ const message = `I click on the '${text}' '${selector}'`;
51
+ try {
52
+ const [linkHandlers] = yield page.$x(`//${class_selector}[contains(@class,${this.getEscapedText(class_name)})]//${selector}[contains(${dotOrText},"${text}")]`);
53
+ if (linkHandlers) {
54
+ yield linkHandlers.click();
55
+ log.push('Then', message, StatusOfStep.PASSED);
56
+ return;
57
+ }
58
+ }
59
+ catch (e) {
60
+ }
61
+ log.push('Then', message, StatusOfStep.FAILED);
62
+ throw new Error(message);
63
+ });
64
+ }
65
+ waitForSelectorWithText(selector, text, dotOrText = '.', page = puppeteer.defaultPage) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const message = `I check for '${text}' on the current page`;
68
+ try {
69
+ yield page.waitForSelector(selector, {
70
+ timeout: this.defaultTimeout
71
+ });
72
+ const linkHandlers = yield page.$x(`//${selector}[contains(${dotOrText},"${text}")]`);
73
+ if (linkHandlers.length > 0) {
74
+ log.push('And', message, StatusOfStep.PASSED);
75
+ return true;
76
+ }
77
+ }
78
+ catch (e) {
79
+ }
80
+ log.push('And', message, StatusOfStep.FAILED);
81
+ throw new Error(message);
82
+ });
83
+ }
84
+ timeout(timeout = this.defaultTimeout, page = puppeteer.defaultPage) {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ yield page.waitForTimeout(timeout);
87
+ });
88
+ }
89
+ waitForSelector(option, selector, time = this.defaultTimeout, page = puppeteer.defaultPage, log_message = true) {
90
+ return __awaiter(this, void 0, void 0, function* () {
91
+ const message = `I checked for the '${selector}' element to be ${option}`;
92
+ try {
93
+ yield page.waitForSelector(selector, {
94
+ [option]: true,
95
+ timeout: time
96
+ });
97
+ }
98
+ catch (e) {
99
+ if (log_message) {
100
+ log.push('And', `${message}, but it didn't appear in ${time / 1000} seconds.`, StatusOfStep.FAILED);
101
+ }
102
+ throw new Error(message);
103
+ }
104
+ if (log_message) {
105
+ log.push('And', message, StatusOfStep.PASSED);
106
+ }
107
+ });
108
+ }
109
+ urlContains(selector, page = puppeteer.defaultPage) {
110
+ return __awaiter(this, void 0, void 0, function* () {
111
+ const url = page.url();
112
+ let message = `I am on the ${selector} page`;
113
+ if (!url.includes(selector)) {
114
+ log.push('And', message, StatusOfStep.FAILED);
115
+ throw new Error(message);
116
+ }
117
+ log.push('And', message, StatusOfStep.PASSED);
118
+ });
119
+ }
120
+ pressEnter(page = puppeteer.defaultPage) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ yield page.keyboard.press('Enter');
123
+ });
124
+ }
125
+ emulate(phone_name, page = puppeteer.defaultPage) {
126
+ return __awaiter(this, void 0, void 0, function* () {
127
+ const phone = KnownDevices[phone_name];
128
+ yield page.emulate(phone);
129
+ });
130
+ }
131
+ restartBrowser() {
132
+ return __awaiter(this, void 0, void 0, function* () {
133
+ yield puppeteer.close();
134
+ yield puppeteer.startBrowser();
135
+ });
136
+ }
137
+ clickAndWaitForPageToBeCreated(selector, page = puppeteer.defaultPage) {
138
+ return __awaiter(this, void 0, void 0, function* () {
139
+ const nav = new Promise(res => page.browser().on('targetcreated', res));
140
+ yield page.click(selector);
141
+ yield nav;
142
+ });
143
+ }
144
+ closeLastPage(page = puppeteer.defaultPage) {
145
+ return __awaiter(this, void 0, void 0, function* () {
146
+ const pages = yield page.browser().pages();
147
+ yield pages[pages.length - 1].close();
148
+ });
149
+ }
150
+ microsoftLogin(button, email, password) {
151
+ var _a;
152
+ return __awaiter(this, void 0, void 0, function* () {
153
+ const email_input = 'input[type="email"]';
154
+ const password_input = 'input[type="password"]';
155
+ const next_button = 'input[value="Next"]';
156
+ const sign_in_button = 'input[value="Sign in"]';
157
+ const no_button = 'input.ext-secondary';
158
+ yield this.clickAndWaitForPageToBeCreated(button);
159
+ const pages = yield puppeteer.defaultPage.browser().pages();
160
+ const loginPage = pages[pages.length - 1];
161
+ yield this.extend_page_functions(loginPage);
162
+ yield loginPage.waitForNetworkIdle();
163
+ yield this.waitForSelector('visible', next_button, 60000, loginPage);
164
+ yield loginPage.type(email_input, email);
165
+ yield loginPage.keyboard.press('Enter');
166
+ yield loginPage.waitForNetworkIdle();
167
+ yield this.waitForSelector('visible', sign_in_button, 60000, loginPage);
168
+ yield this.waitForSelector('visible', password_input, 6000, loginPage);
169
+ try {
170
+ (_a = (yield loginPage.$(password_input))) === null || _a === void 0 ? void 0 : _a.type(password);
171
+ yield this.log('Then', `I type password into the ${password_input}`, StepStatus.PASSED);
172
+ }
173
+ catch (e) {
174
+ yield this.log('Then', `I type password into the ${password_input}`, StepStatus.FAILED);
175
+ throw new Error(`I type password into the ${password_input}`);
176
+ }
177
+ yield this.timeout(3000);
178
+ yield loginPage.keyboard.press('Enter');
179
+ yield this.waitForSelector('visible', no_button, 60000, loginPage);
180
+ yield loginPage.keyboard.press('Enter');
181
+ yield loginPage.waitForNetworkIdle();
182
+ });
183
+ }
184
+ }
185
+ export default new FunctionHelper();
@@ -0,0 +1,6 @@
1
+ export declare class ExtendDefaultPage {
2
+ readonly defaultTimeout: number;
3
+ extend_page_functions(page: any, time?: number): Promise<any>;
4
+ }
5
+ declare const _default: ExtendDefaultPage;
6
+ export default _default;
@@ -0,0 +1,81 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import log from "../../auxta/services/log.service";
11
+ import { StatusOfStep } from "../../auxta/enums/status-of.step";
12
+ import { config } from "../../auxta/configs/config";
13
+ export class ExtendDefaultPage {
14
+ constructor() {
15
+ this.defaultTimeout = config.timeout;
16
+ }
17
+ extend_page_functions(page, time = this.defaultTimeout) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ const { goto: original_goto, click: original_click, type: original_type, waitForNetworkIdle: original_waitForNetworkIdle } = page;
20
+ page.goto = function goto(url, options) {
21
+ log.push('Then', `I go to the '${url}' page`, StatusOfStep.PASSED);
22
+ return original_goto.apply(page, arguments);
23
+ };
24
+ page.click = function click(selector, options) {
25
+ return __awaiter(this, arguments, void 0, function* () {
26
+ try {
27
+ yield page.waitForSelector(selector, {
28
+ timeout: time
29
+ });
30
+ let elementName = yield page.$eval(selector, (e) => e.textContent);
31
+ if (!elementName || elementName === ' ')
32
+ elementName = selector;
33
+ yield original_click.apply(page, arguments);
34
+ log.push('Then', `I click on the '${elementName}'`, StatusOfStep.PASSED);
35
+ }
36
+ catch (e) {
37
+ const msg = `I click on the '${selector}'`;
38
+ log.push('Then', msg, StatusOfStep.FAILED);
39
+ throw new Error(msg);
40
+ }
41
+ });
42
+ };
43
+ page.waitForNetworkIdle = function waitForNetworkIdle(selector, option) {
44
+ return __awaiter(this, arguments, void 0, function* () {
45
+ let message = 'I wait for the page to load';
46
+ let result;
47
+ try {
48
+ result = yield original_waitForNetworkIdle.apply(page, arguments);
49
+ log.push('Then', message, StatusOfStep.PASSED);
50
+ }
51
+ catch (e) {
52
+ log.push('Then', message, StatusOfStep.FAILED);
53
+ throw new Error(message);
54
+ }
55
+ return result;
56
+ });
57
+ };
58
+ page.type = function type(field, value) {
59
+ return __awaiter(this, arguments, void 0, function* () {
60
+ try {
61
+ yield page.waitForSelector(field, {
62
+ timeout: time
63
+ });
64
+ yield original_type.apply(page, arguments);
65
+ let elementName = yield page.$eval(field, (e) => e.textContent);
66
+ if (!elementName || elementName === ' ')
67
+ elementName = field;
68
+ log.push('Then', `I type '${value}' into the '${elementName}' field`, StatusOfStep.PASSED);
69
+ }
70
+ catch (e) {
71
+ const msg = `I type '${value}' into the '${field}' field`;
72
+ log.push('Then', msg, StatusOfStep.FAILED);
73
+ throw new Error(msg);
74
+ }
75
+ });
76
+ };
77
+ return page;
78
+ });
79
+ }
80
+ }
81
+ export default new ExtendDefaultPage();
@@ -0,0 +1,15 @@
1
+ import { UploadModel } from "../auxta/models/upload.model";
2
+ import puppeteer = require("puppeteer");
3
+ export declare class Puppeteer {
4
+ defaultPage: puppeteer.Page;
5
+ private browser;
6
+ startBrowser(): Promise<void>;
7
+ close(): Promise<void>;
8
+ run(event: any, callback: any, featureName?: string, scenarioName?: string, uploadModel?: UploadModel): Promise<{
9
+ statusCode: number;
10
+ } | undefined>;
11
+ runRPA(event: any, callback: any, uploadModel?: UploadModel, close?: boolean): Promise<any>;
12
+ private static setupHeader;
13
+ }
14
+ declare const _default: Puppeteer;
15
+ export default _default;
@@ -0,0 +1,192 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import log from "../auxta/services/log.service";
11
+ import { captureScreenshot } from "../auxta/utilities/screenshot.helper";
12
+ import { onTestEnd } from "../auxta/hooks/report.hook";
13
+ import auxta from "../AuxTA";
14
+ import { StatusOfStep } from "../auxta/enums/status-of.step";
15
+ import { config } from "../auxta/configs/config";
16
+ import { retrySuite } from "../auxta/utilities/start-suite.helper";
17
+ import { postNotificationsOnFail } from "../auxta/services/report.service";
18
+ export class Puppeteer {
19
+ startBrowser() {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ let args = [
22
+ '--start-maximized',
23
+ '--no-sandbox',
24
+ '--disable-setuid-sandbox',
25
+ '--disable-dev-shm-usage',
26
+ '--single-process',
27
+ ];
28
+ if (process.env.ENVIRONMENT != 'LOCAL')
29
+ args.push(`--window-size=${config.screenWidth},${config.screenHeight}`);
30
+ this.browser = yield puppeteer.launch({
31
+ executablePath: puppeteer.executablePath(),
32
+ args,
33
+ ignoreDefaultArgs: ["--enable-automation"],
34
+ defaultViewport: process.env.ENVIRONMENT === 'LOCAL' ? null : {
35
+ width: config.screenWidth,
36
+ height: config.screenHeight
37
+ },
38
+ headless: process.env.ENVIRONMENT === 'LOCAL' ? process.env.HEADLESS === 'true' : true
39
+ });
40
+ this.defaultPage = (yield this.browser.pages())[0];
41
+ yield auxta.extend_page_functions(this.defaultPage);
42
+ yield this.defaultPage.goto(config.baseURL, { waitUntil: 'networkidle0' });
43
+ yield this.defaultPage.waitForNetworkIdle();
44
+ });
45
+ }
46
+ close() {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ if (this.browser) {
49
+ let pages = yield this.browser.pages();
50
+ yield Promise.all(pages.map((page) => page.close()));
51
+ yield this.browser.close();
52
+ }
53
+ });
54
+ }
55
+ run(event, callback, featureName = 'Test feature', scenarioName = 'Test scenario', uploadModel) {
56
+ return __awaiter(this, void 0, void 0, function* () {
57
+ let close;
58
+ try {
59
+ if (uploadModel === undefined) {
60
+ uploadModel = auxta.getUploadModel();
61
+ uploadModel.featureName = featureName;
62
+ uploadModel.scenarioName = scenarioName;
63
+ }
64
+ if (event.close === undefined)
65
+ close = Puppeteer.setupHeader(event, uploadModel);
66
+ let screenshotBuffer;
67
+ let errMessage;
68
+ let statusCode = 200;
69
+ let consoleStack = [];
70
+ try {
71
+ yield log.push('When', `Starting puppeteer process`, StatusOfStep.PASSED);
72
+ yield this.startBrowser();
73
+ this.defaultPage.on('console', (message) => consoleStack.push(`${message.type().substr(0, 3).toUpperCase()} ${message.text()}`))
74
+ .on('pageerror', ({ message }) => consoleStack.push(message))
75
+ .on('response', (response) => consoleStack.push(`${response.status()} ${response.url()}`))
76
+ .on('requestfailed', (request) => { var _a; return consoleStack.push(`${request.failure() !== null ? (_a = request.failure()) === null || _a === void 0 ? void 0 : _a.errorText : ""} ${request.url()}`); });
77
+ yield callback(event);
78
+ log.push('When', `Finished puppeteer process`, StatusOfStep.PASSED);
79
+ }
80
+ catch (err) {
81
+ console.log("Error message: \n", err);
82
+ let browser_start_retry = err.toString().includes("Failed to launch the browser process!");
83
+ if (browser_start_retry) {
84
+ const result = yield retrySuite(uploadModel.nextSuites, uploadModel.reportId, uploadModel.currentSuite, uploadModel.retries);
85
+ if (!result) {
86
+ yield onTestEnd(uploadModel, featureName, scenarioName, statusCode, screenshotBuffer, !errMessage ? undefined : {
87
+ currentPageUrl: 'undefined',
88
+ console: consoleStack,
89
+ error: 'Browser did not open'
90
+ });
91
+ }
92
+ return { statusCode: 204 };
93
+ }
94
+ errMessage = err;
95
+ statusCode = 500;
96
+ screenshotBuffer = yield captureScreenshot();
97
+ log.push('When', `Finished puppeteer process`, StatusOfStep.FAILED);
98
+ yield postNotificationsOnFail(uploadModel);
99
+ }
100
+ let url = this.defaultPage.url();
101
+ if (close)
102
+ yield this.close();
103
+ yield onTestEnd(uploadModel, featureName, scenarioName, statusCode, screenshotBuffer, !errMessage ? undefined : {
104
+ currentPageUrl: url,
105
+ console: consoleStack,
106
+ error: errMessage
107
+ });
108
+ }
109
+ catch (e) {
110
+ console.log("Lib error:", e);
111
+ }
112
+ finally {
113
+ log.clear();
114
+ }
115
+ });
116
+ }
117
+ runRPA(event, callback, uploadModel, close) {
118
+ return __awaiter(this, void 0, void 0, function* () {
119
+ let errMessage;
120
+ try {
121
+ if (uploadModel === undefined)
122
+ uploadModel = auxta.getUploadModel();
123
+ if (close === undefined) {
124
+ try {
125
+ if (event.close) {
126
+ close = event.close === "true";
127
+ }
128
+ else {
129
+ close = true;
130
+ }
131
+ if (event.retries) {
132
+ uploadModel.retries = Number(event.retries);
133
+ }
134
+ }
135
+ catch (e) {
136
+ close = true;
137
+ }
138
+ }
139
+ let consoleStack = [];
140
+ try {
141
+ yield log.push('When', `Starting puppeteer process`, StatusOfStep.PASSED);
142
+ yield this.startBrowser();
143
+ this.defaultPage.on('console', (message) => consoleStack.push(`${message.type().substr(0, 3).toUpperCase()} ${message.text()}`))
144
+ .on('pageerror', ({ message }) => consoleStack.push(message))
145
+ .on('response', (response) => consoleStack.push(`${response.status()} ${response.url()}`))
146
+ .on('requestfailed', (request) => { var _a; return consoleStack.push(`${request.failure() !== null ? (_a = request.failure()) === null || _a === void 0 ? void 0 : _a.errorText : ""} ${request.url()}`); });
147
+ yield callback(event);
148
+ log.push('When', `Finished puppeteer process`, StatusOfStep.PASSED);
149
+ }
150
+ catch (err) {
151
+ console.log("Error message: \n", err);
152
+ let browser_start_retry = err.toString().includes("Failed to launch the browser process!");
153
+ if (browser_start_retry) {
154
+ yield retrySuite([], '', uploadModel.currentSuite, uploadModel.retries);
155
+ return { statusCode: 204 };
156
+ }
157
+ errMessage = err;
158
+ log.push('When', `Finished puppeteer process`, StatusOfStep.FAILED);
159
+ return errMessage;
160
+ }
161
+ if (close)
162
+ yield this.close();
163
+ }
164
+ catch (e) {
165
+ console.log("Lib error:", e);
166
+ }
167
+ finally {
168
+ log.clear();
169
+ }
170
+ return { statusCode: 200 };
171
+ });
172
+ }
173
+ static setupHeader(event, uploadModel) {
174
+ let close = true;
175
+ if (process.env.ENVIRONMENT !== 'LOCAL' && event) {
176
+ uploadModel.reportId = event.reportId;
177
+ uploadModel.nextSuites = event.nextSuites;
178
+ uploadModel.currentSuite = event.currentSuite;
179
+ uploadModel.retries = Number(event.retries);
180
+ }
181
+ try {
182
+ if (event.close) {
183
+ close = event.close === "true";
184
+ }
185
+ return close;
186
+ }
187
+ catch (e) {
188
+ return true;
189
+ }
190
+ }
191
+ }
192
+ export default new Puppeteer();