pw-automation-framework 2.0.1
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 +93 -0
- package/bin/lexxit-automation-framework.js +427 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.js +26 -0
- package/dist/app.js.map +1 -0
- package/dist/controllers/controller.d.ts +57 -0
- package/dist/controllers/controller.js +263 -0
- package/dist/controllers/controller.js.map +1 -0
- package/dist/core/BrowserManager.d.ts +46 -0
- package/dist/core/BrowserManager.js +377 -0
- package/dist/core/BrowserManager.js.map +1 -0
- package/dist/core/PlaywrightEngine.d.ts +16 -0
- package/dist/core/PlaywrightEngine.js +246 -0
- package/dist/core/PlaywrightEngine.js.map +1 -0
- package/dist/core/ScreenshotManager.d.ts +10 -0
- package/dist/core/ScreenshotManager.js +28 -0
- package/dist/core/ScreenshotManager.js.map +1 -0
- package/dist/core/TestData.d.ts +12 -0
- package/dist/core/TestData.js +29 -0
- package/dist/core/TestData.js.map +1 -0
- package/dist/core/TestExecutor.d.ts +16 -0
- package/dist/core/TestExecutor.js +355 -0
- package/dist/core/TestExecutor.js.map +1 -0
- package/dist/core/handlers/AllHandlers.d.ts +116 -0
- package/dist/core/handlers/AllHandlers.js +648 -0
- package/dist/core/handlers/AllHandlers.js.map +1 -0
- package/dist/core/handlers/BaseHandler.d.ts +16 -0
- package/dist/core/handlers/BaseHandler.js +27 -0
- package/dist/core/handlers/BaseHandler.js.map +1 -0
- package/dist/core/handlers/ClickHandler.d.ts +34 -0
- package/dist/core/handlers/ClickHandler.js +359 -0
- package/dist/core/handlers/ClickHandler.js.map +1 -0
- package/dist/core/handlers/CustomCodeHandler.d.ts +35 -0
- package/dist/core/handlers/CustomCodeHandler.js +102 -0
- package/dist/core/handlers/CustomCodeHandler.js.map +1 -0
- package/dist/core/handlers/DropdownHandler.d.ts +43 -0
- package/dist/core/handlers/DropdownHandler.js +304 -0
- package/dist/core/handlers/DropdownHandler.js.map +1 -0
- package/dist/core/handlers/InputHandler.d.ts +24 -0
- package/dist/core/handlers/InputHandler.js +197 -0
- package/dist/core/handlers/InputHandler.js.map +1 -0
- package/dist/core/registry/ActionRegistry.d.ts +8 -0
- package/dist/core/registry/ActionRegistry.js +35 -0
- package/dist/core/registry/ActionRegistry.js.map +1 -0
- package/dist/installer/frameworkLauncher.d.ts +31 -0
- package/dist/installer/frameworkLauncher.js +198 -0
- package/dist/installer/frameworkLauncher.js.map +1 -0
- package/dist/queue/ExecutionQueue.d.ts +52 -0
- package/dist/queue/ExecutionQueue.js +175 -0
- package/dist/queue/ExecutionQueue.js.map +1 -0
- package/dist/routes/api.routes.d.ts +2 -0
- package/dist/routes/api.routes.js +16 -0
- package/dist/routes/api.routes.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +30 -0
- package/dist/server.js.map +1 -0
- package/dist/types/types.d.ts +135 -0
- package/dist/types/types.js +4 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/elementHighlight.d.ts +35 -0
- package/dist/utils/elementHighlight.js +136 -0
- package/dist/utils/elementHighlight.js.map +1 -0
- package/dist/utils/locatorHelper.d.ts +7 -0
- package/dist/utils/locatorHelper.js +53 -0
- package/dist/utils/locatorHelper.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/response.d.ts +4 -0
- package/dist/utils/response.js +25 -0
- package/dist/utils/response.js.map +1 -0
- package/dist/utils/responseFormatter.d.ts +78 -0
- package/dist/utils/responseFormatter.js +123 -0
- package/dist/utils/responseFormatter.js.map +1 -0
- package/dist/utils/sseManager.d.ts +32 -0
- package/dist/utils/sseManager.js +122 -0
- package/dist/utils/sseManager.js.map +1 -0
- package/lexxit-automation-framework-2.0.0.tgz +0 -0
- package/npmignore +5 -0
- package/package.json +36 -0
- package/scripts/postinstall.js +52 -0
- package/src/app.ts +27 -0
- package/src/controllers/controller.ts +282 -0
- package/src/core/BrowserManager.ts +398 -0
- package/src/core/PlaywrightEngine.ts +371 -0
- package/src/core/ScreenshotManager.ts +25 -0
- package/src/core/TestData.ts +25 -0
- package/src/core/TestExecutor.ts +436 -0
- package/src/core/handlers/AllHandlers.ts +626 -0
- package/src/core/handlers/BaseHandler.ts +41 -0
- package/src/core/handlers/ClickHandler.ts +482 -0
- package/src/core/handlers/CustomCodeHandler.ts +123 -0
- package/src/core/handlers/DropdownHandler.ts +438 -0
- package/src/core/handlers/InputHandler.ts +192 -0
- package/src/core/registry/ActionRegistry.ts +31 -0
- package/src/installer/frameworkLauncher.ts +242 -0
- package/src/installer/install.sh +107 -0
- package/src/public/dashboard.html +540 -0
- package/src/public/queue-monitor.html +190 -0
- package/src/queue/ExecutionQueue.ts +200 -0
- package/src/routes/api.routes.ts +16 -0
- package/src/server.ts +29 -0
- package/src/types/types.ts +169 -0
- package/src/utils/elementHighlight.ts +174 -0
- package/src/utils/locatorHelper.ts +49 -0
- package/src/utils/logger.ts +40 -0
- package/src/utils/response.ts +27 -0
- package/src/utils/responseFormatter.ts +167 -0
- package/src/utils/sseManager.ts +127 -0
- package/tsconfig.json +18 -0
- package/videos/fb1b94b6-6639-4c9a-82bb-63572606f403/page@5bd5c6c8b62baa700e9810cdd64f5c49.webm +0 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CustomCodeHandler = void 0;
|
|
4
|
+
const response_1 = require("../../utils/response");
|
|
5
|
+
const locatorHelper_1 = require("../../utils/locatorHelper");
|
|
6
|
+
const BaseHandler_1 = require("./BaseHandler");
|
|
7
|
+
const logger_1 = require("../../utils/logger");
|
|
8
|
+
/**
|
|
9
|
+
* CustomCodeHandler
|
|
10
|
+
* -----------------
|
|
11
|
+
* Mirrors the Python runCustomCode() behaviour:
|
|
12
|
+
*
|
|
13
|
+
* tSetup.runCustomCode('<JS code>', '<returnVariable>', '<optional xpath>')
|
|
14
|
+
*
|
|
15
|
+
* The code string runs inside an async Function with two injected helpers:
|
|
16
|
+
* - tSetup : the Page object (so you can call Playwright APIs from code)
|
|
17
|
+
* - testData: the shared TestData store (read/write mid-script variables)
|
|
18
|
+
*
|
|
19
|
+
* Rules:
|
|
20
|
+
* 1. Declare a variable whose name matches returnVariable — its value is
|
|
21
|
+
* captured, stored in TestData under that key, and returned in data.value.
|
|
22
|
+
* 2. If an xpath is supplied the captured value is also typed into that field.
|
|
23
|
+
* 3. If no returnVariable is supplied the code still runs; pass is returned.
|
|
24
|
+
* 4. On any exception the step fails with the error message + screenshot.
|
|
25
|
+
*
|
|
26
|
+
* Example step_script values:
|
|
27
|
+
* tSetup.runCustomCode('const result = "LN" + Math.floor(Math.random()*1000);', 'result', '//input[@id="ref"]')
|
|
28
|
+
* tSetup.runCustomCode('const otp = String(1000 + Math.floor(Math.random()*9000));', 'otp')
|
|
29
|
+
* tSetup.runCustomCode('await page.waitForTimeout(500); const ts = Date.now();', 'ts')
|
|
30
|
+
*/
|
|
31
|
+
class CustomCodeHandler extends BaseHandler_1.BaseHandler {
|
|
32
|
+
constructor(tConfig, page) {
|
|
33
|
+
super(tConfig, page);
|
|
34
|
+
this.log = logger_1.Logger.create("CustomCodeHandler", tConfig.executionId);
|
|
35
|
+
}
|
|
36
|
+
getActions() {
|
|
37
|
+
return {
|
|
38
|
+
runcustomcode: this.runCustomCode.bind(this),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// ─── runCustomCode(codeStr, returnVariable?, xpath?) ──────────────────────
|
|
42
|
+
async runCustomCode(args) {
|
|
43
|
+
const [codeStr, returnVariable, xpath] = args;
|
|
44
|
+
if (!codeStr || !codeStr.trim()) {
|
|
45
|
+
return (0, response_1.fail)("runCustomCode: codeStr (arg 1) is required");
|
|
46
|
+
}
|
|
47
|
+
this.log.info(`runCustomCode | returnVar="${returnVariable || "none"}" | xpath="${xpath || "none"}"`);
|
|
48
|
+
try {
|
|
49
|
+
// Build context — same idea as Python's context = {"tSetup": self}
|
|
50
|
+
const context = {
|
|
51
|
+
page: this.page,
|
|
52
|
+
tSetup: this.page, // alias so people can write tSetup.xxx inside the code
|
|
53
|
+
testData: this.testData,
|
|
54
|
+
};
|
|
55
|
+
// Execute the code string as an async function so `await` works inside
|
|
56
|
+
const wrappedCode = `
|
|
57
|
+
"use strict";
|
|
58
|
+
const { page, tSetup, testData } = __ctx__;
|
|
59
|
+
${codeStr}
|
|
60
|
+
return typeof ${returnVariable || "__undefined__"} !== "undefined"
|
|
61
|
+
? ${returnVariable || "undefined"}
|
|
62
|
+
: undefined;
|
|
63
|
+
`;
|
|
64
|
+
// eslint-disable-next-line no-new-func
|
|
65
|
+
const fn = new Function("__ctx__", `return (async (__ctx__) => { ${wrappedCode} })(__ctx__)`);
|
|
66
|
+
const value = await fn(context);
|
|
67
|
+
// ── Capture return value ───────────────────────────────────────────────
|
|
68
|
+
if (returnVariable && value !== undefined && value !== null) {
|
|
69
|
+
// Store in shared TestData so later steps can reference it
|
|
70
|
+
this.testData.set(returnVariable, value);
|
|
71
|
+
const strValue = String(value);
|
|
72
|
+
this.log.info(`runCustomCode → ${returnVariable} = ${strValue}`);
|
|
73
|
+
// If xpath provided, type the value into the field
|
|
74
|
+
if (xpath && xpath.trim()) {
|
|
75
|
+
try {
|
|
76
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)("xpath", xpath));
|
|
77
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
78
|
+
await el.clear();
|
|
79
|
+
await el.fill(strValue);
|
|
80
|
+
this.log.info(`runCustomCode: typed "${strValue}" into [xpath=${xpath}]`);
|
|
81
|
+
}
|
|
82
|
+
catch (fillErr) {
|
|
83
|
+
// Typing failed — still pass the code execution, but warn
|
|
84
|
+
this.log.warn(`runCustomCode: value generated but fill failed — ${fillErr.message}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const sc = await this.shots.onPass(this.page);
|
|
88
|
+
return (0, response_1.pass)(`Custom code executed. ${returnVariable} = ${strValue}`, sc, { returnVariable, value, type: typeof value });
|
|
89
|
+
}
|
|
90
|
+
// ── No return variable — code ran for side-effects only ───────────────
|
|
91
|
+
const sc = await this.shots.onPass(this.page);
|
|
92
|
+
return (0, response_1.pass)("Custom code executed successfully.", sc);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
this.log.error(`runCustomCode failed: ${error.message}`);
|
|
96
|
+
const sc = await this.shots.onFail(this.page);
|
|
97
|
+
return (0, response_1.fail)(`Exception occurred during custom code execution`, error.message, sc);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.CustomCodeHandler = CustomCodeHandler;
|
|
102
|
+
//# sourceMappingURL=CustomCodeHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomCodeHandler.js","sourceRoot":"","sources":["../../../src/core/handlers/CustomCodeHandler.ts"],"names":[],"mappings":";;;AAEA,mDAAkD;AAClD,6DAA+D;AAC/D,+CAA4C;AAC5C,+CAA4C;AAE5C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAa,iBAAkB,SAAQ,yBAAW;IAGhD,YAAY,OAAuB,EAAE,IAAU;QAC7C,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,eAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,UAAU;QACR,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,aAAa,CAAC,IAAc;QAChC,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;QAE9C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAChC,OAAO,IAAA,eAAI,EAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,cAAc,IAAI,MAAM,cAAc,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;QAEtG,IAAI,CAAC;YACH,mEAAmE;YACnE,MAAM,OAAO,GAA4B;gBACvC,IAAI,EAAM,IAAI,CAAC,IAAI;gBACnB,MAAM,EAAI,IAAI,CAAC,IAAI,EAAW,uDAAuD;gBACrF,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;YAEF,uEAAuE;YACvE,MAAM,WAAW,GAAG;;;UAGhB,OAAO;wBACO,cAAc,IAAI,eAAe;cAC3C,cAAc,IAAI,WAAW;;OAEpC,CAAC;YAEF,uCAAuC;YACvC,MAAM,EAAE,GAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,gCAAgC,WAAW,cAAc,CAAC,CAAC;YAClG,MAAM,KAAK,GAAI,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;YAEjC,0EAA0E;YAC1E,IAAI,cAAc,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC5D,2DAA2D;gBAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;gBAEzC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,cAAc,MAAM,QAAQ,EAAE,CAAC,CAAC;gBAEjE,mDAAmD;gBACnD,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1B,IAAI,CAAC;wBACH,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAA,kCAAkB,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;wBACjE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;wBAC9D,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;wBACjB,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,QAAQ,iBAAiB,KAAK,GAAG,CAAC,CAAC;oBAC5E,CAAC;oBAAC,OAAO,OAAY,EAAE,CAAC;wBACtB,0DAA0D;wBAC1D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oDAAoD,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;oBACvF,CAAC;gBACH,CAAC;gBAED,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9C,OAAO,IAAA,eAAI,EACT,yBAAyB,cAAc,MAAM,QAAQ,EAAE,EACvD,EAAE,EACF,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,KAAK,EAAE,CAC9C,CAAC;YACJ,CAAC;YAED,yEAAyE;YACzE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,IAAA,eAAI,EAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;QAExD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,IAAA,eAAI,EACT,iDAAiD,EACjD,KAAK,CAAC,OAAO,EACb,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA3FD,8CA2FC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Page } from "playwright";
|
|
2
|
+
import { ActionResponse, TestCaseConfig } from "../../types/types";
|
|
3
|
+
import { BaseHandler } from "./BaseHandler";
|
|
4
|
+
/**
|
|
5
|
+
* DropdownHandler
|
|
6
|
+
* ===============
|
|
7
|
+
* ROOT CAUSE OF DROPDOWN DELAY (fixed):
|
|
8
|
+
* - Previous: using networkidle wait after every action
|
|
9
|
+
* - Fix: Playwright's selectOption() is synchronous once visible.
|
|
10
|
+
* We waitFor visible then immediately selectOption. No extra waits.
|
|
11
|
+
*
|
|
12
|
+
* Also supports:
|
|
13
|
+
* - Custom dropdowns (non-<select>) via click-then-click pattern
|
|
14
|
+
* - Multi-select
|
|
15
|
+
* - Autocomplete / combobox
|
|
16
|
+
*/
|
|
17
|
+
export declare class DropdownHandler extends BaseHandler {
|
|
18
|
+
constructor(tConfig: TestCaseConfig, page: Page);
|
|
19
|
+
getActions(): {
|
|
20
|
+
selectdropdown: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
21
|
+
selectMuiDropdown: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
22
|
+
selectbyindex: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
23
|
+
selectbyvalue: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
24
|
+
multiselect: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
25
|
+
getdropdownoptions: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
26
|
+
getselectedoption: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
27
|
+
selectcustomdropdown: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
28
|
+
selectautocomplete: (args: string[], slabel?: string) => Promise<ActionResponse>;
|
|
29
|
+
};
|
|
30
|
+
selectMuiDropdown(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
31
|
+
selectDropdown(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
32
|
+
selectByIndex(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
33
|
+
selectByValue(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
34
|
+
multiSelect(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
35
|
+
getDropdownOptions(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
36
|
+
getSelectedOption(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
37
|
+
selectCustomDropdown(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
38
|
+
/**
|
|
39
|
+
* tSetup.selectAutocomplete('xpath', '//input[@id="search"]', 'New York', 'xpath', '//li[text()="New York"]')
|
|
40
|
+
* Types into autocomplete input, waits for suggestion, clicks it
|
|
41
|
+
*/
|
|
42
|
+
selectAutocomplete(args: string[], slabel?: string): Promise<ActionResponse>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DropdownHandler = void 0;
|
|
4
|
+
const response_1 = require("../../utils/response");
|
|
5
|
+
const locatorHelper_1 = require("../../utils/locatorHelper");
|
|
6
|
+
const BaseHandler_1 = require("./BaseHandler");
|
|
7
|
+
/**
|
|
8
|
+
* DropdownHandler
|
|
9
|
+
* ===============
|
|
10
|
+
* ROOT CAUSE OF DROPDOWN DELAY (fixed):
|
|
11
|
+
* - Previous: using networkidle wait after every action
|
|
12
|
+
* - Fix: Playwright's selectOption() is synchronous once visible.
|
|
13
|
+
* We waitFor visible then immediately selectOption. No extra waits.
|
|
14
|
+
*
|
|
15
|
+
* Also supports:
|
|
16
|
+
* - Custom dropdowns (non-<select>) via click-then-click pattern
|
|
17
|
+
* - Multi-select
|
|
18
|
+
* - Autocomplete / combobox
|
|
19
|
+
*/
|
|
20
|
+
class DropdownHandler extends BaseHandler_1.BaseHandler {
|
|
21
|
+
constructor(tConfig, page) { super(tConfig, page); }
|
|
22
|
+
getActions() {
|
|
23
|
+
return {
|
|
24
|
+
selectdropdown: this.selectDropdown.bind(this),
|
|
25
|
+
selectMuiDropdown: this.selectMuiDropdown.bind(this),
|
|
26
|
+
selectbyindex: this.selectByIndex.bind(this),
|
|
27
|
+
selectbyvalue: this.selectByValue.bind(this),
|
|
28
|
+
multiselect: this.multiSelect.bind(this),
|
|
29
|
+
getdropdownoptions: this.getDropdownOptions.bind(this),
|
|
30
|
+
getselectedoption: this.getSelectedOption.bind(this),
|
|
31
|
+
selectcustomdropdown: this.selectCustomDropdown.bind(this),
|
|
32
|
+
selectautocomplete: this.selectAutocomplete.bind(this),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
async selectMuiDropdown(args, slabel) {
|
|
36
|
+
const [strategy, locator, value] = args;
|
|
37
|
+
const displayLabel = slabel || "unknown";
|
|
38
|
+
if (!strategy || !locator || !value) {
|
|
39
|
+
return (0, response_1.fail)("selectMuiDropdown needs: strategy, locator, value", "Missing args");
|
|
40
|
+
}
|
|
41
|
+
const ls = (0, locatorHelper_1.buildLocatorString)(strategy, locator);
|
|
42
|
+
try {
|
|
43
|
+
const dropdown = this.page.locator(ls);
|
|
44
|
+
await dropdown.waitFor({ state: "visible", timeout: this.timeout });
|
|
45
|
+
await this.highlight(ls, "select", `Opening dropdown`);
|
|
46
|
+
await dropdown.click();
|
|
47
|
+
const option = this.page.locator(`//li[normalize-space()="${value}"]`);
|
|
48
|
+
await option.waitFor({ state: "visible", timeout: this.timeout });
|
|
49
|
+
await option.click();
|
|
50
|
+
await this.unhighlight();
|
|
51
|
+
const sc = await this.shots.onPass(this.page);
|
|
52
|
+
return (0, response_1.pass)(`Selected "${value}" from ${displayLabel}`, sc, { expected_result: `"${value}" selected successfully in "${displayLabel}"` });
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
await this.unhighlight();
|
|
56
|
+
const sc = await this.shots.onFail(this.page);
|
|
57
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
58
|
+
const errorMsg = isNotFound
|
|
59
|
+
? `"${displayLabel}" not found`
|
|
60
|
+
: `Failed selectMuiDropdown "${value}" in ${displayLabel} — ${error.message}`;
|
|
61
|
+
return (0, response_1.fail)(errorMsg, undefined, sc, { expected_result: `"${value}" selected successfully in "${displayLabel}"` });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// tSetup.selectDropdown('xpath', '//select[...]', 'Option Label')
|
|
65
|
+
// ✅ OPTIMIZED: no networkidle, just waitFor visible then selectOption immediately
|
|
66
|
+
async selectDropdown(args, slabel) {
|
|
67
|
+
const [strategy, locator, value] = args;
|
|
68
|
+
const displayLabel = slabel || "unknown";
|
|
69
|
+
if (!strategy || !locator || !value) {
|
|
70
|
+
return (0, response_1.fail)("selectDropdown needs: strategy, locator, visibleText", "Missing args");
|
|
71
|
+
}
|
|
72
|
+
const ls = (0, locatorHelper_1.buildLocatorString)(strategy, locator);
|
|
73
|
+
try {
|
|
74
|
+
const el = this.page.locator(ls);
|
|
75
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
76
|
+
// ✅ Highlight before action
|
|
77
|
+
await this.highlight(ls, "select", `Selecting: "${value}"`);
|
|
78
|
+
const byLabel = el.selectOption({ label: value }, { timeout: this.timeout });
|
|
79
|
+
const byValue = el.selectOption({ value }, { timeout: this.timeout });
|
|
80
|
+
const byPartialText = (async () => {
|
|
81
|
+
const options = await el.locator("option").all();
|
|
82
|
+
for (const opt of options) {
|
|
83
|
+
const txt = (await opt.textContent() ?? "").trim();
|
|
84
|
+
if (txt.toLowerCase().includes(value.toLowerCase())) {
|
|
85
|
+
const val = await opt.getAttribute("value");
|
|
86
|
+
if (!val)
|
|
87
|
+
throw new Error(`Option "${value}" has no value`);
|
|
88
|
+
return el.selectOption({ value: val }, { timeout: this.timeout });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`Option "${value}" not found`);
|
|
92
|
+
})();
|
|
93
|
+
await Promise.any([byLabel, byValue, byPartialText]);
|
|
94
|
+
await this.unhighlight();
|
|
95
|
+
const sc = await this.shots.onPass(this.page);
|
|
96
|
+
return (0, response_1.pass)(`Selected "${value}" from ${displayLabel}`, sc, { expected_result: `"${value}" selected successfully in "${displayLabel}"` });
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
await this.unhighlight();
|
|
100
|
+
const sc = await this.shots.onFail(this.page);
|
|
101
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
102
|
+
const errorMsg = isNotFound
|
|
103
|
+
? `"${displayLabel}" not found`
|
|
104
|
+
: `Failed selectDropdown "${value}" in ${displayLabel} — ${error.message}`;
|
|
105
|
+
return (0, response_1.fail)(errorMsg, undefined, sc, { expected_result: `"${value}" selected successfully in "${displayLabel}"` });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// tSetup.selectByIndex('xpath', '//select[...]', '2')
|
|
109
|
+
async selectByIndex(args, slabel) {
|
|
110
|
+
const [strategy, locator, indexStr] = args;
|
|
111
|
+
const displayLabel = slabel || "unknown";
|
|
112
|
+
const index = parseInt(indexStr, 10);
|
|
113
|
+
if (!strategy || !locator || isNaN(index)) {
|
|
114
|
+
return (0, response_1.fail)("selectByIndex needs: strategy, locator, index", "Missing args");
|
|
115
|
+
}
|
|
116
|
+
const ls = (0, locatorHelper_1.buildLocatorString)(strategy, locator);
|
|
117
|
+
try {
|
|
118
|
+
const el = this.page.locator(ls);
|
|
119
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
120
|
+
await this.highlight(ls, "select", `Selecting index: ${index}`);
|
|
121
|
+
await el.selectOption({ index }, { timeout: this.timeout });
|
|
122
|
+
await this.unhighlight();
|
|
123
|
+
const sc = await this.shots.onPass(this.page);
|
|
124
|
+
return (0, response_1.pass)(`Selected index ${index} in ${displayLabel}`, sc, { expected_result: `Index ${index} selected successfully in "${displayLabel}"` });
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
await this.unhighlight();
|
|
128
|
+
const sc = await this.shots.onFail(this.page);
|
|
129
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
130
|
+
const errorMsg = isNotFound
|
|
131
|
+
? `"${displayLabel}" not found`
|
|
132
|
+
: `Failed selectByIndex ${index} in ${displayLabel} — ${error.message}`;
|
|
133
|
+
return (0, response_1.fail)(errorMsg, undefined, sc);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async selectByValue(args, slabel) {
|
|
137
|
+
const [strategy, locator, value] = args;
|
|
138
|
+
const displayLabel = slabel || "unknown";
|
|
139
|
+
if (!strategy || !locator || !value) {
|
|
140
|
+
return (0, response_1.fail)("selectByValue needs: strategy, locator, value", "Missing args");
|
|
141
|
+
}
|
|
142
|
+
const ls = (0, locatorHelper_1.buildLocatorString)(strategy, locator);
|
|
143
|
+
try {
|
|
144
|
+
const el = this.page.locator(ls);
|
|
145
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
146
|
+
await this.highlight(ls, "select", `Selecting value: "${value}"`);
|
|
147
|
+
await el.selectOption({ value }, { timeout: this.timeout });
|
|
148
|
+
await this.unhighlight();
|
|
149
|
+
const sc = await this.shots.onPass(this.page);
|
|
150
|
+
return (0, response_1.pass)(`Selected value "${value}" in ${displayLabel}`, sc, { expected_result: `"${value}" selected successfully in "${displayLabel}"` });
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
await this.unhighlight();
|
|
154
|
+
const sc = await this.shots.onFail(this.page);
|
|
155
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
156
|
+
const errorMsg = isNotFound
|
|
157
|
+
? `"${displayLabel}" not found`
|
|
158
|
+
: `Failed selectByValue "${value}" in ${displayLabel} — ${error.message}`;
|
|
159
|
+
return (0, response_1.fail)(errorMsg, undefined, sc);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async multiSelect(args, slabel) {
|
|
163
|
+
const [strategy, locator, ...values] = args;
|
|
164
|
+
const displayLabel = slabel || "unknown";
|
|
165
|
+
if (!strategy || !locator || values.length === 0) {
|
|
166
|
+
return (0, response_1.fail)("multiSelect needs: strategy, locator, ...values", "Missing args");
|
|
167
|
+
}
|
|
168
|
+
const ls = (0, locatorHelper_1.buildLocatorString)(strategy, locator);
|
|
169
|
+
try {
|
|
170
|
+
const el = this.page.locator(ls);
|
|
171
|
+
await el.waitFor({ state: "visible", timeout: this.timeout });
|
|
172
|
+
await this.highlight(ls, "select", `Selecting: ${values.join(", ")}`);
|
|
173
|
+
await el.selectOption(values.map(v => ({ label: v })), { timeout: this.timeout });
|
|
174
|
+
await this.unhighlight();
|
|
175
|
+
const sc = await this.shots.onPass(this.page);
|
|
176
|
+
return (0, response_1.pass)(`Multi-selected [${values.join(", ")}] in ${displayLabel}`, sc, { expected_result: `Values [${values.join(", ")}] selected in "${displayLabel}"` });
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
await this.unhighlight();
|
|
180
|
+
const sc = await this.shots.onFail(this.page);
|
|
181
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
182
|
+
const errorMsg = isNotFound
|
|
183
|
+
? `"${displayLabel}" not found`
|
|
184
|
+
: `Failed multiSelect in ${displayLabel} — ${error.message}`;
|
|
185
|
+
return (0, response_1.fail)(errorMsg, undefined, sc);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async getDropdownOptions(args, slabel) {
|
|
189
|
+
const [strategy, locator, storeKey] = args;
|
|
190
|
+
const displayLabel = slabel || "unknown";
|
|
191
|
+
if (!strategy || !locator) {
|
|
192
|
+
return (0, response_1.fail)("getDropdownOptions needs: strategy, locator", "Missing args");
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
196
|
+
await el.waitFor({ state: "attached", timeout: this.timeout });
|
|
197
|
+
const texts = await el.locator("option").allTextContents();
|
|
198
|
+
if (storeKey)
|
|
199
|
+
this.testData.set(storeKey, texts);
|
|
200
|
+
const sc = await this.shots.onPass(this.page);
|
|
201
|
+
return (0, response_1.pass)(`Options: [${texts.join(", ")}] in ${displayLabel}`, sc, { options: texts });
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
const sc = await this.shots.onFail(this.page);
|
|
205
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
206
|
+
const errorMsg = isNotFound
|
|
207
|
+
? `"${displayLabel}" not found`
|
|
208
|
+
: `Failed getDropdownOptions in ${displayLabel} — ${error.message}`;
|
|
209
|
+
return (0, response_1.fail)(errorMsg, undefined, sc);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async getSelectedOption(args, slabel) {
|
|
213
|
+
const [strategy, locator, storeKey] = args;
|
|
214
|
+
const displayLabel = slabel || "unknown";
|
|
215
|
+
if (!strategy || !locator) {
|
|
216
|
+
return (0, response_1.fail)("getSelectedOption needs: strategy, locator", "Missing args");
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
const el = this.page.locator((0, locatorHelper_1.buildLocatorString)(strategy, locator));
|
|
220
|
+
await el.waitFor({ state: "attached", timeout: this.timeout });
|
|
221
|
+
const text = ((await el.locator("option:checked").textContent()) ?? "").trim();
|
|
222
|
+
if (storeKey)
|
|
223
|
+
this.testData.set(storeKey, text);
|
|
224
|
+
const sc = await this.shots.onPass(this.page);
|
|
225
|
+
return (0, response_1.pass)(`Selected: "${text}" in ${displayLabel}`, sc, { selected: text });
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
const sc = await this.shots.onFail(this.page);
|
|
229
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
230
|
+
const errorMsg = isNotFound
|
|
231
|
+
? `"${displayLabel}" not found`
|
|
232
|
+
: `Failed getSelectedOption in ${displayLabel} — ${error.message}`;
|
|
233
|
+
return (0, response_1.fail)(errorMsg, undefined, sc);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async selectCustomDropdown(args, slabel) {
|
|
237
|
+
const [ts, tl, os, ol] = args;
|
|
238
|
+
const displayLabel = slabel || "unknown";
|
|
239
|
+
if (!ts || !tl || !os || !ol) {
|
|
240
|
+
return (0, response_1.fail)("selectCustomDropdown needs locators", "Missing args");
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
const trigger = this.page.locator((0, locatorHelper_1.buildLocatorString)(ts, tl));
|
|
244
|
+
await trigger.waitFor({ state: "visible", timeout: this.timeout });
|
|
245
|
+
await this.highlight((0, locatorHelper_1.buildLocatorString)(ts, tl), "select", "Opening dropdown");
|
|
246
|
+
await trigger.click();
|
|
247
|
+
const option = this.page.locator((0, locatorHelper_1.buildLocatorString)(os, ol));
|
|
248
|
+
await option.waitFor({ state: "visible", timeout: this.timeout });
|
|
249
|
+
await option.click();
|
|
250
|
+
await this.unhighlight();
|
|
251
|
+
const sc = await this.shots.onPass(this.page);
|
|
252
|
+
return (0, response_1.pass)(`Custom dropdown selected in ${displayLabel}`, sc);
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
await this.unhighlight();
|
|
256
|
+
const sc = await this.shots.onFail(this.page);
|
|
257
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
258
|
+
const errorMsg = isNotFound
|
|
259
|
+
? `"${displayLabel}" not found`
|
|
260
|
+
: `Failed selectCustomDropdown in ${displayLabel} — ${error.message}`;
|
|
261
|
+
return (0, response_1.fail)(errorMsg, undefined, sc);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* tSetup.selectAutocomplete('xpath', '//input[@id="search"]', 'New York', 'xpath', '//li[text()="New York"]')
|
|
266
|
+
* Types into autocomplete input, waits for suggestion, clicks it
|
|
267
|
+
*/
|
|
268
|
+
async selectAutocomplete(args, slabel) {
|
|
269
|
+
const [is, il, text, os, ol] = args;
|
|
270
|
+
const displayLabel = slabel || "unknown";
|
|
271
|
+
if (!is || !il || !text) {
|
|
272
|
+
return (0, response_1.fail)("selectAutocomplete needs input locator & text", "Missing args");
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const input = this.page.locator((0, locatorHelper_1.buildLocatorString)(is, il));
|
|
276
|
+
await input.waitFor({ state: "visible", timeout: this.timeout });
|
|
277
|
+
await this.highlight((0, locatorHelper_1.buildLocatorString)(is, il), "input", `Typing: "${text}"`);
|
|
278
|
+
await input.clear();
|
|
279
|
+
await input.pressSequentially(text, { delay: 80 });
|
|
280
|
+
if (os && ol) {
|
|
281
|
+
const option = this.page.locator((0, locatorHelper_1.buildLocatorString)(os, ol));
|
|
282
|
+
await option.waitFor({ state: "visible", timeout: this.timeout });
|
|
283
|
+
await option.click();
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
await input.press("Enter");
|
|
287
|
+
}
|
|
288
|
+
await this.unhighlight();
|
|
289
|
+
const sc = await this.shots.onPass(this.page);
|
|
290
|
+
return (0, response_1.pass)(`Autocomplete selected: "${text}"`, sc);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
await this.unhighlight();
|
|
294
|
+
const sc = await this.shots.onFail(this.page);
|
|
295
|
+
const isNotFound = /timeout|waiting for locator|not visible|not found/i.test(error.message);
|
|
296
|
+
const errorMsg = isNotFound
|
|
297
|
+
? `"${displayLabel}" not found`
|
|
298
|
+
: `Failed selectAutocomplete "${text}" — ${error.message}`;
|
|
299
|
+
return (0, response_1.fail)(errorMsg, undefined, sc);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
exports.DropdownHandler = DropdownHandler;
|
|
304
|
+
//# sourceMappingURL=DropdownHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownHandler.js","sourceRoot":"","sources":["../../../src/core/handlers/DropdownHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Page } from "playwright";
|
|
2
|
+
import { ActionResponse, TestCaseConfig } from "../../types/types";
|
|
3
|
+
import { BaseHandler } from "./BaseHandler";
|
|
4
|
+
export declare class InputHandler extends BaseHandler {
|
|
5
|
+
constructor(tConfig: TestCaseConfig, page: Page);
|
|
6
|
+
getActions(): {
|
|
7
|
+
entertext: (args: string[], label?: string) => Promise<ActionResponse>;
|
|
8
|
+
typetext: (args: string[], label?: string) => Promise<ActionResponse>;
|
|
9
|
+
cleartext: (args: string[], label?: string) => Promise<ActionResponse>;
|
|
10
|
+
appendtext: (args: string[], label?: string) => Promise<ActionResponse>;
|
|
11
|
+
getinputvalue: (args: string[], label?: string) => Promise<ActionResponse>;
|
|
12
|
+
setinputvalue: (args: string[], label?: string) => Promise<ActionResponse>;
|
|
13
|
+
uploadfile: (args: string[], label?: string) => Promise<ActionResponse>;
|
|
14
|
+
enteriframe: (args: string[], label?: string) => Promise<ActionResponse>;
|
|
15
|
+
};
|
|
16
|
+
enterText(args: string[], label?: string): Promise<ActionResponse>;
|
|
17
|
+
typeText(args: string[], label?: string): Promise<ActionResponse>;
|
|
18
|
+
clearText(args: string[], label?: string): Promise<ActionResponse>;
|
|
19
|
+
appendText(args: string[], label?: string): Promise<ActionResponse>;
|
|
20
|
+
getInputValue(args: string[], label?: string): Promise<ActionResponse>;
|
|
21
|
+
setInputValueByJS(args: string[], label?: string): Promise<ActionResponse>;
|
|
22
|
+
uploadFile(args: string[], label?: string): Promise<ActionResponse>;
|
|
23
|
+
enterTextInFrame(args: string[], label?: string): Promise<ActionResponse>;
|
|
24
|
+
}
|