automation_model 1.0.660-dev → 1.0.660-stage
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 +3 -1
- package/lib/analyze_helper.js.map +1 -1
- package/lib/api.d.ts +0 -1
- package/lib/api.js +6 -3
- package/lib/api.js.map +1 -1
- package/lib/auto_page.d.ts +1 -1
- package/lib/auto_page.js +145 -58
- package/lib/auto_page.js.map +1 -1
- package/lib/browser_manager.js +28 -8
- package/lib/browser_manager.js.map +1 -1
- package/lib/bruno.d.ts +2 -0
- package/lib/bruno.js +381 -0
- package/lib/bruno.js.map +1 -0
- package/lib/command_common.d.ts +1 -1
- package/lib/command_common.js +24 -4
- package/lib/command_common.js.map +1 -1
- package/lib/date_time.js.map +1 -1
- package/lib/drawRect.js.map +1 -1
- package/lib/environment.d.ts +1 -0
- package/lib/environment.js +1 -0
- package/lib/environment.js.map +1 -1
- package/lib/error-messages.js.map +1 -1
- package/lib/file_checker.d.ts +1 -0
- package/lib/file_checker.js +61 -0
- package/lib/file_checker.js.map +1 -0
- package/lib/find_function.js.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/init_browser.js +4 -4
- package/lib/init_browser.js.map +1 -1
- package/lib/locate_element.js.map +1 -1
- package/lib/locator.d.ts +1 -0
- package/lib/locator.js +10 -3
- package/lib/locator.js.map +1 -1
- package/lib/locator_log.js.map +1 -1
- package/lib/network.js.map +1 -1
- package/lib/route.d.ts +33 -0
- package/lib/route.js +268 -0
- package/lib/route.js.map +1 -0
- package/lib/scripts/axe.mini.js +3 -3
- package/lib/snapshot_validation.d.ts +37 -0
- package/lib/snapshot_validation.js +357 -0
- package/lib/snapshot_validation.js.map +1 -0
- package/lib/stable_browser.d.ts +64 -25
- package/lib/stable_browser.js +1036 -223
- package/lib/stable_browser.js.map +1 -1
- package/lib/table.d.ts +9 -7
- package/lib/table.js +82 -12
- package/lib/table.js.map +1 -1
- package/lib/table_analyze.js.map +1 -1
- package/lib/table_helper.js +15 -0
- package/lib/table_helper.js.map +1 -1
- package/lib/test_context.d.ts +1 -0
- package/lib/test_context.js +1 -0
- package/lib/test_context.js.map +1 -1
- package/lib/utils.d.ts +16 -2
- package/lib/utils.js +104 -58
- package/lib/utils.js.map +1 -1
- package/package.json +13 -6
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare function highlightSnapshot(snapshot: any, scope: any): Promise<void>;
|
|
2
|
+
/**
|
|
3
|
+
* One flattened line of an ARIA snapshot
|
|
4
|
+
*/
|
|
5
|
+
interface SnapshotLine {
|
|
6
|
+
/** original 0-based line number in the file that was parsed */
|
|
7
|
+
line: number;
|
|
8
|
+
/** the ARIA role / node name: “text”, “button”, “listitem”… */
|
|
9
|
+
key: string;
|
|
10
|
+
/** the textual value after the role, or null */
|
|
11
|
+
value: string | null;
|
|
12
|
+
/** indentation depth (0 = root, 1 = child of the previous level, …) */
|
|
13
|
+
level: number;
|
|
14
|
+
/** validation / parsing flags */
|
|
15
|
+
error: string | null;
|
|
16
|
+
/** interpret `value` as a RegExp instead of literal text */
|
|
17
|
+
regex: boolean;
|
|
18
|
+
/** the original line text */
|
|
19
|
+
line_text: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function fromLinesToSnapshotLines(lines: string[]): SnapshotLine[];
|
|
22
|
+
/**
|
|
23
|
+
* Successful-/error-report returned by `matchSnapshot`.
|
|
24
|
+
*
|
|
25
|
+
* ─ matchingLines … full-snapshot **original** line numbers that correspond
|
|
26
|
+
* to every line in the sub-snapshot (same order & length).
|
|
27
|
+
* ─ errorLine ….. first sub-snapshot index that could **not** be matched,
|
|
28
|
+
* or -1 when the whole sub-snapshot was found.
|
|
29
|
+
*/
|
|
30
|
+
export interface MatchResult {
|
|
31
|
+
matchingLines: number[];
|
|
32
|
+
errorLine: number;
|
|
33
|
+
errorLineText: string | null;
|
|
34
|
+
}
|
|
35
|
+
export declare function snapshotValidation(snapshot: string, referanceSnapshot: string, snapshotName: string): MatchResult;
|
|
36
|
+
export declare function matchSnapshot(full: SnapshotLine[], sub: SnapshotLine[], snapshotName: string): MatchResult;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
export async function highlightSnapshot(snapshot, scope) {
|
|
2
|
+
const lines = snapshot.split("\n");
|
|
3
|
+
const nodes = fromLinesToSnapshotLines(lines);
|
|
4
|
+
// build a SnapshotNode tree
|
|
5
|
+
const root = new SnapshotNode("root", null);
|
|
6
|
+
const stack = [root];
|
|
7
|
+
const allNodes = [];
|
|
8
|
+
for (const node of nodes) {
|
|
9
|
+
const newNode = new SnapshotNode(node.key, node.value);
|
|
10
|
+
allNodes.push(newNode);
|
|
11
|
+
newNode.level = node.level;
|
|
12
|
+
newNode.regex = node.regex;
|
|
13
|
+
if (node.level > stack.length - 1) {
|
|
14
|
+
// add to the last node
|
|
15
|
+
stack[stack.length - 1].children.push(newNode);
|
|
16
|
+
newNode.parent = stack[stack.length - 1];
|
|
17
|
+
stack.push(newNode);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
// pop the stack until we find the right level
|
|
21
|
+
while (stack.length > node.level + 1) {
|
|
22
|
+
stack.pop();
|
|
23
|
+
}
|
|
24
|
+
// add to the parent
|
|
25
|
+
stack[stack.length - 1].children.push(newNode);
|
|
26
|
+
newNode.parent = stack[stack.length - 1];
|
|
27
|
+
stack.push(newNode);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// go over all the nodes in the tree and generate an array of full locators
|
|
31
|
+
const locators = [];
|
|
32
|
+
for (const node of allNodes) {
|
|
33
|
+
const locator = node.getFullLocator();
|
|
34
|
+
locators.push(locator);
|
|
35
|
+
}
|
|
36
|
+
const elements = [];
|
|
37
|
+
// go over all the locators and find the elements
|
|
38
|
+
for (const locator of locators) {
|
|
39
|
+
const l = scope.locator(locator);
|
|
40
|
+
let count = 0;
|
|
41
|
+
try {
|
|
42
|
+
count = await l.count();
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
//console.log("Error in locator", locator, e);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
for (let i = 0; i < count; i++) {
|
|
49
|
+
const element = l.nth(i);
|
|
50
|
+
elements.push(element);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// go over all the elements and highlight them
|
|
54
|
+
for (const element of elements) {
|
|
55
|
+
try {
|
|
56
|
+
await element.evaluate((el) => {
|
|
57
|
+
if (!el?.style)
|
|
58
|
+
return;
|
|
59
|
+
const originalOutline = el.style.outline;
|
|
60
|
+
el.__previousOutline = originalOutline;
|
|
61
|
+
el.style.outline = "2px solid red";
|
|
62
|
+
if (window) {
|
|
63
|
+
window.addEventListener("beforeunload", function () {
|
|
64
|
+
el.style.outline = originalOutline;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
setTimeout(() => {
|
|
68
|
+
el.style.outline = originalOutline;
|
|
69
|
+
}, 4000);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (e) { }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/*
|
|
76
|
+
- banner:
|
|
77
|
+
- heading "Shop NOW" [level=6]
|
|
78
|
+
- text: Log In Username
|
|
79
|
+
- textbox "Username"
|
|
80
|
+
- text: Password
|
|
81
|
+
- textbox "Password"
|
|
82
|
+
- button "Login"
|
|
83
|
+
- paragraph: "Accepted usernames are:"
|
|
84
|
+
- list:
|
|
85
|
+
- listitem:
|
|
86
|
+
- paragraph: blinq_user
|
|
87
|
+
- listitem:
|
|
88
|
+
- paragraph: blinq_admin
|
|
89
|
+
- paragraph: "Password for all users:"
|
|
90
|
+
- paragraph: let_me_in
|
|
91
|
+
*/
|
|
92
|
+
class SnapshotNode {
|
|
93
|
+
key;
|
|
94
|
+
value;
|
|
95
|
+
role;
|
|
96
|
+
name;
|
|
97
|
+
level = 0;
|
|
98
|
+
regex = false;
|
|
99
|
+
children = [];
|
|
100
|
+
parent = null;
|
|
101
|
+
constructor(key, value) {
|
|
102
|
+
this.key = key;
|
|
103
|
+
this.value = value;
|
|
104
|
+
if (!key) {
|
|
105
|
+
throw new Error("Key cannot be null or undefined");
|
|
106
|
+
}
|
|
107
|
+
this.role = key.split(" ")[0];
|
|
108
|
+
if (this.value) {
|
|
109
|
+
this.name = this.value;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// the value will be from the first " to the last "
|
|
113
|
+
const start = key.indexOf('"') + 1;
|
|
114
|
+
const end = key.lastIndexOf('"');
|
|
115
|
+
if (start > -1 && end > -1 && start < end) {
|
|
116
|
+
this.name = key.substring(start, end);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.name = null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
generateNodeLocator() {
|
|
124
|
+
let locator = `internal:role=${this.role}`;
|
|
125
|
+
switch (this.role) {
|
|
126
|
+
case "paragraph":
|
|
127
|
+
// internal:role=paragraph >> internal:text='blinq_user'"
|
|
128
|
+
return `internal:role=${this.role} >> internal:text=${this.name}`;
|
|
129
|
+
default:
|
|
130
|
+
// "internal:role=textbox[name=\"Password\"]"
|
|
131
|
+
if (this.name) {
|
|
132
|
+
locator += `[name="${this.name}"]`;
|
|
133
|
+
}
|
|
134
|
+
return locator;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
getFullLocator() {
|
|
138
|
+
// create an array of all the parents and current node locators
|
|
139
|
+
const locators = [];
|
|
140
|
+
let currentNode = this;
|
|
141
|
+
while (currentNode) {
|
|
142
|
+
if (currentNode.role !== "root") {
|
|
143
|
+
locators.unshift(currentNode.generateNodeLocator());
|
|
144
|
+
}
|
|
145
|
+
currentNode = currentNode.parent;
|
|
146
|
+
}
|
|
147
|
+
// join the locators with " >> "
|
|
148
|
+
return locators.join(" >> ");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export function fromLinesToSnapshotLines(lines) {
|
|
152
|
+
// the input is yaml text split into lines, 2 spaces is 1 level
|
|
153
|
+
const nodes = [];
|
|
154
|
+
// identify the space count for tabulation
|
|
155
|
+
let previouseLineSpaceCount = -1;
|
|
156
|
+
let foundTabulationCount = -1;
|
|
157
|
+
// look for 2 consecutive lines that have different space counts, the absolute difference is the space count for tabulation
|
|
158
|
+
for (let i = 0; i < lines.length; i++) {
|
|
159
|
+
const line = lines[i];
|
|
160
|
+
const trimmedLine = line.trim();
|
|
161
|
+
if (trimmedLine.length === 0) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// count the number of leading spaces
|
|
165
|
+
const match = line.match(/^ */); // Matches spaces at the beginning
|
|
166
|
+
const count = match ? match[0].length : 0;
|
|
167
|
+
if (previouseLineSpaceCount !== -1 && previouseLineSpaceCount !== count) {
|
|
168
|
+
foundTabulationCount = Math.abs(previouseLineSpaceCount - count);
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
previouseLineSpaceCount = count;
|
|
172
|
+
}
|
|
173
|
+
if (foundTabulationCount === -1) {
|
|
174
|
+
foundTabulationCount = 2;
|
|
175
|
+
}
|
|
176
|
+
for (let i = 0; i < lines.length; i++) {
|
|
177
|
+
const line = lines[i];
|
|
178
|
+
const trimmedLine = line.trim();
|
|
179
|
+
if (trimmedLine.length === 0) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// count the number of leading spaces
|
|
183
|
+
let level = 0;
|
|
184
|
+
const match = line.match(/^ */); // Matches spaces at the beginning
|
|
185
|
+
const count = match ? match[0].length : 0;
|
|
186
|
+
level = count / foundTabulationCount; // 2 spaces is 1 level
|
|
187
|
+
// find the start of the line: - and space
|
|
188
|
+
const start = line.indexOf("- ") + 2;
|
|
189
|
+
if (start === -1) {
|
|
190
|
+
// no - found, set it to error
|
|
191
|
+
nodes.push({
|
|
192
|
+
line: i,
|
|
193
|
+
line_text: line,
|
|
194
|
+
key: line,
|
|
195
|
+
value: null,
|
|
196
|
+
level,
|
|
197
|
+
error: "No - found",
|
|
198
|
+
regex: false,
|
|
199
|
+
});
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// first we need to extract the role, we should find the first space or : after the start
|
|
203
|
+
const end = line.indexOf(" ", start);
|
|
204
|
+
const end2 = line.indexOf(":", start);
|
|
205
|
+
if (end === -1 && end2 === -1) {
|
|
206
|
+
// no space or : found, set it to error
|
|
207
|
+
nodes.push({
|
|
208
|
+
line: i,
|
|
209
|
+
line_text: line,
|
|
210
|
+
key: line,
|
|
211
|
+
value: null,
|
|
212
|
+
level,
|
|
213
|
+
error: "No space or : found",
|
|
214
|
+
regex: false,
|
|
215
|
+
});
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
const endIndex = end === -1 ? end2 : end2 === -1 ? end : Math.min(end, end2);
|
|
219
|
+
const key = line.substring(start, endIndex).trim();
|
|
220
|
+
// define value is string or null
|
|
221
|
+
let value = line.substring(endIndex + 1).trim();
|
|
222
|
+
if (value.startsWith('"')) {
|
|
223
|
+
const lastQuote = value.lastIndexOf('"');
|
|
224
|
+
if (lastQuote !== -1) {
|
|
225
|
+
value = value.substring(0, lastQuote + 1);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// improved regex detection
|
|
229
|
+
const rawValue = value.endsWith(":") ? value.slice(0, -1) : value;
|
|
230
|
+
const regex = rawValue.startsWith("/") && /\/[a-z]*$/.test(rawValue);
|
|
231
|
+
nodes.push({
|
|
232
|
+
line: i,
|
|
233
|
+
line_text: line,
|
|
234
|
+
key,
|
|
235
|
+
value: value.length > 0 ? value : null,
|
|
236
|
+
level,
|
|
237
|
+
error: null,
|
|
238
|
+
regex,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
return nodes;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Turn a “/pattern/flags” string into a real RegExp.
|
|
245
|
+
*/
|
|
246
|
+
function toRegExp(raw) {
|
|
247
|
+
// Remove trailing colon from YAML-style key: /pattern/: → /pattern/
|
|
248
|
+
const sanitized = raw.endsWith(":") ? raw.slice(0, -1) : raw;
|
|
249
|
+
if (!sanitized.startsWith("/"))
|
|
250
|
+
return new RegExp(sanitized);
|
|
251
|
+
const lastSlash = sanitized.lastIndexOf("/");
|
|
252
|
+
const pattern = sanitized.slice(1, lastSlash);
|
|
253
|
+
const flags = sanitized.slice(lastSlash + 1); // i, g, etc.
|
|
254
|
+
return new RegExp(pattern, flags);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Single-line comparison with fixed regex handling.
|
|
258
|
+
*/
|
|
259
|
+
function lineMatches(full, sub) {
|
|
260
|
+
let status = { status: false };
|
|
261
|
+
if (full.key !== sub.key)
|
|
262
|
+
return status;
|
|
263
|
+
// We handle level offset outside this function
|
|
264
|
+
if (sub.value === null) {
|
|
265
|
+
status.status = true;
|
|
266
|
+
return status;
|
|
267
|
+
}
|
|
268
|
+
if (sub.regex) {
|
|
269
|
+
status.status = toRegExp(sub.value).test(full.value ?? "");
|
|
270
|
+
}
|
|
271
|
+
else if (full.regex) {
|
|
272
|
+
status.status = toRegExp(full.value).test(sub.value ?? "");
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
status.status = full.value === sub.value;
|
|
276
|
+
}
|
|
277
|
+
return status;
|
|
278
|
+
}
|
|
279
|
+
export function snapshotValidation(snapshot, referanceSnapshot, snapshotName) {
|
|
280
|
+
const lines = snapshot.split("\n");
|
|
281
|
+
const nodes = fromLinesToSnapshotLines(lines);
|
|
282
|
+
const subLines = referanceSnapshot.split("\n");
|
|
283
|
+
const subNodes = fromLinesToSnapshotLines(subLines);
|
|
284
|
+
return matchSnapshot(nodes, subNodes, snapshotName);
|
|
285
|
+
}
|
|
286
|
+
export function matchSnapshot(full, sub, snapshotName) {
|
|
287
|
+
const parentIdx = sub.map((_, i) => {
|
|
288
|
+
for (let j = i - 1; j >= 0; j--)
|
|
289
|
+
if (sub[j].level < sub[i].level)
|
|
290
|
+
return j;
|
|
291
|
+
return -1;
|
|
292
|
+
});
|
|
293
|
+
const fullIdx = new Array(sub.length);
|
|
294
|
+
const mapping = new Array(sub.length);
|
|
295
|
+
let failureAt = -1;
|
|
296
|
+
function dfs(s, fFrom, baseLevelOffset) {
|
|
297
|
+
if (s === sub.length)
|
|
298
|
+
return true;
|
|
299
|
+
for (let f = fFrom; f < full.length; f++) {
|
|
300
|
+
let levelMatch = true;
|
|
301
|
+
if (baseLevelOffset !== null) {
|
|
302
|
+
// Must match levels relative to initial offset
|
|
303
|
+
if (full[f].level !== sub[s].level + baseLevelOffset)
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const status = lineMatches(full[f], sub[s]);
|
|
307
|
+
if (!status.status)
|
|
308
|
+
continue;
|
|
309
|
+
// For first match, set level offset
|
|
310
|
+
const nextBaseOffset = baseLevelOffset !== null ? baseLevelOffset : full[f].level - sub[s].level;
|
|
311
|
+
const pSub = parentIdx[s];
|
|
312
|
+
if (pSub !== -1) {
|
|
313
|
+
let pFull = f - 1;
|
|
314
|
+
while (pFull >= 0 && full[pFull].level >= full[f].level)
|
|
315
|
+
pFull--;
|
|
316
|
+
if (pFull < 0 || pFull !== fullIdx[pSub])
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
fullIdx[s] = f;
|
|
320
|
+
mapping[s] = full[f].line;
|
|
321
|
+
if (dfs(s + 1, f + 1, nextBaseOffset))
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
if (failureAt === -1)
|
|
325
|
+
failureAt = s;
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
const found = dfs(0, 0, null);
|
|
329
|
+
let error = null;
|
|
330
|
+
if (!found) {
|
|
331
|
+
error = `Snapshot file: ${snapshotName}\nLine no.: ${sub[failureAt].line}\nLine: ${sub[failureAt].line_text}`;
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
matchingLines: found ? mapping : mapping.slice(0, failureAt),
|
|
335
|
+
errorLine: found ? -1 : failureAt,
|
|
336
|
+
errorLineText: error,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
// let ttt = `- banner:
|
|
340
|
+
// - heading "Shop NOW" [level=6]
|
|
341
|
+
// - text: Log In Username
|
|
342
|
+
// - textbox "Username"
|
|
343
|
+
// - text: Password
|
|
344
|
+
// - textbox "Password"
|
|
345
|
+
// - button "Login"
|
|
346
|
+
// - paragraph: "Accepted usernames are:"
|
|
347
|
+
// - list:
|
|
348
|
+
// - listitem:
|
|
349
|
+
// - paragraph: blinq_user
|
|
350
|
+
// - listitem:
|
|
351
|
+
// - paragraph: blinq_admin
|
|
352
|
+
// - paragraph: "Password for all users:"
|
|
353
|
+
// - paragraph: let_me_in`;
|
|
354
|
+
// const lines = ttt.split("\n");
|
|
355
|
+
// const nodes = fromLinesToSnapshotLines(lines);
|
|
356
|
+
// console.log("nodes", nodes);
|
|
357
|
+
//# sourceMappingURL=snapshot_validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot_validation.js","sourceRoot":"","sources":["../../src/snapshot_validation.ts"],"names":[],"mappings":"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"}
|
package/lib/stable_browser.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export declare const Types: {
|
|
|
4
4
|
CLICK: string;
|
|
5
5
|
WAIT_ELEMENT: string;
|
|
6
6
|
NAVIGATE: string;
|
|
7
|
+
GO_BACK: string;
|
|
8
|
+
GO_FORWARD: string;
|
|
7
9
|
FILL: string;
|
|
8
10
|
EXECUTE: string;
|
|
9
11
|
OPEN: string;
|
|
@@ -17,6 +19,7 @@ export declare const Types: {
|
|
|
17
19
|
ANALYZE_TABLE: string;
|
|
18
20
|
SELECT: string;
|
|
19
21
|
VERIFY_PAGE_PATH: string;
|
|
22
|
+
VERIFY_PAGE_TITLE: string;
|
|
20
23
|
TYPE_PRESS: string;
|
|
21
24
|
PRESS: string;
|
|
22
25
|
HOVER: string;
|
|
@@ -33,6 +36,14 @@ export declare const Types: {
|
|
|
33
36
|
WAIT_FOR_TEXT_TO_DISAPPEAR: string;
|
|
34
37
|
VERIFY_ATTRIBUTE: string;
|
|
35
38
|
VERIFY_TEXT_WITH_RELATION: string;
|
|
39
|
+
BRUNO: string;
|
|
40
|
+
VERIFY_FILE_EXISTS: string;
|
|
41
|
+
SET_INPUT_FILES: string;
|
|
42
|
+
SNAPSHOT_VALIDATION: string;
|
|
43
|
+
REPORT_COMMAND: string;
|
|
44
|
+
STEP_COMPLETE: string;
|
|
45
|
+
SLEEP: string;
|
|
46
|
+
CONDITIONAL_WAIT: string;
|
|
36
47
|
};
|
|
37
48
|
export declare const apps: {};
|
|
38
49
|
declare class StableBrowser {
|
|
@@ -41,6 +52,7 @@ declare class StableBrowser {
|
|
|
41
52
|
logger: any;
|
|
42
53
|
context: any;
|
|
43
54
|
world?: any;
|
|
55
|
+
fastMode: boolean;
|
|
44
56
|
project_path: null;
|
|
45
57
|
webLogFile: null;
|
|
46
58
|
networkLogger: null;
|
|
@@ -49,19 +61,22 @@ declare class StableBrowser {
|
|
|
49
61
|
tags: null;
|
|
50
62
|
isRecording: boolean;
|
|
51
63
|
initSnapshotTaken: boolean;
|
|
52
|
-
constructor(browser: Browser, page: Page, logger?: any, context?: any, world?: any);
|
|
64
|
+
constructor(browser: Browser, page: Page, logger?: any, context?: any, world?: any, fastMode?: boolean);
|
|
53
65
|
registerEventListeners(context: any): void;
|
|
54
66
|
switchApp(appName: any): Promise<void>;
|
|
67
|
+
switchTab(tabTitleOrIndex: number | string): Promise<void>;
|
|
55
68
|
registerConsoleLogListener(page: Page, context: any): void;
|
|
56
69
|
registerRequestListener(page: Page, context: any, logFile: string): void;
|
|
57
70
|
goto(url: string, world?: null): Promise<void>;
|
|
71
|
+
goBack(options: any, world?: null): Promise<void>;
|
|
72
|
+
goForward(options: any, world?: null): Promise<void>;
|
|
58
73
|
_getLocator(locator: any, scope: any, _params: any): Promise<any>;
|
|
59
74
|
_locateElmentByTextClimbCss(scope: any, text: any, climb: any, css: any, _params: Params): Promise<string | undefined>;
|
|
60
75
|
_locateElementByText(scope: any, text1: any, tag1: any, regex1: boolean | undefined, partial1: any, ignoreCase: boolean | undefined, _params: Params): Promise<{
|
|
61
76
|
elementCount: number;
|
|
62
77
|
randomToken: string;
|
|
63
78
|
}>;
|
|
64
|
-
_collectLocatorInformation(selectorHierarchy: any, index: number | undefined, scope: any, foundLocators: any, _params: Params, info: any, visibleOnly?: boolean, allowDisabled?: boolean | undefined, element_name?: null): Promise<void>;
|
|
79
|
+
_collectLocatorInformation(selectorHierarchy: any, index: number | undefined, scope: any, foundLocators: any, _params: Params, info: any, visibleOnly?: boolean, allowDisabled?: boolean | undefined, element_name?: null, logErrors?: boolean | undefined): Promise<void>;
|
|
65
80
|
closeUnexpectedPopups(info: any, _params: any): Promise<{
|
|
66
81
|
rerun: boolean;
|
|
67
82
|
}>;
|
|
@@ -69,7 +84,7 @@ declare class StableBrowser {
|
|
|
69
84
|
_findFrameScope(selectors: any, timeout: number | undefined, info: any): Promise<any>;
|
|
70
85
|
_getDocumentBody(selectors: any, timeout: number | undefined, info: any): Promise<any>;
|
|
71
86
|
_locate_internal(selectors: any, info: any, _params?: Params, timeout?: number, allowDisabled?: boolean | undefined): Promise<any>;
|
|
72
|
-
_scanLocatorsGroup(locatorsGroup: any, scope: any, _params: any, info: any, visibleOnly: any, allowDisabled?: boolean | undefined, element_name: any): Promise<{
|
|
87
|
+
_scanLocatorsGroup(locatorsGroup: any, scope: any, _params: any, info: any, visibleOnly: any, allowDisabled?: boolean | undefined, element_name: any, logErrors?: boolean | undefined): Promise<{
|
|
73
88
|
foundElements: any[];
|
|
74
89
|
}>;
|
|
75
90
|
simpleClick(elementDescription: any, _params?: Params, options?: {}, world?: null): Promise<void>;
|
|
@@ -84,6 +99,7 @@ declare class StableBrowser {
|
|
|
84
99
|
setDateTime(selectors: any, value: any, format?: null, enter?: boolean, _params?: null, options?: {}, world?: null): Promise<void>;
|
|
85
100
|
clickType(selectors: any, _value: any, enter?: boolean, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
86
101
|
fill(selectors: any, value: any, enter?: boolean, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
102
|
+
setInputFiles(selectors: any, files: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
87
103
|
getText(selectors: any, _params?: null, options?: {}, info?: {}, world?: null): Promise<{
|
|
88
104
|
text: any;
|
|
89
105
|
screenshotId: any;
|
|
@@ -112,6 +128,7 @@ declare class StableBrowser {
|
|
|
112
128
|
}>;
|
|
113
129
|
containsPattern(selectors: any, pattern: any, text: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
114
130
|
containsText(selectors: any, text: any, climb: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
131
|
+
snapshotValidation(frameSelectors: any, referanceSnapshot: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
115
132
|
waitForUserInput(message: any, world?: null): Promise<void>;
|
|
116
133
|
setTestData(testData: any, world?: null): void;
|
|
117
134
|
overwriteTestData(testData: any, world?: null): void;
|
|
@@ -128,14 +145,36 @@ declare class StableBrowser {
|
|
|
128
145
|
takeScreenshot(screenshotPath: any): Promise<any>;
|
|
129
146
|
verifyElementExistInPage(selectors: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
130
147
|
extractAttribute(selectors: any, attribute: any, variable: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
148
|
+
extractProperty(selectors: any, property: any, variable: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
131
149
|
verifyAttribute(selectors: any, attribute: any, value: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
150
|
+
verifyProperty(selectors: any, property: any, value: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
151
|
+
conditionalWait(selectors: any, condition: any, timeout?: number, _params?: null, options?: {}, world?: null): Promise<{}>;
|
|
132
152
|
extractEmailData(emailAddress: any, options: any, world: any): Promise<{
|
|
133
153
|
emailUrl: any;
|
|
134
154
|
emailCode: any;
|
|
135
155
|
}>;
|
|
136
156
|
_highlightElements(scope: any, css: any): Promise<void>;
|
|
137
|
-
|
|
138
|
-
|
|
157
|
+
_matcher(text: any): {
|
|
158
|
+
matcher: any;
|
|
159
|
+
queryText: any;
|
|
160
|
+
};
|
|
161
|
+
_getDomain(url: string): string;
|
|
162
|
+
/**
|
|
163
|
+
* Verify the page path matches the given path.
|
|
164
|
+
* @param {string} pathPart - The path to verify.
|
|
165
|
+
* @param {object} options - Options for verification.
|
|
166
|
+
* @param {object} world - The world context.
|
|
167
|
+
* @returns {Promise<object>} - The state info after verification.
|
|
168
|
+
*/
|
|
169
|
+
verifyPagePath(pathPart: string, options?: object, world?: object): Promise<object>;
|
|
170
|
+
/**
|
|
171
|
+
* Verify the page title matches the given title.
|
|
172
|
+
* @param {string} title - The title to verify.
|
|
173
|
+
* @param {object} options - Options for verification.
|
|
174
|
+
* @param {object} world - The world context.
|
|
175
|
+
* @returns {Promise<object>} - The state info after verification.
|
|
176
|
+
*/
|
|
177
|
+
verifyPageTitle(title: string, options?: object, world?: object): Promise<object>;
|
|
139
178
|
findTextInAllFrames(dateAlternatives: any, numberAlternatives: any, text: any, state: any, partial?: boolean, ignoreCase?: boolean): Promise<{
|
|
140
179
|
elementCount: number;
|
|
141
180
|
randomToken: string;
|
|
@@ -151,6 +190,14 @@ declare class StableBrowser {
|
|
|
151
190
|
verifyTableData(selectors: any, data: any, _params?: null, options?: {}, world?: null): Promise<void>;
|
|
152
191
|
getTableData(selectors: any, _params?: null, options?: {}, world?: null): Promise<any>;
|
|
153
192
|
analyzeTable(selectors: any, query: any, operator: any, value: any, _params?: null, options?: {}, world?: null): Promise<{} | undefined>;
|
|
193
|
+
/**
|
|
194
|
+
* Explicit wait/sleep function that pauses execution for a specified duration
|
|
195
|
+
* @param duration - Duration to sleep in milliseconds (default: 1000ms)
|
|
196
|
+
* @param options - Optional configuration object
|
|
197
|
+
* @param world - Optional world context
|
|
198
|
+
* @returns Promise that resolves after the specified duration
|
|
199
|
+
*/
|
|
200
|
+
sleep(duration?: number, options?: {}, world?: null): Promise<any>;
|
|
154
201
|
_replaceWithLocalData(value: any, world: any, _decrypt?: boolean, totpWait?: boolean): Promise<string>;
|
|
155
202
|
_getLoadTimeout(options: any): number;
|
|
156
203
|
_getFindElementTimeout(options: any): any;
|
|
@@ -163,28 +210,20 @@ declare class StableBrowser {
|
|
|
163
210
|
setViewportSize(width: number, hight: number, options?: {}, world?: null): Promise<void>;
|
|
164
211
|
reloadPage(options?: {}, world?: null): Promise<void>;
|
|
165
212
|
scrollIfNeeded(element: any, info: any): Promise<void>;
|
|
213
|
+
beforeScenario(world: any, scenario: any): Promise<void>;
|
|
214
|
+
afterScenario(world: any, scenario: any): Promise<void>;
|
|
166
215
|
beforeStep(world: any, step: any): Promise<void>;
|
|
167
216
|
getAriaSnapshot(): Promise<string | null>;
|
|
217
|
+
/**
|
|
218
|
+
* Sends command with custom payload to report.
|
|
219
|
+
* @param commandText - Title of the command to be shown in the report.
|
|
220
|
+
* @param commandStatus - Status of the command (e.g. "PASSED", "FAILED").
|
|
221
|
+
* @param content - Content of the command to be shown in the report.
|
|
222
|
+
* @param options - Options for the command. Example: { type: "json", screenshot: true }
|
|
223
|
+
* @param world - Optional world context.
|
|
224
|
+
* @public
|
|
225
|
+
*/
|
|
226
|
+
addCommandToReport(commandText: string, commandStatus: "PASSED" | "FAILED", content: string, options?: any, world?: any): Promise<void>;
|
|
168
227
|
afterStep(world: any, step: any): Promise<void>;
|
|
169
228
|
}
|
|
170
|
-
type JsonTimestamp = number;
|
|
171
|
-
type JsonResultPassed = {
|
|
172
|
-
status: "PASSED";
|
|
173
|
-
startTime: JsonTimestamp;
|
|
174
|
-
endTime: JsonTimestamp;
|
|
175
|
-
};
|
|
176
|
-
type JsonResultFailed = {
|
|
177
|
-
status: "FAILED";
|
|
178
|
-
startTime: JsonTimestamp;
|
|
179
|
-
endTime: JsonTimestamp;
|
|
180
|
-
message?: string;
|
|
181
|
-
};
|
|
182
|
-
type JsonCommandResult = JsonResultPassed | JsonResultFailed;
|
|
183
|
-
export type JsonCommandReport = {
|
|
184
|
-
type: string;
|
|
185
|
-
value?: string;
|
|
186
|
-
text: string;
|
|
187
|
-
screenshotId?: string;
|
|
188
|
-
result: JsonCommandResult;
|
|
189
|
-
};
|
|
190
229
|
export { StableBrowser };
|