automation_model 1.0.430-dev → 1.0.430
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 +130 -0
- package/lib/api.d.ts +43 -1
- package/lib/api.js +241 -41
- package/lib/api.js.map +1 -1
- package/lib/auto_page.d.ts +5 -2
- package/lib/auto_page.js +177 -46
- package/lib/auto_page.js.map +1 -1
- package/lib/browser_manager.d.ts +7 -3
- package/lib/browser_manager.js +161 -49
- package/lib/browser_manager.js.map +1 -1
- package/lib/bruno.d.ts +1 -0
- package/lib/bruno.js +301 -0
- package/lib/bruno.js.map +1 -0
- package/lib/command_common.d.ts +6 -0
- package/lib/command_common.js +198 -0
- package/lib/command_common.js.map +1 -0
- package/lib/environment.d.ts +3 -0
- package/lib/environment.js +5 -2
- package/lib/environment.js.map +1 -1
- package/lib/error-messages.d.ts +6 -0
- package/lib/error-messages.js +206 -0
- package/lib/error-messages.js.map +1 -0
- package/lib/generation_scripts.d.ts +4 -0
- package/lib/generation_scripts.js +2 -0
- package/lib/generation_scripts.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/init_browser.d.ts +5 -2
- package/lib/init_browser.js +124 -7
- package/lib/init_browser.js.map +1 -1
- package/lib/locate_element.d.ts +7 -0
- package/lib/locate_element.js +215 -0
- package/lib/locate_element.js.map +1 -0
- package/lib/locator.d.ts +36 -0
- package/lib/locator.js +165 -0
- package/lib/locator.js.map +1 -1
- package/lib/locator_log.d.ts +26 -0
- package/lib/locator_log.js +69 -0
- package/lib/locator_log.js.map +1 -0
- package/lib/network.d.ts +3 -0
- package/lib/network.js +183 -0
- package/lib/network.js.map +1 -0
- package/lib/scripts/axe.mini.js +12 -0
- package/lib/stable_browser.d.ts +104 -36
- package/lib/stable_browser.js +1802 -1240
- package/lib/stable_browser.js.map +1 -1
- package/lib/table.d.ts +13 -0
- package/lib/table.js +187 -0
- package/lib/table.js.map +1 -0
- package/lib/table_helper.d.ts +19 -0
- package/lib/table_helper.js +116 -0
- package/lib/table_helper.js.map +1 -0
- package/lib/test_context.d.ts +6 -0
- package/lib/test_context.js +14 -10
- package/lib/test_context.js.map +1 -1
- package/lib/utils.d.ts +22 -2
- package/lib/utils.js +664 -11
- package/lib/utils.js.map +1 -1
- package/package.json +14 -8
package/lib/table.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { fileURLToPath } from "url";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const currentDir = path.dirname(__filename);
|
|
6
|
+
export class Table {
|
|
7
|
+
tableData;
|
|
8
|
+
constructor() { }
|
|
9
|
+
/* result object looks as follows:
|
|
10
|
+
{
|
|
11
|
+
"rowsCount": 5,
|
|
12
|
+
"columnsCount": 8,
|
|
13
|
+
"nodes": [
|
|
14
|
+
{
|
|
15
|
+
"tag": "TR",
|
|
16
|
+
"role": "row",
|
|
17
|
+
"rec": [
|
|
18
|
+
160.1171875,
|
|
19
|
+
726.5234375,
|
|
20
|
+
274.2578125,
|
|
21
|
+
28.5
|
|
22
|
+
],
|
|
23
|
+
"children": [
|
|
24
|
+
{
|
|
25
|
+
"tag": "TH",
|
|
26
|
+
"role": "columnheader",
|
|
27
|
+
"rec": [
|
|
28
|
+
160.1171875,
|
|
29
|
+
726.5234375,
|
|
30
|
+
54.6171875,
|
|
31
|
+
28.5
|
|
32
|
+
],
|
|
33
|
+
"children": [],
|
|
34
|
+
"text": "Family"
|
|
35
|
+
},
|
|
36
|
+
...
|
|
37
|
+
*/
|
|
38
|
+
async initFromElement(page, tableElement) {
|
|
39
|
+
let script = fs.readFileSync(path.join(currentDir, "locator.js"), "utf8");
|
|
40
|
+
// run the script inside the element context (iframe)
|
|
41
|
+
await tableElement.evaluate(script);
|
|
42
|
+
try {
|
|
43
|
+
// @ts-ignore
|
|
44
|
+
this.tableData = await tableElement.evaluate((_node) => {
|
|
45
|
+
// @ts-ignore
|
|
46
|
+
return document.getTableData2(_node);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/*
|
|
54
|
+
analyzeObject examples:
|
|
55
|
+
{
|
|
56
|
+
type: “VALIDATE_HEADER”, cells: [“Name”, “Values”]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
type: “FIND_ROW”,
|
|
60
|
+
cells: [/.+/, “AAA”]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
type: “VALIDATE_GRID”,
|
|
64
|
+
grid: [[],[]]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
type: “VALIDATE_CELL”,
|
|
68
|
+
column_name: “Aaa”,
|
|
69
|
+
column_search_name:
|
|
70
|
+
row_search_value
|
|
71
|
+
expected_value
|
|
72
|
+
}
|
|
73
|
+
*/
|
|
74
|
+
analyze(analyzeObject) {
|
|
75
|
+
let result = { status: false, cells: null, error: "", cellIndex: -1, rowIndex: -1 };
|
|
76
|
+
switch (analyzeObject.type) {
|
|
77
|
+
case "VALIDATE_HEADER":
|
|
78
|
+
result.cellIndex = _searchStringArrayInCellsArray(analyzeObject.cells, this.tableData.columnHeaders);
|
|
79
|
+
result.status = result.cellIndex !== -1;
|
|
80
|
+
if (result.status) {
|
|
81
|
+
result.cells = this.tableData.columnHeaders;
|
|
82
|
+
result.cellIndex = result.cellIndex;
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
case "FIND_ROW":
|
|
86
|
+
for (let i = 0; i < this.tableData.rows.length; i++) {
|
|
87
|
+
const index = _searchStringArrayInCellsArray(analyzeObject.cells, this.tableData.rows[i].children);
|
|
88
|
+
if (index !== -1) {
|
|
89
|
+
result.status = true;
|
|
90
|
+
result.cells = this.tableData.rows[i];
|
|
91
|
+
result.rowIndex = i;
|
|
92
|
+
result.cellIndex = index;
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ts-ignore
|
|
97
|
+
result.error = "Row not found";
|
|
98
|
+
return result;
|
|
99
|
+
case "VALIDATE_CELL": {
|
|
100
|
+
if (
|
|
101
|
+
//!analyzeObject.column_name ||
|
|
102
|
+
!analyzeObject.row_anchor_value ||
|
|
103
|
+
!analyzeObject.expected_value) {
|
|
104
|
+
result.error = "Missing parameters, expected: row_anchor_value, expected_value";
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
// find all the rows that contain the row_anchor_value
|
|
108
|
+
let rows = [];
|
|
109
|
+
for (let i = 0; i < this.tableData.rows.length; i++) {
|
|
110
|
+
if (_searchStringArrayInCellsArray([analyzeObject.row_anchor_value], this.tableData.rows[i].children) !== -1) {
|
|
111
|
+
rows.push(this.tableData.rows[i]);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (rows.length === 0) {
|
|
115
|
+
result.error = "Row containing the anchor value not found";
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
// within the found rows find a cell with the expected value
|
|
119
|
+
for (let i = 0; i < rows.length; i++) {
|
|
120
|
+
const index = _searchStringArrayInCellsArray([analyzeObject.expected_value], rows[i].children);
|
|
121
|
+
if (index !== -1) {
|
|
122
|
+
result.status = true;
|
|
123
|
+
result.cells = rows[i].children[index];
|
|
124
|
+
result.rowIndex = i;
|
|
125
|
+
result.cellIndex = index;
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
result.error = "Cell not found";
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
// case "VALIDATE_CELL":
|
|
133
|
+
// for (let i = 0; i < tableData[0].length; i++) {
|
|
134
|
+
// if (tableData[0][i] === analyzeObject.column_name) {
|
|
135
|
+
// for (let j = 1; j < tableData.length; j++) {
|
|
136
|
+
// if (_compareStringArrayWithCellsArray([analyzeObject.column_search_name], tableData[j])) {
|
|
137
|
+
// return tableData[j][i] === analyzeObject.expected_value;
|
|
138
|
+
// }
|
|
139
|
+
// }
|
|
140
|
+
// }
|
|
141
|
+
// }
|
|
142
|
+
// return false;
|
|
143
|
+
default:
|
|
144
|
+
throw new Error("Unknown analyzeObject type: " + analyzeObject.type);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const _compareStringArrayWithCellsArray = (stringArray, cellsArray) => {
|
|
149
|
+
if (!stringArray || !cellsArray) {
|
|
150
|
+
return -1;
|
|
151
|
+
}
|
|
152
|
+
if (stringArray.length !== cellsArray.length) {
|
|
153
|
+
return -1;
|
|
154
|
+
}
|
|
155
|
+
let i = 0;
|
|
156
|
+
for (; i < stringArray.length; i++) {
|
|
157
|
+
if (stringArray[i] instanceof RegExp) {
|
|
158
|
+
// @ts-ignore
|
|
159
|
+
if (!stringArray[i].test(cellsArray[i].text)) {
|
|
160
|
+
return -1;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
if (stringArray[i] !== cellsArray[i].text) {
|
|
165
|
+
return -1;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return i - stringArray.length;
|
|
170
|
+
};
|
|
171
|
+
const _searchStringArrayInCellsArray = (stringArray, cellsArray) => {
|
|
172
|
+
if (!stringArray || !cellsArray) {
|
|
173
|
+
return -1;
|
|
174
|
+
}
|
|
175
|
+
if (stringArray.length > cellsArray.length) {
|
|
176
|
+
return -1;
|
|
177
|
+
}
|
|
178
|
+
// search using _compareStringArrayWithCellsArray
|
|
179
|
+
for (let i = 0; i < cellsArray.length - stringArray.length + 1; i++) {
|
|
180
|
+
const index = _compareStringArrayWithCellsArray(stringArray, cellsArray.slice(i, i + stringArray.length));
|
|
181
|
+
if (index !== -1) {
|
|
182
|
+
return index + i;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return -1;
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=table.js.map
|
package/lib/table.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare function findHighestWithSameInnerText(cssSelector: string, scope: any, web: any): Promise<{
|
|
2
|
+
element: any;
|
|
3
|
+
cssSelector: string;
|
|
4
|
+
climb: number;
|
|
5
|
+
innerText: any;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function findCellRectangle(headerResult: any, rowResult: any, web: any, info: any): Promise<{
|
|
8
|
+
x: any;
|
|
9
|
+
y: any;
|
|
10
|
+
width: any;
|
|
11
|
+
height: any;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function _findCellArea(headerText: string, rowText: string, web: any, state: any): Promise<{
|
|
14
|
+
x: any;
|
|
15
|
+
y: any;
|
|
16
|
+
width: any;
|
|
17
|
+
height: any;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function findElementsInArea(cssSelector: string, area: any, web: any, options: any): Promise<any[]>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export async function findHighestWithSameInnerText(cssSelector, scope, web) {
|
|
2
|
+
await web._highlightElements(scope, cssSelector);
|
|
3
|
+
const element = await scope.locator(cssSelector).first();
|
|
4
|
+
if (!element) {
|
|
5
|
+
throw new Error("header element not found");
|
|
6
|
+
}
|
|
7
|
+
const innerText = await element.innerText();
|
|
8
|
+
// climb to the parent element until the innerText is changing, get the top element with the same innerText
|
|
9
|
+
let climb = 0;
|
|
10
|
+
let topElement = element;
|
|
11
|
+
let elementCss = cssSelector;
|
|
12
|
+
while (true) {
|
|
13
|
+
climb++;
|
|
14
|
+
// create a climb xpath: 1: .. 2: ../.. etc.
|
|
15
|
+
const climbXpath = "xpath=" + "../".repeat(climb).slice(0, -1);
|
|
16
|
+
const climbCss = elementCss + " >> " + climbXpath;
|
|
17
|
+
const climbElement = await scope.locator(climbCss).first();
|
|
18
|
+
if (!climbElement) {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
const climbInnerText = await climbElement.innerText();
|
|
22
|
+
if (climbInnerText !== innerText) {
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
topElement = climbElement;
|
|
26
|
+
elementCss = climbCss;
|
|
27
|
+
}
|
|
28
|
+
return { element: topElement, cssSelector: elementCss, climb: climb, innerText: innerText };
|
|
29
|
+
}
|
|
30
|
+
export async function findCellRectangle(headerResult, rowResult, web, info) {
|
|
31
|
+
await web.scrollIfNeeded(rowResult.element, info);
|
|
32
|
+
// find the header cell and the row cell location
|
|
33
|
+
const headerRect = await headerResult.element.boundingBox();
|
|
34
|
+
const rowRect = await rowResult.element.boundingBox();
|
|
35
|
+
if (!headerRect || !rowRect) {
|
|
36
|
+
throw new Error("element not found");
|
|
37
|
+
}
|
|
38
|
+
// found there rectengle of cell that is in the header horizontal and the row vertical
|
|
39
|
+
return {
|
|
40
|
+
x: headerRect.x,
|
|
41
|
+
y: rowRect.y,
|
|
42
|
+
width: headerRect.width,
|
|
43
|
+
height: rowRect.height,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export async function _findCellArea(headerText, rowText, web, state) {
|
|
47
|
+
const headerFoundElements = await web.findTextInAllFrames({}, {}, headerText, state);
|
|
48
|
+
if (headerFoundElements.length === 0) {
|
|
49
|
+
throw new Error("header not found");
|
|
50
|
+
}
|
|
51
|
+
if (headerFoundElements.length > 1) {
|
|
52
|
+
throw new Error("multiple headers found");
|
|
53
|
+
}
|
|
54
|
+
const rowFoundElements = await web.findTextInAllFrames({}, {}, rowText, state);
|
|
55
|
+
if (rowFoundElements.length === 0) {
|
|
56
|
+
throw new Error("row not found");
|
|
57
|
+
}
|
|
58
|
+
if (rowFoundElements.length > 1) {
|
|
59
|
+
throw new Error("multiple rows found");
|
|
60
|
+
}
|
|
61
|
+
const headerScope = headerFoundElements[0].frame;
|
|
62
|
+
const headerResult = await findHighestWithSameInnerText(`[data-blinq-id-${headerFoundElements[0].randomToken}]`, headerScope, web);
|
|
63
|
+
const rowScope = rowFoundElements[0].frame;
|
|
64
|
+
const rowResult = await findHighestWithSameInnerText(`[data-blinq-id-${rowFoundElements[0].randomToken}]`, rowScope, web);
|
|
65
|
+
return await findCellRectangle(headerResult, rowResult, web, state.info);
|
|
66
|
+
}
|
|
67
|
+
export async function findElementsInArea(cssSelector, area, web, options) {
|
|
68
|
+
if (!cssSelector) {
|
|
69
|
+
cssSelector = "*";
|
|
70
|
+
}
|
|
71
|
+
const frames = await web.page.frames();
|
|
72
|
+
const elements = [];
|
|
73
|
+
for (const scope of frames) {
|
|
74
|
+
const count = await scope.locator(cssSelector).count();
|
|
75
|
+
for (let i = 0; i < count; i++) {
|
|
76
|
+
const element = await scope.locator(cssSelector).nth(i);
|
|
77
|
+
elements.push(element);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const foundElements = [];
|
|
81
|
+
let hTollarance = 10;
|
|
82
|
+
let vTollarance = 10;
|
|
83
|
+
if (options && options.hTollarance && options.vTollarance) {
|
|
84
|
+
hTollarance = options.hTollarance;
|
|
85
|
+
vTollarance = options.vTollarance;
|
|
86
|
+
}
|
|
87
|
+
for (const element of elements) {
|
|
88
|
+
const rect = await element.boundingBox();
|
|
89
|
+
if (!rect) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (rect.x >= area.x - hTollarance &&
|
|
93
|
+
rect.x + rect.width <= area.x + area.width + hTollarance &&
|
|
94
|
+
rect.y >= area.y - vTollarance &&
|
|
95
|
+
rect.y + rect.height <= area.y + area.height + vTollarance) {
|
|
96
|
+
foundElements.push(element);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (foundElements.length === 0) {
|
|
100
|
+
// find elements that intersect with the area
|
|
101
|
+
for (const element of elements) {
|
|
102
|
+
const rect = await element.boundingBox();
|
|
103
|
+
if (!rect) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (rect.x + rect.width >= area.x &&
|
|
107
|
+
rect.x <= area.x + area.width &&
|
|
108
|
+
rect.y + rect.height >= area.y &&
|
|
109
|
+
rect.y <= area.y + area.height) {
|
|
110
|
+
foundElements.push(element);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return foundElements;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=table_helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table_helper.js","sourceRoot":"","sources":["../../src/table_helper.ts"],"names":[],"mappings":"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"}
|
package/lib/test_context.d.ts
CHANGED
|
@@ -2,8 +2,10 @@ import { BrowserContext, Page, Browser as PlaywrightBrowser } from "playwright";
|
|
|
2
2
|
import { Environment } from "./environment.js";
|
|
3
3
|
import { StableBrowser } from "./stable_browser.js";
|
|
4
4
|
import { Api } from "./api.js";
|
|
5
|
+
import { InitScripts } from "./generation_scripts.js";
|
|
5
6
|
declare class TestContext {
|
|
6
7
|
stable: StableBrowser | null;
|
|
8
|
+
web: StableBrowser | null;
|
|
7
9
|
browser: PlaywrightBrowser | null;
|
|
8
10
|
playContext: BrowserContext | null;
|
|
9
11
|
page: Page | null;
|
|
@@ -11,6 +13,10 @@ declare class TestContext {
|
|
|
11
13
|
reportFolder: string | null;
|
|
12
14
|
api: Api | null;
|
|
13
15
|
navigate: boolean;
|
|
16
|
+
headless: boolean;
|
|
17
|
+
browserName: string | null;
|
|
18
|
+
browserObject: any;
|
|
19
|
+
initScripts: InitScripts | null;
|
|
14
20
|
constructor();
|
|
15
21
|
}
|
|
16
22
|
export { TestContext };
|
package/lib/test_context.js
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
class TestContext {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
stable = null;
|
|
3
|
+
web = null;
|
|
4
|
+
browser = null;
|
|
5
|
+
playContext = null;
|
|
6
|
+
page = null;
|
|
7
|
+
environment = null;
|
|
8
|
+
reportFolder = null;
|
|
9
|
+
api = null;
|
|
10
|
+
navigate = false;
|
|
11
|
+
headless = false;
|
|
12
|
+
browserName = null;
|
|
13
|
+
browserObject = null;
|
|
14
|
+
initScripts = null;
|
|
15
|
+
constructor() { }
|
|
12
16
|
}
|
|
13
17
|
export { TestContext };
|
|
14
18
|
//# sourceMappingURL=test_context.js.map
|
package/lib/test_context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_context.js","sourceRoot":"","sources":["../../src/test_context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test_context.js","sourceRoot":"","sources":["../../src/test_context.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW;IACf,MAAM,GAAyB,IAAI,CAAC;IACpC,GAAG,GAAyB,IAAI,CAAC;IACjC,OAAO,GAA6B,IAAI,CAAC;IACzC,WAAW,GAA0B,IAAI,CAAC;IAC1C,IAAI,GAAgB,IAAI,CAAC;IACzB,WAAW,GAAuB,IAAI,CAAC;IACvC,YAAY,GAAkB,IAAI,CAAC;IACnC,GAAG,GAAe,IAAI,CAAC;IACvB,QAAQ,GAAG,KAAK,CAAC;IACjB,QAAQ,GAAG,KAAK,CAAC;IACjB,WAAW,GAAkB,IAAI,CAAC;IAClC,aAAa,GAAQ,IAAI,CAAC;IAC1B,WAAW,GAAuB,IAAI,CAAC;IACvC,gBAAe,CAAC;CACjB;AACD,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
1
|
declare function encrypt(text: string, key?: string | null): string;
|
|
2
|
-
declare function
|
|
3
|
-
|
|
2
|
+
declare function getTestDataValue(key: string, environment?: string): any;
|
|
3
|
+
declare function decrypt(encryptedText: string, key?: string | null, totpWait?: boolean): string;
|
|
4
|
+
export declare function testForRegex(text: string): boolean;
|
|
5
|
+
declare function _convertToRegexQuery(text: string, isRegex: boolean, fullMatch: boolean, ignoreCase: boolean): string;
|
|
6
|
+
declare function _getDataFile(world?: any, context?: any, web?: any): string;
|
|
7
|
+
declare function replaceWithLocalTestData(value: string, world: any, _decrypt?: boolean, totpWait?: boolean, context?: any, web?: any): Promise<string>;
|
|
8
|
+
declare function maskValue(value: string): string;
|
|
9
|
+
declare function _copyContext(from: any, to: any): void;
|
|
10
|
+
declare function scrollPageToLoadLazyElements(page: any): Promise<void>;
|
|
11
|
+
type Params = Record<string, string>;
|
|
12
|
+
declare function _fixUsingParams(text: string, _params: Params): string;
|
|
13
|
+
declare function getWebLogFile(logFolder: string): string;
|
|
14
|
+
declare function _fixLocatorUsingParams(locator: any, _params: Params): any;
|
|
15
|
+
declare function _isObject(value: any): any;
|
|
16
|
+
declare function scanAndManipulate(currentObj: any, _params: Params): void;
|
|
17
|
+
declare function extractStepExampleParameters(step: any): any;
|
|
18
|
+
export declare function performAction(action: string, element: any, options: any, web: any, state: any, _params: Params): Promise<void>;
|
|
19
|
+
declare const KEYBOARD_EVENTS: string[];
|
|
20
|
+
declare function unEscapeString(str: string): string;
|
|
21
|
+
declare function _getServerUrl(): string;
|
|
22
|
+
declare function tryParseJson(input: any): any;
|
|
23
|
+
export { encrypt, decrypt, replaceWithLocalTestData, maskValue, _copyContext, scrollPageToLoadLazyElements, _fixUsingParams, getWebLogFile, _fixLocatorUsingParams, _isObject, scanAndManipulate, KEYBOARD_EVENTS, unEscapeString, Params, _getServerUrl, _convertToRegexQuery, extractStepExampleParameters, _getDataFile, tryParseJson, getTestDataValue, };
|