ftmocks-utils 1.5.2 → 1.5.4
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/package.json +1 -1
- package/src/event-run-utils.js +1 -1
- package/src/event-utils.js +47 -33
package/package.json
CHANGED
package/src/event-run-utils.js
CHANGED
|
@@ -240,7 +240,7 @@ const runEvent = async ({
|
|
|
240
240
|
break;
|
|
241
241
|
case "keypress":
|
|
242
242
|
await beforeEvent();
|
|
243
|
-
await page.keyboard.press(
|
|
243
|
+
await page.keyboard.press(event.key);
|
|
244
244
|
break;
|
|
245
245
|
case "change":
|
|
246
246
|
await beforeEvent();
|
package/src/event-utils.js
CHANGED
|
@@ -6,14 +6,15 @@ const injectEventRecordingScript = async (
|
|
|
6
6
|
page,
|
|
7
7
|
url,
|
|
8
8
|
ftmocksConifg,
|
|
9
|
-
testName
|
|
9
|
+
testName,
|
|
10
|
+
continueRecordEvents = false,
|
|
10
11
|
) => {
|
|
11
12
|
console.log("calling injectEventRecordingScript");
|
|
12
13
|
try {
|
|
13
14
|
const eventsFile = path.join(
|
|
14
15
|
getMockDir(ftmocksConifg),
|
|
15
16
|
`test_${nameToFolder(testName)}`,
|
|
16
|
-
`_events.json
|
|
17
|
+
`_events.json`,
|
|
17
18
|
);
|
|
18
19
|
if (!fs.existsSync(eventsFile)) {
|
|
19
20
|
// Ensure the directory exists before writing the eventsFile
|
|
@@ -32,7 +33,7 @@ const injectEventRecordingScript = async (
|
|
|
32
33
|
const screenshotsDir = path.join(
|
|
33
34
|
getMockDir(ftmocksConifg),
|
|
34
35
|
`test_${nameToFolder(testName)}`,
|
|
35
|
-
"screenshots"
|
|
36
|
+
"screenshots",
|
|
36
37
|
);
|
|
37
38
|
if (!fs.existsSync(screenshotsDir)) {
|
|
38
39
|
fs.mkdirSync(screenshotsDir, { recursive: true });
|
|
@@ -41,7 +42,7 @@ const injectEventRecordingScript = async (
|
|
|
41
42
|
getMockDir(ftmocksConifg),
|
|
42
43
|
`test_${nameToFolder(testName)}`,
|
|
43
44
|
"screenshots",
|
|
44
|
-
`screenshot_${imgOptions.name}.png
|
|
45
|
+
`screenshot_${imgOptions.name}.png`,
|
|
45
46
|
);
|
|
46
47
|
fs.writeFileSync(screenshotFile, screenshot);
|
|
47
48
|
return screenshotFile;
|
|
@@ -72,10 +73,23 @@ const injectEventRecordingScript = async (
|
|
|
72
73
|
fs.writeFileSync(eventsFile, JSON.stringify(events, null, 2));
|
|
73
74
|
});
|
|
74
75
|
|
|
76
|
+
let existingEvents = [];
|
|
77
|
+
// Read events from events file, if it exists
|
|
78
|
+
if (continueRecordEvents && fs.existsSync(eventsFile)) {
|
|
79
|
+
try {
|
|
80
|
+
const data = fs.readFileSync(eventsFile, "utf8");
|
|
81
|
+
existingEvents = JSON.parse(data);
|
|
82
|
+
} catch (err) {
|
|
83
|
+
console.error("Failed to read events file:", err);
|
|
84
|
+
existingEvents = [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
75
88
|
fs.writeFileSync(
|
|
76
89
|
eventsFile,
|
|
77
90
|
JSON.stringify(
|
|
78
91
|
[
|
|
92
|
+
...existingEvents,
|
|
79
93
|
{
|
|
80
94
|
id: crypto.randomUUID(),
|
|
81
95
|
type: "url",
|
|
@@ -85,8 +99,8 @@ const injectEventRecordingScript = async (
|
|
|
85
99
|
},
|
|
86
100
|
],
|
|
87
101
|
null,
|
|
88
|
-
2
|
|
89
|
-
)
|
|
102
|
+
2,
|
|
103
|
+
),
|
|
90
104
|
);
|
|
91
105
|
await page.addInitScript(() => {
|
|
92
106
|
console.log("calling addInitScript");
|
|
@@ -149,7 +163,7 @@ const injectEventRecordingScript = async (
|
|
|
149
163
|
doc,
|
|
150
164
|
null,
|
|
151
165
|
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
|
|
152
|
-
null
|
|
166
|
+
null,
|
|
153
167
|
);
|
|
154
168
|
const elements = [];
|
|
155
169
|
for (let i = 0; i < snapshot.snapshotLength; i++) {
|
|
@@ -224,7 +238,7 @@ const injectEventRecordingScript = async (
|
|
|
224
238
|
document,
|
|
225
239
|
null,
|
|
226
240
|
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
|
|
227
|
-
null
|
|
241
|
+
null,
|
|
228
242
|
);
|
|
229
243
|
return elements.snapshotLength === 1;
|
|
230
244
|
} catch (error) {
|
|
@@ -238,7 +252,7 @@ const injectEventRecordingScript = async (
|
|
|
238
252
|
const getUniqueXpath = (xpath, mainElement) => {
|
|
239
253
|
const prevElements = filterXpathElementsFromHtml(
|
|
240
254
|
prevEventSnapshot,
|
|
241
|
-
xpath
|
|
255
|
+
xpath,
|
|
242
256
|
);
|
|
243
257
|
if (prevElements.snapshotLength > 1 && mainElement) {
|
|
244
258
|
return `(${xpath})[${
|
|
@@ -251,7 +265,7 @@ const injectEventRecordingScript = async (
|
|
|
251
265
|
const getUniqueElementSelectorNth = (selector, mainElement) => {
|
|
252
266
|
const prevElements = filterElementsFromHtml(
|
|
253
267
|
prevEventSnapshot,
|
|
254
|
-
selector
|
|
268
|
+
selector,
|
|
255
269
|
);
|
|
256
270
|
if (prevElements.length > 1) {
|
|
257
271
|
return getElementsByRank(prevElements, mainElement)[0].index + 1;
|
|
@@ -264,11 +278,11 @@ const injectEventRecordingScript = async (
|
|
|
264
278
|
if (selector.value.startsWith("/")) {
|
|
265
279
|
const prevElements = filterXpathElementsFromHtml(
|
|
266
280
|
prevEventSnapshot,
|
|
267
|
-
selector.value
|
|
281
|
+
selector.value,
|
|
268
282
|
);
|
|
269
283
|
const nextElements = filterXpathElementsFromHtml(
|
|
270
284
|
currentEventSnapshot,
|
|
271
|
-
selector.value
|
|
285
|
+
selector.value,
|
|
272
286
|
);
|
|
273
287
|
return {
|
|
274
288
|
selector: selector.value,
|
|
@@ -278,11 +292,11 @@ const injectEventRecordingScript = async (
|
|
|
278
292
|
} else {
|
|
279
293
|
const prevElements = filterElementsFromHtml(
|
|
280
294
|
prevEventSnapshot,
|
|
281
|
-
selector.value
|
|
295
|
+
selector.value,
|
|
282
296
|
);
|
|
283
297
|
const nextElements = filterElementsFromHtml(
|
|
284
298
|
currentEventSnapshot,
|
|
285
|
-
selector.value
|
|
299
|
+
selector.value,
|
|
286
300
|
);
|
|
287
301
|
return {
|
|
288
302
|
selector: selector.value,
|
|
@@ -313,13 +327,13 @@ const injectEventRecordingScript = async (
|
|
|
313
327
|
selectors.push({
|
|
314
328
|
type: "locator",
|
|
315
329
|
value: `${tagName}[data-testid='${element.getAttribute(
|
|
316
|
-
"data-testid"
|
|
330
|
+
"data-testid",
|
|
317
331
|
)}']`,
|
|
318
332
|
nth: getUniqueElementSelectorNth(
|
|
319
333
|
`${tagName}[data-testid='${element.getAttribute(
|
|
320
|
-
"data-testid"
|
|
334
|
+
"data-testid",
|
|
321
335
|
)}']`,
|
|
322
|
-
element
|
|
336
|
+
element,
|
|
323
337
|
),
|
|
324
338
|
});
|
|
325
339
|
}
|
|
@@ -329,7 +343,7 @@ const injectEventRecordingScript = async (
|
|
|
329
343
|
value: `${tagName}[data-id='${element.getAttribute("data-id")}']`,
|
|
330
344
|
nth: getUniqueElementSelectorNth(
|
|
331
345
|
`${tagName}[data-id='${element.getAttribute("data-id")}']`,
|
|
332
|
-
element
|
|
346
|
+
element,
|
|
333
347
|
),
|
|
334
348
|
});
|
|
335
349
|
}
|
|
@@ -337,13 +351,13 @@ const injectEventRecordingScript = async (
|
|
|
337
351
|
selectors.push({
|
|
338
352
|
type: "locator",
|
|
339
353
|
value: `${tagName}[data-action='${element.getAttribute(
|
|
340
|
-
"data-action"
|
|
354
|
+
"data-action",
|
|
341
355
|
)}']`,
|
|
342
356
|
nth: getUniqueElementSelectorNth(
|
|
343
357
|
`${tagName}[data-action='${element.getAttribute(
|
|
344
|
-
"data-action"
|
|
358
|
+
"data-action",
|
|
345
359
|
)}']`,
|
|
346
|
-
element
|
|
360
|
+
element,
|
|
347
361
|
),
|
|
348
362
|
});
|
|
349
363
|
}
|
|
@@ -353,7 +367,7 @@ const injectEventRecordingScript = async (
|
|
|
353
367
|
value: `${tagName}[data-cy='${element.getAttribute("data-cy")}']`,
|
|
354
368
|
nth: getUniqueElementSelectorNth(
|
|
355
369
|
`${tagName}[data-cy='${element.getAttribute("data-cy")}']`,
|
|
356
|
-
element
|
|
370
|
+
element,
|
|
357
371
|
),
|
|
358
372
|
});
|
|
359
373
|
}
|
|
@@ -367,7 +381,7 @@ const injectEventRecordingScript = async (
|
|
|
367
381
|
value: `${tagName}[name='${element.name}']`,
|
|
368
382
|
nth: getUniqueElementSelectorNth(
|
|
369
383
|
`${tagName}[name='${element.name}']`,
|
|
370
|
-
element
|
|
384
|
+
element,
|
|
371
385
|
),
|
|
372
386
|
});
|
|
373
387
|
} else if (
|
|
@@ -380,7 +394,7 @@ const injectEventRecordingScript = async (
|
|
|
380
394
|
value: `${tagName}[name='${element.name}'][value='${element.value}']`,
|
|
381
395
|
nth: getUniqueElementSelectorNth(
|
|
382
396
|
`${tagName}[name='${element.name}'][value='${element.value}']`,
|
|
383
|
-
element
|
|
397
|
+
element,
|
|
384
398
|
),
|
|
385
399
|
});
|
|
386
400
|
}
|
|
@@ -390,7 +404,7 @@ const injectEventRecordingScript = async (
|
|
|
390
404
|
value: `${tagName}[aria-label='${element.ariaLabel}']`,
|
|
391
405
|
nth: getUniqueElementSelectorNth(
|
|
392
406
|
`${tagName}[aria-label='${element.ariaLabel}']`,
|
|
393
|
-
element
|
|
407
|
+
element,
|
|
394
408
|
),
|
|
395
409
|
});
|
|
396
410
|
}
|
|
@@ -400,7 +414,7 @@ const injectEventRecordingScript = async (
|
|
|
400
414
|
value: `${tagName}[role='${element.role}'][name='${element.name}']`,
|
|
401
415
|
nth: getUniqueElementSelectorNth(
|
|
402
416
|
`${tagName}[role='${element.role}'][name='${element.name}']`,
|
|
403
|
-
element
|
|
417
|
+
element,
|
|
404
418
|
),
|
|
405
419
|
});
|
|
406
420
|
}
|
|
@@ -410,7 +424,7 @@ const injectEventRecordingScript = async (
|
|
|
410
424
|
value: `${tagName}[src='${element.getAttribute("src")}']`,
|
|
411
425
|
nth: getUniqueElementSelectorNth(
|
|
412
426
|
`${tagName}[src='${element.getAttribute("src")}']`,
|
|
413
|
-
element
|
|
427
|
+
element,
|
|
414
428
|
),
|
|
415
429
|
});
|
|
416
430
|
}
|
|
@@ -420,7 +434,7 @@ const injectEventRecordingScript = async (
|
|
|
420
434
|
value: `${tagName}[href='${element.getAttribute("href")}']`,
|
|
421
435
|
nth: getUniqueElementSelectorNth(
|
|
422
436
|
`${tagName}[href='${element.getAttribute("href")}']`,
|
|
423
|
-
element
|
|
437
|
+
element,
|
|
424
438
|
),
|
|
425
439
|
});
|
|
426
440
|
}
|
|
@@ -433,7 +447,7 @@ const injectEventRecordingScript = async (
|
|
|
433
447
|
type: "locator",
|
|
434
448
|
value: getUniqueXpath(
|
|
435
449
|
`//${tagName}[@role='${element.role}' and normalize-space(.) = '${escapedText}']`,
|
|
436
|
-
element
|
|
450
|
+
element,
|
|
437
451
|
),
|
|
438
452
|
});
|
|
439
453
|
}
|
|
@@ -448,7 +462,7 @@ const injectEventRecordingScript = async (
|
|
|
448
462
|
.replace(/'/g, "\\'")
|
|
449
463
|
.replace(/\s+/g, " ")
|
|
450
464
|
.trim()}']`,
|
|
451
|
-
event.target
|
|
465
|
+
event.target,
|
|
452
466
|
),
|
|
453
467
|
});
|
|
454
468
|
}
|
|
@@ -604,7 +618,7 @@ const injectEventRecordingScript = async (
|
|
|
604
618
|
target.getAttribute(`on${eventType}`) ||
|
|
605
619
|
target.getAttribute(`${eventType}`) ||
|
|
606
620
|
target.getAttribute(
|
|
607
|
-
`${eventType.charAt(0).toUpperCase() + eventType.slice(1)}
|
|
621
|
+
`${eventType.charAt(0).toUpperCase() + eventType.slice(1)}`,
|
|
608
622
|
)
|
|
609
623
|
) {
|
|
610
624
|
return target;
|
|
@@ -677,7 +691,7 @@ const injectEventRecordingScript = async (
|
|
|
677
691
|
currentEventSnapshot = document.documentElement.innerHTML;
|
|
678
692
|
const currentTarget = getParentElementWithEventOrId(
|
|
679
693
|
event,
|
|
680
|
-
"ondblclick"
|
|
694
|
+
"ondblclick",
|
|
681
695
|
);
|
|
682
696
|
const selectors = getBestSelectors(currentTarget, event);
|
|
683
697
|
getXpathsIncluded(selectors, currentTarget, event);
|
|
@@ -699,7 +713,7 @@ const injectEventRecordingScript = async (
|
|
|
699
713
|
currentEventSnapshot = document.documentElement.innerHTML;
|
|
700
714
|
const currentTarget = getParentElementWithEventOrId(
|
|
701
715
|
event,
|
|
702
|
-
"oncontextmenu"
|
|
716
|
+
"oncontextmenu",
|
|
703
717
|
);
|
|
704
718
|
const selectors = getBestSelectors(currentTarget, event);
|
|
705
719
|
getXpathsIncluded(selectors, currentTarget, event);
|