@futdevpro/dynamo-e2e 1.18.36 → 1.18.38
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/CHANGELOG.md +33 -0
- package/build/_modules/ui-check/_collections/constants/ui-check-page-scripts.const.d.ts.map +1 -1
- package/build/_modules/ui-check/_collections/constants/ui-check-page-scripts.const.js +179 -2
- package/build/_modules/ui-check/_collections/constants/ui-check-page-scripts.const.js.map +1 -1
- package/build/_modules/ui-check/_collections/detectors/dead-control.detector.d.ts +0 -2
- package/build/_modules/ui-check/_collections/detectors/dead-control.detector.d.ts.map +1 -1
- package/build/_modules/ui-check/_collections/detectors/dead-control.detector.js +2 -10
- package/build/_modules/ui-check/_collections/detectors/dead-control.detector.js.map +1 -1
- package/build/_modules/ui-check/_collections/detectors/error-destination.detector.d.ts +53 -0
- package/build/_modules/ui-check/_collections/detectors/error-destination.detector.d.ts.map +1 -0
- package/build/_modules/ui-check/_collections/detectors/error-destination.detector.js +203 -0
- package/build/_modules/ui-check/_collections/detectors/error-destination.detector.js.map +1 -0
- package/build/_modules/ui-check/_collections/detectors/shifted-scroll.detector.d.ts +31 -0
- package/build/_modules/ui-check/_collections/detectors/shifted-scroll.detector.d.ts.map +1 -0
- package/build/_modules/ui-check/_collections/detectors/shifted-scroll.detector.js +50 -0
- package/build/_modules/ui-check/_collections/detectors/shifted-scroll.detector.js.map +1 -0
- package/build/_modules/ui-check/_collections/detectors/wrapped-info-row.detector.d.ts +30 -0
- package/build/_modules/ui-check/_collections/detectors/wrapped-info-row.detector.d.ts.map +1 -0
- package/build/_modules/ui-check/_collections/detectors/wrapped-info-row.detector.js +52 -0
- package/build/_modules/ui-check/_collections/detectors/wrapped-info-row.detector.js.map +1 -0
- package/build/_modules/ui-check/_collections/ui-check-default-detectors.const.d.ts +9 -0
- package/build/_modules/ui-check/_collections/ui-check-default-detectors.const.d.ts.map +1 -1
- package/build/_modules/ui-check/_collections/ui-check-default-detectors.const.js +15 -0
- package/build/_modules/ui-check/_collections/ui-check-default-detectors.const.js.map +1 -1
- package/build/_modules/ui-check/_collections/ui-check-guard.util.d.ts.map +1 -1
- package/build/_modules/ui-check/_collections/ui-check-guard.util.js +3 -0
- package/build/_modules/ui-check/_collections/ui-check-guard.util.js.map +1 -1
- package/build/_modules/ui-check/_collections/ui-check-page.util.d.ts +9 -2
- package/build/_modules/ui-check/_collections/ui-check-page.util.d.ts.map +1 -1
- package/build/_modules/ui-check/_collections/ui-check-page.util.js +15 -3
- package/build/_modules/ui-check/_collections/ui-check-page.util.js.map +1 -1
- package/build/_modules/ui-check/index.d.ts +3 -0
- package/build/_modules/ui-check/index.d.ts.map +1 -1
- package/build/_modules/ui-check/index.js +3 -0
- package/build/_modules/ui-check/index.js.map +1 -1
- package/build/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,39 @@
|
|
|
3
3
|
Minden release a `dynamo-e2e-foundation` HYPERPLAN MP-N ütemezést követi.
|
|
4
4
|
Verzióformátum: `MM.mm.p` (két-számjegyes major-minor, Dynamo-konvenció).
|
|
5
5
|
|
|
6
|
+
## [01.18.38] — 2026-11-01 — `/ui-check`: `error-destination`, a press that lands on an error (BFR-FLEET-012 ②)
|
|
7
|
+
|
|
8
|
+
- **`error-destination`** (`press-leads-to-error`; owner, 2026-10-26, `IN-2026-10-26-ORC-02`: "…ha valamire
|
|
9
|
+
rákattintunk, az nem egy 404 vagy valami not found, vagy nem egy error page-et ad", the Adventor profile picture
|
|
10
|
+
led to an account "not found"): every button-like control AND every link to another page of the same origin is
|
|
11
|
+
pressed on a fresh page; a finding when (1) the document answered HTTP 4xx / 5xx, (2) a short "not found" /
|
|
12
|
+
error text appeared that was not there before the press (EN + HU, at most 80 characters), or (3) an xhr / fetch
|
|
13
|
+
of the press answered 404 / 410 / 5xx. One finding per press, every signal in `details`. A request that already
|
|
14
|
+
fails while the page loads is not blamed; 401 / 403 is noted, not judged. Same guard as `dead-control` (a link
|
|
15
|
+
is denied by its destination path too). `dead-control` counts all of these as an effect, so it stays silent.
|
|
16
|
+
- **`listControls` kind `link`**: same-origin links to another page, one per destination (no hash-only, mailto /
|
|
17
|
+
tel / javascript, download or new-window link); `DyE2E_UICheckControl_Interface.href`.
|
|
18
|
+
- **`DyE2E_UICheckPage_Util.findAgain`**: the control on the reloaded page, shared (was private in `dead-control`).
|
|
19
|
+
- **Deny list** (`DyE2E_UICheckGuard_Util.defaultDenyPattern`): `unsubscri`, `leiratkoz` — a GET link may act, and
|
|
20
|
+
"unsubscribe" has no word boundary before "subscri" (closing review).
|
|
21
|
+
- A **candidate**: fixtures of the three measured forms fire (a link to a 404 page, an in-app "not found" view after
|
|
22
|
+
a 404 request, a request answering 500), the fixed twins and the quiet cases (a price range "500 - 1000 Ft"
|
|
23
|
+
too) stay silent. 5 specs, 10 mutants killed. The live run on the Adventor profile picture is the missing half.
|
|
24
|
+
|
|
25
|
+
## [01.18.37] — 2026-10-31 — `/ui-check`: two new candidate detectors from the owner's requests (BFR-FLEET-012 ① ④)
|
|
26
|
+
|
|
27
|
+
- **`shifted-scroll`** (`scroll-start-out-of-reach`; owner, 2026-10-26, `IN-2026-10-26-ORC-01`, the Logosz
|
|
28
|
+
conversation screen "cannot be scrolled to its top, the whole screen is shifted"): (a) the document, the body or a
|
|
29
|
+
large box (at least 40 % of the viewport) that does not let the user scroll (`overflow: hidden | clip`) but IS
|
|
30
|
+
scrolled; (b) a box (or the document) the user scrolls whose content still starts above its top at its very start
|
|
31
|
+
(the start is asked from the browser, so a `column-reverse` chat is measured right). Not interactive; every
|
|
32
|
+
position is restored.
|
|
33
|
+
- **`wrapped-info-row`** (`short-info-row-wraps`; owner, 2026-10-24, `IN-2026-10-24-JOBS-RT-01`, the MP flow cards
|
|
34
|
+
"0.0 (0)" and "100% sikeres, 17 futásból" broken into two lines): a visible text of at most 40 characters, with
|
|
35
|
+
no line break of its own, rendered on two or more lines (counted from its own line boxes). Not interactive.
|
|
36
|
+
- Both are **candidates** (`DyE2E_UICheckCandidateDetectors_Const`): fixtures of the measured defects fire, the
|
|
37
|
+
fixed twins stay silent; the live runs on the owner's pages are the missing half. 5 specs, 7 mutants killed.
|
|
38
|
+
|
|
6
39
|
## [01.18.36] — 2026-10-31 — a curated file test-case set with inline files (BFR-MYASSISTANT-025 S4.1)
|
|
7
40
|
|
|
8
41
|
- **`FILE_FIELD_TEST_CASES`** (`file`, registered; replaces the Wave-2b stub, which had the empty case only): the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-check-page-scripts.const.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/constants/ui-check-page-scripts.const.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"ui-check-page-scripts.const.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/constants/ui-check-page-scripts.const.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4jB3E,CAAC"}
|
|
@@ -8,7 +8,9 @@ exports.DyE2E_UICheckPageScripts_Const = void 0;
|
|
|
8
8
|
exports.DyE2E_UICheckPageScripts_Const = {
|
|
9
9
|
/**
|
|
10
10
|
* Lists the visible, enabled controls of one kind. `press`: buttons and button-like elements (not form submits, not
|
|
11
|
-
* checkbox / switch internals); `toggle`: checkboxes and switches
|
|
11
|
+
* checkbox / switch internals); `toggle`: checkboxes and switches; `link` (BFR-FLEET-012 ②): links to ANOTHER page of
|
|
12
|
+
* the same origin (no hash-only, mailto / tel / javascript, download or new-window link), one per destination. Each
|
|
13
|
+
* comes with a unique CSS path.
|
|
12
14
|
*/
|
|
13
15
|
listControls: `(arg) => {
|
|
14
16
|
const cssPath = (el) => {
|
|
@@ -37,7 +39,20 @@ exports.DyE2E_UICheckPageScripts_Const = {
|
|
|
37
39
|
|| !!el.closest('[inert], fieldset[disabled]');
|
|
38
40
|
const selector = arg.kind === 'toggle'
|
|
39
41
|
? 'input[type="checkbox"], [role="checkbox"], [role="switch"]'
|
|
40
|
-
:
|
|
42
|
+
: arg.kind === 'link' ? 'a[href]'
|
|
43
|
+
: 'button, [role="button"], a:not([href]), a[href="#"], a[href=""], [role="menuitem"], [role="tab"]';
|
|
44
|
+
/** The destination of a link to another page of this origin, or null. */
|
|
45
|
+
const destination = (el) => {
|
|
46
|
+
const raw = el.getAttribute('href') || '';
|
|
47
|
+
if (!raw || raw.startsWith('#') || /^(mailto|tel|javascript|data|blob):/i.test(raw)) return null;
|
|
48
|
+
if (el.hasAttribute('download') || (el.target && el.target !== '_self')) return null;
|
|
49
|
+
let url;
|
|
50
|
+
try { url = new URL(el.href, location.href); } catch (e) { return null; }
|
|
51
|
+
if (url.origin !== location.origin) return null;
|
|
52
|
+
if (url.pathname === location.pathname && url.search === location.search) return null;
|
|
53
|
+
return url.pathname + url.search;
|
|
54
|
+
};
|
|
55
|
+
const seen = new Set();
|
|
41
56
|
// a modal dialog open (a visible dialog + a backdrop, or aria-modal) ⇒ only ITS controls are reachable
|
|
42
57
|
const dialogs = Array.from(document.querySelectorAll(
|
|
43
58
|
'[role="dialog"], [role="alertdialog"], mat-dialog-container, .mat-mdc-dialog-container, dialog[open]'))
|
|
@@ -54,8 +69,11 @@ exports.DyE2E_UICheckPageScripts_Const = {
|
|
|
54
69
|
if (el.closest('input, select, textarea')) continue;
|
|
55
70
|
}
|
|
56
71
|
if (arg.kind === 'toggle' && el.tagName !== 'INPUT' && el.querySelector('input[type="checkbox"]')) continue;
|
|
72
|
+
const href = arg.kind === 'link' ? destination(el) : null;
|
|
73
|
+
if (arg.kind === 'link' && (!href || seen.has(href))) continue;
|
|
57
74
|
const probe = el.tagName === 'INPUT' && !visible(el) ? (el.closest('label, [class*="checkbox"]') || el) : el;
|
|
58
75
|
if (!visible(probe) || disabled(el)) continue;
|
|
76
|
+
if (href) seen.add(href);
|
|
59
77
|
const labelEl = el.tagName === 'INPUT'
|
|
60
78
|
? (el.labels && el.labels[0]) || el.closest('label, [class*="checkbox"], [class*="toggle"]') : el;
|
|
61
79
|
out.push({
|
|
@@ -69,6 +87,7 @@ exports.DyE2E_UICheckPageScripts_Const = {
|
|
|
69
87
|
// BFR-MASTERPROMPTER-125 1. — the current page / the selected tab: pressing it again is deliberately inert
|
|
70
88
|
current: (!!el.getAttribute('aria-current') && el.getAttribute('aria-current') !== 'false')
|
|
71
89
|
|| (el.getAttribute('role') === 'tab' && el.getAttribute('aria-selected') === 'true'),
|
|
90
|
+
href: href,
|
|
72
91
|
});
|
|
73
92
|
if (out.length >= arg.max) break;
|
|
74
93
|
}
|
|
@@ -386,5 +405,163 @@ exports.DyE2E_UICheckPageScripts_Const = {
|
|
|
386
405
|
window.scrollTo(window.scrollX, arg.positions[i] || 0);
|
|
387
406
|
return true;
|
|
388
407
|
}`,
|
|
408
|
+
// BFR-FLEET-012 ① (owner, 2026-10-26, IN-2026-10-26-ORC-01) — scroll offsets the user cannot undo: (a) the document
|
|
409
|
+
// or a large box that does NOT let the user scroll (overflow hidden / clip) but is scrolled anyway; (b) a box (or the
|
|
410
|
+
// document) the user scrolls, whose content still starts ABOVE its top when it is scrolled to its very start.
|
|
411
|
+
// Every position is restored; nothing is pressed.
|
|
412
|
+
shiftedScrolls: `(arg) => {
|
|
413
|
+
const root = document.scrollingElement || document.documentElement;
|
|
414
|
+
const vh = window.innerHeight;
|
|
415
|
+
const vw = window.innerWidth;
|
|
416
|
+
const cssPath = (el) => {
|
|
417
|
+
const parts = [];
|
|
418
|
+
let node = el;
|
|
419
|
+
while (node && node.nodeType === 1 && node !== document.documentElement) {
|
|
420
|
+
if (node.id && /^[A-Za-z][\\w-]*$/.test(node.id)) { parts.unshift('#' + node.id); break; }
|
|
421
|
+
const tag = node.tagName.toLowerCase();
|
|
422
|
+
const parent = node.parentElement;
|
|
423
|
+
const same = parent ? Array.from(parent.children).filter((c) => c.tagName === node.tagName) : [];
|
|
424
|
+
parts.unshift(same.length > 1 ? tag + ':nth-of-type(' + (same.indexOf(node) + 1) + ')' : tag);
|
|
425
|
+
node = parent;
|
|
426
|
+
}
|
|
427
|
+
return parts.join(' > ');
|
|
428
|
+
};
|
|
429
|
+
const blocked = (v) => /^(hidden|clip)$/.test(v);
|
|
430
|
+
const htmlCs = getComputedStyle(document.documentElement);
|
|
431
|
+
const bodyCs = getComputedStyle(document.body);
|
|
432
|
+
// the viewport takes the html's overflow, or the body's when the html's is visible
|
|
433
|
+
const viewport = (axis) => htmlCs[axis] !== 'visible' ? htmlCs[axis] : bodyCs[axis];
|
|
434
|
+
// the top of the first in-flow, visible child box (positioned / hidden helpers, e.g. skip links, do not count)
|
|
435
|
+
const contentTop = (el) => {
|
|
436
|
+
let top = Infinity;
|
|
437
|
+
for (const child of Array.from(el.children)) {
|
|
438
|
+
const cs = getComputedStyle(child);
|
|
439
|
+
if (/^(absolute|fixed)$/.test(cs.position) || cs.display === 'none') continue;
|
|
440
|
+
const r = child.getBoundingClientRect();
|
|
441
|
+
if (r.width > 1 && r.height > 1) top = Math.min(top, r.top);
|
|
442
|
+
}
|
|
443
|
+
return top;
|
|
444
|
+
};
|
|
445
|
+
const out = [];
|
|
446
|
+
const docBlockedY = blocked(viewport('overflowY'));
|
|
447
|
+
const docBlockedX = blocked(viewport('overflowX'));
|
|
448
|
+
if ((docBlockedY && root.scrollTop > 0) || (docBlockedX && root.scrollLeft > 0)) {
|
|
449
|
+
out.push({ kind: 'hidden-offset', selector: 'document', tag: 'html', className: '', scrollTop: root.scrollTop,
|
|
450
|
+
scrollLeft: root.scrollLeft, scrollHeight: root.scrollHeight, clientHeight: vh, cutPx: 0 });
|
|
451
|
+
}
|
|
452
|
+
if (!docBlockedY && root.scrollHeight > vh + 1) {
|
|
453
|
+
const x = window.scrollX;
|
|
454
|
+
const y = window.scrollY;
|
|
455
|
+
window.scrollTo(x, -1e9);
|
|
456
|
+
const top = contentTop(document.body);
|
|
457
|
+
const cut = top === Infinity ? 0 : Math.round(-top);
|
|
458
|
+
window.scrollTo(x, y);
|
|
459
|
+
if (cut > 1) {
|
|
460
|
+
out.push({ kind: 'content-above-top', selector: 'document', tag: 'html', className: '', scrollTop: y,
|
|
461
|
+
scrollLeft: x, scrollHeight: root.scrollHeight, clientHeight: vh, cutPx: cut });
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
// the body too: with BOTH html and body overflow hidden the body is the box a scrollIntoView moves
|
|
465
|
+
for (const el of Array.from(document.querySelectorAll('body, body *'))) {
|
|
466
|
+
if (out.length >= arg.max) break;
|
|
467
|
+
const r = el.getBoundingClientRect();
|
|
468
|
+
if (r.width < vw * arg.minShare || r.height < vh * arg.minShare) continue;
|
|
469
|
+
const cs = getComputedStyle(el);
|
|
470
|
+
const base = { selector: cssPath(el), tag: el.tagName.toLowerCase(),
|
|
471
|
+
className: (typeof el.className === 'string' ? el.className : '').slice(0, 80),
|
|
472
|
+
scrollTop: el.scrollTop, scrollLeft: el.scrollLeft, scrollHeight: el.scrollHeight,
|
|
473
|
+
clientHeight: el.clientHeight };
|
|
474
|
+
if (blocked(cs.overflowY) && el.scrollTop > 0) {
|
|
475
|
+
out.push(Object.assign({ kind: 'hidden-offset', cutPx: 0 }, base));
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
if (!/(auto|scroll|overlay)/.test(cs.overflowY) || el.scrollHeight <= el.clientHeight + 1) continue;
|
|
479
|
+
const saved = el.scrollTop;
|
|
480
|
+
// the very start: a column-reverse box starts at a NEGATIVE scrollTop, the browser clamps either way
|
|
481
|
+
el.scrollTop = -el.scrollHeight;
|
|
482
|
+
const top = contentTop(el);
|
|
483
|
+
const edge = el.getBoundingClientRect().top + el.clientTop;
|
|
484
|
+
el.scrollTop = saved;
|
|
485
|
+
const cut = top === Infinity ? 0 : Math.round(edge - top);
|
|
486
|
+
if (cut > 1) out.push(Object.assign({ kind: 'content-above-top', cutPx: cut }, base));
|
|
487
|
+
}
|
|
488
|
+
return out;
|
|
489
|
+
}`,
|
|
490
|
+
// BFR-FLEET-012 ④ (owner, 2026-10-24, IN-2026-10-24-JOBS-RT-01) — a SHORT info row (a label + value, a counter, a
|
|
491
|
+
// status line) that the layout breaks into several lines. The lines are counted from the text's own line boxes.
|
|
492
|
+
wrappedInfoRows: `(arg) => {
|
|
493
|
+
const cssPath = (el) => {
|
|
494
|
+
const parts = [];
|
|
495
|
+
let node = el;
|
|
496
|
+
while (node && node.nodeType === 1 && node !== document.documentElement) {
|
|
497
|
+
if (node.id && /^[A-Za-z][\\w-]*$/.test(node.id)) { parts.unshift('#' + node.id); break; }
|
|
498
|
+
const tag = node.tagName.toLowerCase();
|
|
499
|
+
const parent = node.parentElement;
|
|
500
|
+
const same = parent ? Array.from(parent.children).filter((c) => c.tagName === node.tagName) : [];
|
|
501
|
+
parts.unshift(same.length > 1 ? tag + ':nth-of-type(' + (same.indexOf(node) + 1) + ')' : tag);
|
|
502
|
+
node = parent;
|
|
503
|
+
}
|
|
504
|
+
return parts.join(' > ');
|
|
505
|
+
};
|
|
506
|
+
const skip = /^(SCRIPT|STYLE|NOSCRIPT|TEXTAREA|INPUT|SELECT|OPTION|H1|H2|PRE|CODE|TITLE)$/;
|
|
507
|
+
const inline = /^(inline|inline-block|inline-flex|inline-grid|contents)$/;
|
|
508
|
+
const reported = [];
|
|
509
|
+
const out = [];
|
|
510
|
+
let total = 0;
|
|
511
|
+
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
|
512
|
+
if (skip.test(el.tagName) || el.closest('svg, [contenteditable="true"], [contenteditable=""]')) continue;
|
|
513
|
+
if (reported.some((r) => r.contains(el))) continue;
|
|
514
|
+
if (Array.from(el.children).some((c) => !inline.test(getComputedStyle(c).display))) continue;
|
|
515
|
+
const text = (el.innerText || '').trim();
|
|
516
|
+
// a line break in the text itself (a <br>) is the author's choice, not a wrap
|
|
517
|
+
if (text.length < 2 || text.length > arg.maxChars || /\\n/.test(text)) continue;
|
|
518
|
+
const cs = getComputedStyle(el);
|
|
519
|
+
if (cs.visibility === 'hidden' || cs.display === 'none') continue;
|
|
520
|
+
const box = el.getBoundingClientRect();
|
|
521
|
+
if (box.width < 1 || box.height < 1) continue;
|
|
522
|
+
const range = document.createRange();
|
|
523
|
+
range.selectNodeContents(el);
|
|
524
|
+
const rects = Array.from(range.getClientRects()).filter((r) => r.width > 0 && r.height > 0)
|
|
525
|
+
.sort((a, b) => a.top - b.top);
|
|
526
|
+
let lines = 0;
|
|
527
|
+
let lastBottom = -Infinity;
|
|
528
|
+
for (const r of rects) {
|
|
529
|
+
if (r.top >= lastBottom - r.height / 2) { lines++; lastBottom = r.bottom; }
|
|
530
|
+
else lastBottom = Math.max(lastBottom, r.bottom);
|
|
531
|
+
}
|
|
532
|
+
if (lines < 2) continue;
|
|
533
|
+
total++;
|
|
534
|
+
reported.push(el);
|
|
535
|
+
if (out.length < arg.max) {
|
|
536
|
+
out.push({ selector: cssPath(el), tag: el.tagName.toLowerCase(), text: text, lines: lines,
|
|
537
|
+
width: Math.round(box.width), whiteSpace: cs.whiteSpace });
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
return { rows: out, total: total };
|
|
541
|
+
}`,
|
|
542
|
+
/**
|
|
543
|
+
* BFR-FLEET-012 ② — the visible short texts that say "error page" / "not found" (`arg.source` + `arg.flags`: the
|
|
544
|
+
* pattern; `arg.maxLength`: longer texts are prose, not a status line; `arg.max`: list cap). An element's OWN text
|
|
545
|
+
* counts (its direct text nodes), so a wrapper is not reported for its child; the document title counts too.
|
|
546
|
+
*/
|
|
547
|
+
errorTexts: `(arg) => {
|
|
548
|
+
const pattern = new RegExp(arg.source, arg.flags);
|
|
549
|
+
const out = [];
|
|
550
|
+
const title = (document.title || '').replace(/\\s+/g, ' ').trim();
|
|
551
|
+
if (title && title.length <= arg.maxLength && pattern.test(title)) out.push('title: ' + title);
|
|
552
|
+
for (const el of Array.from(document.body ? document.body.querySelectorAll('*') : [])) {
|
|
553
|
+
if (out.length >= arg.max) break;
|
|
554
|
+
if (/^(SCRIPT|STYLE|NOSCRIPT|TEMPLATE|svg)$/i.test(el.tagName)) continue;
|
|
555
|
+
const own = Array.from(el.childNodes).filter((n) => n.nodeType === 3).map((n) => n.textContent).join(' ')
|
|
556
|
+
.replace(/\\s+/g, ' ').trim();
|
|
557
|
+
if (!own || own.length > arg.maxLength || !pattern.test(own)) continue;
|
|
558
|
+
const r = el.getBoundingClientRect();
|
|
559
|
+
const cs = getComputedStyle(el);
|
|
560
|
+
if (r.width <= 0 || r.height <= 0 || cs.visibility === 'hidden' || cs.display === 'none') continue;
|
|
561
|
+
if (typeof el.checkVisibility === 'function' && !el.checkVisibility()) continue;
|
|
562
|
+
if (!out.includes(own)) out.push(own);
|
|
563
|
+
}
|
|
564
|
+
return out;
|
|
565
|
+
}`,
|
|
389
566
|
};
|
|
390
567
|
//# sourceMappingURL=ui-check-page-scripts.const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-check-page-scripts.const.js","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/constants/ui-check-page-scripts.const.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,8BAA8B,GAAqC;IAE9E
|
|
1
|
+
{"version":3,"file":"ui-check-page-scripts.const.js","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/constants/ui-check-page-scripts.const.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,8BAA8B,GAAqC;IAE9E;;;;;OAKG;IACH,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgFZ;IAEF,gHAAgH;IAChH,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkElB;IAEF,iEAAiE;IACjE,iBAAiB,EAAE;;;;;;;IAOjB;IAEF;;;;;OAKG;IACH,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwCf;IAEF,kEAAkE;IAClE,WAAW,EAAE;;;;;IAKX;IAEF,kEAAkE;IAClE,WAAW,EAAE;;;;;;IAMX;IAEF;;;;OAIG;IACH,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmCZ;IAEF,gHAAgH;IAChH,sHAAsH;IACtH,2GAA2G;IAC3G,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+Df;IAEF,qHAAqH;IACrH,6GAA6G;IAC7G,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8CX;IAEF,6GAA6G;IAC7G,WAAW,EAAE;;;;;IAKX;IAEF,qGAAqG;IACrG,kBAAkB,EAAE;;;;;;;IAOlB;IAEF,oHAAoH;IACpH,sHAAsH;IACtH,8GAA8G;IAC9G,kDAAkD;IAClD,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6Ed;IAEF,kHAAkH;IAClH,gHAAgH;IAChH,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiDf;IAEF;;;;OAIG;IACH,UAAU,EAAE;;;;;;;;;;;;;;;;;;IAkBV;CACH,CAAC"}
|
|
@@ -28,8 +28,6 @@ export declare class DyE2E_DeadControl_Detector implements DyE2E_UICheckDetector
|
|
|
28
28
|
* ancestors) is filled with `probeText`, and the control is pressed again. `null` when there is no such input.
|
|
29
29
|
*/
|
|
30
30
|
private pressWithInput;
|
|
31
|
-
/** The same control on the reloaded page (by tag, test id, label and text). */
|
|
32
|
-
private findAgain;
|
|
33
31
|
/** The findings of one press. */
|
|
34
32
|
private judge;
|
|
35
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dead-control.detector.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/dead-control.detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;AAC3H,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAS1F;;;;;;;;;;GAUG;AACH,qBAAa,0BAA2B,YAAW,+BAA+B;IAEhF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAkB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAA4B;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAmE;IAC/F,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAE5C;IACF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAQ;IACrC,KAAK,EAAE,MAAM,EAAE,CAAM;IAEf,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"dead-control.detector.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/dead-control.detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;AAC3H,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAS1F;;;;;;;;;;GAUG;AACH,qBAAa,0BAA2B,YAAW,+BAA+B;IAEhF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAkB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAA4B;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAmE;IAC/F,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAE5C;IACF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAQ;IACrC,KAAK,EAAE,MAAM,EAAE,CAAM;IAEf,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC;IA0EzG,qFAAqF;IACrF,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAO;IAExC;;;OAGG;YACW,cAAc;IA0B5B,iCAAiC;IACjC,OAAO,CAAC,KAAK;CAwCd"}
|
|
@@ -53,7 +53,7 @@ class DyE2E_DeadControl_Detector {
|
|
|
53
53
|
for (const control of listed.controls.filter((c) => !c.current)) {
|
|
54
54
|
await ui_check_page_util_1.DyE2E_UICheckPage_Util.reload(page, context, background);
|
|
55
55
|
// an earlier press may have changed the page for good (a stored choice) ⇒ find the control again by identity
|
|
56
|
-
const current = await
|
|
56
|
+
const current = await ui_check_page_util_1.DyE2E_UICheckPage_Util.findAgain(page, context, control, 'press');
|
|
57
57
|
if (!current) {
|
|
58
58
|
this.notes.push(`"${control.text || control.ariaLabel || control.testId}" (${control.selector}) was not ` +
|
|
59
59
|
'found again after the reload — not measured.');
|
|
@@ -93,7 +93,7 @@ class DyE2E_DeadControl_Detector {
|
|
|
93
93
|
*/
|
|
94
94
|
async pressWithInput(page, context, control, guard, background) {
|
|
95
95
|
await ui_check_page_util_1.DyE2E_UICheckPage_Util.reload(page, context, background);
|
|
96
|
-
const current = await
|
|
96
|
+
const current = await ui_check_page_util_1.DyE2E_UICheckPage_Util.findAgain(page, context, control, 'press');
|
|
97
97
|
if (!current) {
|
|
98
98
|
return null;
|
|
99
99
|
}
|
|
@@ -105,14 +105,6 @@ class DyE2E_DeadControl_Detector {
|
|
|
105
105
|
return { input: input,
|
|
106
106
|
effect: await ui_check_page_util_1.DyE2E_UICheckPage_Util.press(page, current.selector, guard, context, background) };
|
|
107
107
|
}
|
|
108
|
-
/** The same control on the reloaded page (by tag, test id, label and text). */
|
|
109
|
-
async findAgain(page, context, control) {
|
|
110
|
-
const listed = await ui_check_page_util_1.DyE2E_UICheckPage_Util.listControls(page, context, 'press');
|
|
111
|
-
const wanted = ui_check_page_util_1.DyE2E_UICheckPage_Util.signature(control);
|
|
112
|
-
return listed.controls.find((c) => c.selector === control.selector
|
|
113
|
-
&& ui_check_page_util_1.DyE2E_UICheckPage_Util.signature(c) === wanted)
|
|
114
|
-
?? listed.controls.find((c) => ui_check_page_util_1.DyE2E_UICheckPage_Util.signature(c) === wanted);
|
|
115
|
-
}
|
|
116
108
|
/** The findings of one press. */
|
|
117
109
|
judge(control, effect, context, deniedCount) {
|
|
118
110
|
const label = control.text || control.ariaLabel || control.testId || control.selector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dead-control.detector.js","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/dead-control.detector.ts"],"names":[],"mappings":";;;AAKA,0FAA0F;AAC1F,gEAAsG;AACtG,8DAI+B;AAE/B;;;;;;;;;;GAUG;AACH,MAAa,0BAA0B;IAE5B,EAAE,GAAW,cAAc,CAAC;IAC5B,UAAU,GAAW,wBAAwB,CAAC;IAC9C,WAAW,GAAW,+DAA+D,CAAC;IACtF,MAAM,GAAkC;QAC/C,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,0BAA0B,EAAE,IAAI,EAAE,YAAY;KACjF,CAAC;IACO,WAAW,GAAY,IAAI,CAAC;IACrC,KAAK,GAAa,EAAE,CAAC;IAErB,KAAK,CAAC,GAAG,CAAC,IAAU,EAAE,OAAuC;QAC3D,MAAM,KAAK,GAAwC,MAAM,6CAAuB,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpH,MAAM,QAAQ,GAAqC,EAAE,CAAC;QACtD,gGAAgG;QAChG,MAAM,UAAU,GAAgB,IAAI,GAAG,EAAU,CAAC;QAElD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,2CAAsB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YAC/D,gHAAgH;YAChH,uGAAuG;YACvG,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,IAAI,8DAA8D;oBAC5G,0BAA0B,CAAE,GAAG,UAAU,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,MAAM,GACV,MAAM,2CAAsB,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEpE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,uCAAuC,GAAG,MAAM,CAAC,MAAM;qBAC3F,GAAG,CAAC,CAAC,CAAiC,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9G,CAAC;YACD,kHAAkH;YAClH,MAAM,WAAW,GACf,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAiC,EAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAEtF,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,uEAAuE;oBAC1G,WAAW,CAAC,GAAG,CAAC,CAAC,CAAiC,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;yBACrG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnB,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAiC,EAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzG,MAAM,2CAAsB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC/D,6GAA6G;gBAC7G,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"dead-control.detector.js","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/dead-control.detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
import { DyE2E_UICheckContext_Interface } from '../../_models/ui-check-context.interface';
|
|
3
|
+
import { DyE2E_UICheckDetector_Interface, DyE2E_UICheckOrigin_Interface } from '../../_models/ui-check-detector.interface';
|
|
4
|
+
import { DyE2E_UICheckFinding_Interface } from '../../_models/ui-check-finding.interface';
|
|
5
|
+
/**
|
|
6
|
+
* A press that lands on an ERROR (BFR-FLEET-012 ②): every visible, enabled button-like control AND every link to
|
|
7
|
+
* another page of the same origin is pressed on a FRESH page, and the destination is measured:
|
|
8
|
+
* 1. the page navigated, and the document answered HTTP 4xx / 5xx;
|
|
9
|
+
* 2. a short "not found" / "error" status text APPEARED (404, "not found", "nem található", "hiba történt" …) that
|
|
10
|
+
* the page did not show before the press — this is how a single-page app shows a missing record or route;
|
|
11
|
+
* 3. an xhr / fetch the press caused answered 404 / 410 / 5xx (a request that fails on load too is not blamed).
|
|
12
|
+
* `dead-control` takes any of these as an EFFECT (the press "did something"), so it stays silent on them.
|
|
13
|
+
*
|
|
14
|
+
* One finding per press, the strongest signal first (HTTP document error, then the error text, then the failed
|
|
15
|
+
* request); every measured signal is in `details`. 401 / 403 answers are noted, not judged: the anonymous or
|
|
16
|
+
* throwaway account may lack the right on purpose.
|
|
17
|
+
*
|
|
18
|
+
* Safety: the same guard as `dead-control` (`DyE2E_UICheckGuard_Util`) — test host + anonymous / throwaway account,
|
|
19
|
+
* the deny list (for a link its destination path too), mutating requests aborted, navigation off the host aborted.
|
|
20
|
+
*
|
|
21
|
+
* Origin: the owner, 2026-10-26 (`IN-2026-10-26-ORC-02`): "…ha valamire rákattintunk, az nem egy 404 vagy valami not
|
|
22
|
+
* found, vagy nem egy error page-et ad" — the Adventor profile picture led to an account "not found" page.
|
|
23
|
+
*/
|
|
24
|
+
export declare class DyE2E_ErrorDestination_Detector implements DyE2E_UICheckDetector_Interface {
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly errorClass: string;
|
|
27
|
+
readonly description: string;
|
|
28
|
+
readonly origin: DyE2E_UICheckOrigin_Interface;
|
|
29
|
+
readonly interactive: boolean;
|
|
30
|
+
notes: string[];
|
|
31
|
+
/** Short status texts of an error page (EN + HU). A text longer than `maxTextLength` is prose, never matched. */
|
|
32
|
+
static readonly errorTextPattern: RegExp;
|
|
33
|
+
/** The longest own text of an element that still counts as a status line, characters. */
|
|
34
|
+
static readonly maxTextLength: number;
|
|
35
|
+
/** How many error texts are read per page. */
|
|
36
|
+
static readonly maxTexts: number;
|
|
37
|
+
/** Whether an xhr / fetch status is a failure: missing (404, 410) or a broken server (5xx). */
|
|
38
|
+
static isFailedStatus(status: number): boolean;
|
|
39
|
+
run(page: Page, context: DyE2E_UICheckContext_Interface): Promise<DyE2E_UICheckFinding_Interface[]>;
|
|
40
|
+
/** Presses one control on a fresh page and judges where it landed. */
|
|
41
|
+
private pressOne;
|
|
42
|
+
/** The one finding of a press (or none): the HTTP document error, else a new error text, else a failed request. */
|
|
43
|
+
private judge;
|
|
44
|
+
/** Reloads the page; the xhr / fetch paths that fail while it loads go to `failingOnLoad`. */
|
|
45
|
+
private reload;
|
|
46
|
+
/** The visible error texts of the page now (empty when the page is gone mid-navigation). */
|
|
47
|
+
private errorTexts;
|
|
48
|
+
/** How a control is named in a note or a finding. */
|
|
49
|
+
private label;
|
|
50
|
+
/** The path + query of a URL (the URL itself when it does not parse). */
|
|
51
|
+
private pathOf;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=error-destination.detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-destination.detector.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/error-destination.detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAY,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAS1F;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,+BAAgC,YAAW,+BAA+B;IAErF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAuB;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAA0B;IACrD,QAAQ,CAAC,WAAW,EAAE,MAAM,CACuB;IACnD,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAE5C;IACF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAQ;IACrC,KAAK,EAAE,MAAM,EAAE,CAAM;IAErB,iHAAiH;IACjH,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAMtB;IAElB,yFAAyF;IACzF,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAM;IAE3C,8CAA8C;IAC9C,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAM;IAEtC,+FAA+F;IAC/F,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIxC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC;IAwCzG,sEAAsE;YACxD,QAAQ;IA0DtB,mHAAmH;IACnH,OAAO,CAAC,KAAK;IA0Cb,8FAA8F;YAChF,MAAM;IAqBpB,4FAA4F;YAC9E,UAAU;IASxB,qDAAqD;IACrD,OAAO,CAAC,KAAK;IAKb,yEAAyE;IACzE,OAAO,CAAC,MAAM;CASf"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyE2E_ErrorDestination_Detector = void 0;
|
|
4
|
+
const ui_check_page_scripts_const_1 = require("../constants/ui-check-page-scripts.const");
|
|
5
|
+
const ui_check_guard_util_1 = require("../ui-check-guard.util");
|
|
6
|
+
const ui_check_page_util_1 = require("../ui-check-page.util");
|
|
7
|
+
/**
|
|
8
|
+
* A press that lands on an ERROR (BFR-FLEET-012 ②): every visible, enabled button-like control AND every link to
|
|
9
|
+
* another page of the same origin is pressed on a FRESH page, and the destination is measured:
|
|
10
|
+
* 1. the page navigated, and the document answered HTTP 4xx / 5xx;
|
|
11
|
+
* 2. a short "not found" / "error" status text APPEARED (404, "not found", "nem található", "hiba történt" …) that
|
|
12
|
+
* the page did not show before the press — this is how a single-page app shows a missing record or route;
|
|
13
|
+
* 3. an xhr / fetch the press caused answered 404 / 410 / 5xx (a request that fails on load too is not blamed).
|
|
14
|
+
* `dead-control` takes any of these as an EFFECT (the press "did something"), so it stays silent on them.
|
|
15
|
+
*
|
|
16
|
+
* One finding per press, the strongest signal first (HTTP document error, then the error text, then the failed
|
|
17
|
+
* request); every measured signal is in `details`. 401 / 403 answers are noted, not judged: the anonymous or
|
|
18
|
+
* throwaway account may lack the right on purpose.
|
|
19
|
+
*
|
|
20
|
+
* Safety: the same guard as `dead-control` (`DyE2E_UICheckGuard_Util`) — test host + anonymous / throwaway account,
|
|
21
|
+
* the deny list (for a link its destination path too), mutating requests aborted, navigation off the host aborted.
|
|
22
|
+
*
|
|
23
|
+
* Origin: the owner, 2026-10-26 (`IN-2026-10-26-ORC-02`): "…ha valamire rákattintunk, az nem egy 404 vagy valami not
|
|
24
|
+
* found, vagy nem egy error page-et ad" — the Adventor profile picture led to an account "not found" page.
|
|
25
|
+
*/
|
|
26
|
+
class DyE2E_ErrorDestination_Detector {
|
|
27
|
+
id = 'error-destination';
|
|
28
|
+
errorClass = 'press-leads-to-error';
|
|
29
|
+
description = 'A control or link whose press lands on an error: an HTTP 4xx / 5xx page, a ' +
|
|
30
|
+
'"not found" / error text, or a failed request.';
|
|
31
|
+
origin = {
|
|
32
|
+
code: 'BFR-FLEET-012', foundBy: 'owner (IN-2026-10-26-ORC-02, Adventor profile picture)', date: '2026-10-26',
|
|
33
|
+
};
|
|
34
|
+
interactive = true;
|
|
35
|
+
notes = [];
|
|
36
|
+
/** Short status texts of an error page (EN + HU). A text longer than `maxTextLength` is prose, never matched. */
|
|
37
|
+
static errorTextPattern = new RegExp([
|
|
38
|
+
'\\bnot\\s+found\\b', 'nem\\s+található', 'nem\\s+találjuk', 'nem\\s+létezik', '\\bdoes\\s+not\\s+exist\\b',
|
|
39
|
+
'\\bdoesn\'t\\s+exist\\b', '\\bsomething\\s+went\\s+wrong\\b', 'hiba\\s+történt', 'váratlan\\s+hiba',
|
|
40
|
+
'\\bunexpected\\s+error\\b', '\\bserver\\s+error\\b', '^\\s*(?:404|500|502|503)\\s*$',
|
|
41
|
+
// a bare "500 - …" is NOT matched: "500 - 1000 Ft" is a price range (closing review, 2026-11-01)
|
|
42
|
+
'\\b(?:error|hiba|http|status)\\s*:?\\s*(?:404|500|502|503)\\b',
|
|
43
|
+
].join('|'), 'i');
|
|
44
|
+
/** The longest own text of an element that still counts as a status line, characters. */
|
|
45
|
+
static maxTextLength = 80;
|
|
46
|
+
/** How many error texts are read per page. */
|
|
47
|
+
static maxTexts = 20;
|
|
48
|
+
/** Whether an xhr / fetch status is a failure: missing (404, 410) or a broken server (5xx). */
|
|
49
|
+
static isFailedStatus(status) {
|
|
50
|
+
return status === 404 || status === 410 || status >= 500;
|
|
51
|
+
}
|
|
52
|
+
async run(page, context) {
|
|
53
|
+
const guard = await ui_check_guard_util_1.DyE2E_UICheckGuard_Util.installNetworkGuard(page, context);
|
|
54
|
+
const findings = [];
|
|
55
|
+
/** Console errors the page logs without any press (handed to `press`, so they are not counted as its effect). */
|
|
56
|
+
const background = new Set();
|
|
57
|
+
/** Request paths that fail while the page LOADS — never blamed on a press. */
|
|
58
|
+
const failingOnLoad = new Set();
|
|
59
|
+
this.notes = [];
|
|
60
|
+
try {
|
|
61
|
+
await this.reload(page, context, background, failingOnLoad);
|
|
62
|
+
const onLoad = await this.errorTexts(page);
|
|
63
|
+
// an error the page shows WITHOUT a press belongs to the page itself (another detector's / the reviewer's)
|
|
64
|
+
if (onLoad.length) {
|
|
65
|
+
this.notes.push(`the page itself shows ${onLoad.length} error text(s) without any press (not a press ` +
|
|
66
|
+
`finding): "${onLoad[0]}"`);
|
|
67
|
+
}
|
|
68
|
+
const kinds = ['press', 'link'];
|
|
69
|
+
for (const kind of kinds) {
|
|
70
|
+
const listed = await ui_check_page_util_1.DyE2E_UICheckPage_Util.listControls(page, context, kind);
|
|
71
|
+
if (listed.denied.length) {
|
|
72
|
+
this.notes.push(`${listed.denied.length} ${kind === 'link' ? 'link' : 'control'}(s) not pressed (deny ` +
|
|
73
|
+
'list): ' + listed.denied.map((c) => this.label(c)).join(', '));
|
|
74
|
+
}
|
|
75
|
+
for (const control of listed.controls.filter((c) => !c.current)) {
|
|
76
|
+
findings.push(...await this.pressOne(page, context, control, kind, guard, { background: background, failingOnLoad: failingOnLoad }));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await guard.remove();
|
|
82
|
+
}
|
|
83
|
+
return findings;
|
|
84
|
+
}
|
|
85
|
+
/** Presses one control on a fresh page and judges where it landed. */
|
|
86
|
+
async pressOne(page, context, control, kind, guard, noise) {
|
|
87
|
+
await this.reload(page, context, noise.background, noise.failingOnLoad);
|
|
88
|
+
// an earlier press may have changed the page for good (a stored choice) ⇒ find the control again by identity
|
|
89
|
+
const current = await ui_check_page_util_1.DyE2E_UICheckPage_Util.findAgain(page, context, control, kind);
|
|
90
|
+
if (!current) {
|
|
91
|
+
this.notes.push(`${this.label(control)} (${control.selector}) was not found again after the reload — not ` +
|
|
92
|
+
'measured.');
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
const textsBefore = await this.errorTexts(page);
|
|
96
|
+
const answers = [];
|
|
97
|
+
const onResponse = (response) => {
|
|
98
|
+
answers.push({ url: response.url(), status: response.status(), type: response.request().resourceType(),
|
|
99
|
+
isDocument: response.request().isNavigationRequest() && response.frame() === page.mainFrame() });
|
|
100
|
+
};
|
|
101
|
+
let effect;
|
|
102
|
+
page.on('response', onResponse);
|
|
103
|
+
try {
|
|
104
|
+
effect = await ui_check_page_util_1.DyE2E_UICheckPage_Util.press(page, current.selector, guard, context, noise.background);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
page.off('response', onResponse);
|
|
108
|
+
}
|
|
109
|
+
const textsAfter = await this.errorTexts(page);
|
|
110
|
+
if (current.href && effect.abortedRequests.some((entry) => entry === 'GET ' + new URL(current.href ?? '', effect.urlBefore).href)) {
|
|
111
|
+
this.notes.push(`${this.label(current)} → ${current.href}: the guard aborted the navigation (a payment / mail ` +
|
|
112
|
+
'path) — not measured.');
|
|
113
|
+
}
|
|
114
|
+
const forbidden = answers
|
|
115
|
+
.filter((a) => a.status === 401 || a.status === 403)
|
|
116
|
+
.map((a) => `${a.status} ${this.pathOf(a.url)}`);
|
|
117
|
+
if (forbidden.length) {
|
|
118
|
+
this.notes.push(`${this.label(current)}: ${forbidden.join(', ')} — the account may lack the right on purpose ` +
|
|
119
|
+
'(noted, not judged).');
|
|
120
|
+
}
|
|
121
|
+
return this.judge(current, effect, {
|
|
122
|
+
document: answers.find((a) => a.isDocument && a.status >= 400),
|
|
123
|
+
failedRequests: answers.filter((a) => ['xhr', 'fetch'].includes(a.type) && DyE2E_ErrorDestination_Detector.isFailedStatus(a.status)
|
|
124
|
+
&& !noise.failingOnLoad.has(this.pathOf(a.url))),
|
|
125
|
+
newTexts: textsAfter.filter((text) => !textsBefore.includes(text)),
|
|
126
|
+
}, context);
|
|
127
|
+
}
|
|
128
|
+
/** The one finding of a press (or none): the HTTP document error, else a new error text, else a failed request. */
|
|
129
|
+
judge(control, effect, signals, context) {
|
|
130
|
+
if (!signals.document && !signals.newTexts.length && !signals.failedRequests.length) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
const label = this.label(control);
|
|
134
|
+
const requests = signals.failedRequests.slice(0, 3)
|
|
135
|
+
.map((r) => `${r.status} ${this.pathOf(r.url)}`).join(', ');
|
|
136
|
+
let measured;
|
|
137
|
+
if (signals.document) {
|
|
138
|
+
measured = `Pressing ${label} navigated to ${signals.document.url}, which answered HTTP ` +
|
|
139
|
+
`${signals.document.status}.`;
|
|
140
|
+
}
|
|
141
|
+
else if (signals.newTexts.length) {
|
|
142
|
+
measured = `Pressing ${label} led to ${effect.urlAfter}, which shows "${signals.newTexts[0]}"` +
|
|
143
|
+
(requests ? ` (failed request: ${requests}).` : '.');
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
measured = `Pressing ${label} sent request(s) that failed: ${requests}.`;
|
|
147
|
+
}
|
|
148
|
+
return [{
|
|
149
|
+
detector: this.id,
|
|
150
|
+
errorClass: this.errorClass,
|
|
151
|
+
url: context.url,
|
|
152
|
+
target: ui_check_page_util_1.DyE2E_UICheckPage_Util.toTarget(control),
|
|
153
|
+
measured: measured,
|
|
154
|
+
expected: 'A control or link leads to a working page or state — never to a 404 / "not found" / error page or a ' +
|
|
155
|
+
'failed request.',
|
|
156
|
+
details: { href: control.href ?? null, urlBefore: effect.urlBefore, urlAfter: effect.urlAfter,
|
|
157
|
+
documentError: signals.document ?? null, newErrorTexts: signals.newTexts,
|
|
158
|
+
failedRequests: signals.failedRequests, pressError: effect.pressError },
|
|
159
|
+
}];
|
|
160
|
+
}
|
|
161
|
+
/** Reloads the page; the xhr / fetch paths that fail while it loads go to `failingOnLoad`. */
|
|
162
|
+
async reload(page, context, background, failingOnLoad) {
|
|
163
|
+
const onResponse = (response) => {
|
|
164
|
+
if (['xhr', 'fetch'].includes(response.request().resourceType())
|
|
165
|
+
&& DyE2E_ErrorDestination_Detector.isFailedStatus(response.status())) {
|
|
166
|
+
failingOnLoad.add(this.pathOf(response.url()));
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
page.on('response', onResponse);
|
|
170
|
+
try {
|
|
171
|
+
await ui_check_page_util_1.DyE2E_UICheckPage_Util.reload(page, context, background);
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
page.off('response', onResponse);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** The visible error texts of the page now (empty when the page is gone mid-navigation). */
|
|
178
|
+
async errorTexts(page) {
|
|
179
|
+
return ui_check_page_util_1.DyE2E_UICheckPage_Util.evaluate(page, ui_check_page_scripts_const_1.DyE2E_UICheckPageScripts_Const['errorTexts'], {
|
|
180
|
+
source: DyE2E_ErrorDestination_Detector.errorTextPattern.source,
|
|
181
|
+
flags: DyE2E_ErrorDestination_Detector.errorTextPattern.flags,
|
|
182
|
+
maxLength: DyE2E_ErrorDestination_Detector.maxTextLength,
|
|
183
|
+
max: DyE2E_ErrorDestination_Detector.maxTexts,
|
|
184
|
+
}).catch(() => []);
|
|
185
|
+
}
|
|
186
|
+
/** How a control is named in a note or a finding. */
|
|
187
|
+
label(control) {
|
|
188
|
+
return `"${control.text || control.ariaLabel || control.testId || control.selector}"` +
|
|
189
|
+
(control.href ? ` (→ ${control.href})` : '');
|
|
190
|
+
}
|
|
191
|
+
/** The path + query of a URL (the URL itself when it does not parse). */
|
|
192
|
+
pathOf(url) {
|
|
193
|
+
try {
|
|
194
|
+
const parsed = new URL(url);
|
|
195
|
+
return parsed.pathname + parsed.search;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return url;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
exports.DyE2E_ErrorDestination_Detector = DyE2E_ErrorDestination_Detector;
|
|
203
|
+
//# sourceMappingURL=error-destination.detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-destination.detector.js","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/error-destination.detector.ts"],"names":[],"mappings":";;;AAQA,0FAA0F;AAC1F,gEAAsG;AACtG,8DAI+B;AAE/B;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,+BAA+B;IAEjC,EAAE,GAAW,mBAAmB,CAAC;IACjC,UAAU,GAAW,sBAAsB,CAAC;IAC5C,WAAW,GAAW,6EAA6E;QAC1G,gDAAgD,CAAC;IAC1C,MAAM,GAAkC;QAC/C,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,wDAAwD,EAAE,IAAI,EAAE,YAAY;KAC7G,CAAC;IACO,WAAW,GAAY,IAAI,CAAC;IACrC,KAAK,GAAa,EAAE,CAAC;IAErB,iHAAiH;IACjH,MAAM,CAAU,gBAAgB,GAAW,IAAI,MAAM,CAAC;QACpD,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,4BAA4B;QAC3G,yBAAyB,EAAE,kCAAkC,EAAE,iBAAiB,EAAE,kBAAkB;QACpG,2BAA2B,EAAE,uBAAuB,EAAE,+BAA+B;QACrF,iGAAiG;QACjG,+DAA+D;KAChE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAElB,yFAAyF;IACzF,MAAM,CAAU,aAAa,GAAW,EAAE,CAAC;IAE3C,8CAA8C;IAC9C,MAAM,CAAU,QAAQ,GAAW,EAAE,CAAC;IAEtC,+FAA+F;IAC/F,MAAM,CAAC,cAAc,CAAC,MAAc;QAClC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAU,EAAE,OAAuC;QAC3D,MAAM,KAAK,GAAwC,MAAM,6CAAuB,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpH,MAAM,QAAQ,GAAqC,EAAE,CAAC;QACtD,iHAAiH;QACjH,MAAM,UAAU,GAAgB,IAAI,GAAG,EAAU,CAAC;QAClD,8EAA8E;QAC9E,MAAM,aAAa,GAAgB,IAAI,GAAG,EAAU,CAAC;QAErD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAa,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAErD,2GAA2G;YAC3G,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,MAAM,gDAAgD;oBACpG,cAAc,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,KAAK,GAAyB,CAAE,OAAO,EAAE,MAAM,CAAE,CAAC;YAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,GACV,MAAM,2CAAsB,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBAEjE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,wBAAwB;wBACrG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAiC,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5G,CAAC;gBACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAiC,EAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzG,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EACtE,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,sEAAsE;IAC9D,KAAK,CAAC,QAAQ,CACpB,IAAU,EACV,OAAuC,EACvC,OAAuC,EACvC,IAAsB,EACtB,KAA0C,EAC1C,KAA8D;QAE9D,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QACxE,6GAA6G;QAC7G,MAAM,OAAO,GACX,MAAM,2CAAsB,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,+CAA+C;gBACxG,WAAW,CAAC,CAAC;YAEf,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,WAAW,GAAa,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAyE,EAAE,CAAC;QACzF,MAAM,UAAU,GAAiC,CAAC,QAAkB,EAAQ,EAAE;YAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE;gBACpG,UAAU,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,mBAAmB,EAAE,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrG,CAAC,CAAC;QACF,IAAI,MAA0C,CAAC;QAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,2CAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACxG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,UAAU,GAAa,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEzD,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAa,EAAW,EAAE,CACzE,KAAK,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,uDAAuD;gBAC7G,uBAAuB,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,SAAS,GAAa,OAAO;aAChC,MAAM,CAAC,CAAC,CAAqB,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC;aAChF,GAAG,CAAC,CAAC,CAAkC,EAAU,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5F,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C;gBAC5G,sBAAsB,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE;YACjC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAA0C,EAAW,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;YAChH,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAgD,EAAW,EAAE,CAC3F,CAAE,KAAK,EAAE,OAAO,CAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,+BAA+B,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC;mBAC5F,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,IAAY,EAAW,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACpF,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAED,mHAAmH;IAC3G,KAAK,CACX,OAAuC,EACvC,MAA0C,EAC1C,OAIC,EACD,OAAuC;QAEvC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YACpF,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAW,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACxD,GAAG,CAAC,CAAC,CAAkC,EAAU,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvG,IAAI,QAAgB,CAAC;QAErB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,YAAY,KAAK,iBAAiB,OAAO,CAAC,QAAQ,CAAC,GAAG,wBAAwB;gBACvF,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,QAAQ,GAAG,YAAY,KAAK,WAAW,MAAM,CAAC,QAAQ,kBAAkB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;gBAC5F,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,YAAY,KAAK,iCAAiC,QAAQ,GAAG,CAAC;QAC3E,CAAC;QAED,OAAO,CAAE;gBACP,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM,EAAE,2CAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAChD,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,sGAAsG;oBAC9G,iBAAiB;gBACnB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBAC3F,aAAa,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,QAAQ;oBACxE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;aAC1E,CAAE,CAAC;IACN,CAAC;IAED,8FAA8F;IACtF,KAAK,CAAC,MAAM,CAClB,IAAU,EACV,OAAuC,EACvC,UAAuB,EACvB,aAA0B;QAE1B,MAAM,UAAU,GAAiC,CAAC,QAAkB,EAAQ,EAAE;YAC5E,IAAI,CAAE,KAAK,EAAE,OAAO,CAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,CAAC;mBAC7D,+BAA+B,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBACvE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,2CAAsB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,4FAA4F;IACpF,KAAK,CAAC,UAAU,CAAC,IAAU;QACjC,OAAO,2CAAsB,CAAC,QAAQ,CAAW,IAAI,EAAE,4DAA8B,CAAC,YAAY,CAAC,EAAE;YACnG,MAAM,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,MAAM;YAC/D,KAAK,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,KAAK;YAC7D,SAAS,EAAE,+BAA+B,CAAC,aAAa;YACxD,GAAG,EAAE,+BAA+B,CAAC,QAAQ;SAC9C,CAAC,CAAC,KAAK,CAAC,GAAa,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,qDAAqD;IAC7C,KAAK,CAAC,OAAuC;QACnD,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,GAAG;YACnF,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,yEAAyE;IACjE,MAAM,CAAC,GAAW;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAEjC,OAAO,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;;AA7NH,0EA8NC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
import { DyE2E_UICheckContext_Interface } from '../../_models/ui-check-context.interface';
|
|
3
|
+
import { DyE2E_UICheckDetector_Interface, DyE2E_UICheckOrigin_Interface } from '../../_models/ui-check-detector.interface';
|
|
4
|
+
import { DyE2E_UICheckFinding_Interface } from '../../_models/ui-check-finding.interface';
|
|
5
|
+
/**
|
|
6
|
+
* A SHIFTED SCROLL: the user cannot get back to the top of the page or of a large box. Two measured forms:
|
|
7
|
+
* - `hidden-offset` — the document (either axis) or a box covering a large part of the viewport does not let the user
|
|
8
|
+
* scroll (`overflow: hidden | clip`), yet it IS scrolled (e.g. a `scrollIntoView` moved it): the whole screen stays
|
|
9
|
+
* shifted and no wheel or swipe brings it back;
|
|
10
|
+
* - `content-above-top` — a box (or the document) the user scrolls, scrolled to its very start, still has content
|
|
11
|
+
* above its top edge (a negative margin or a transform pulled it out of the scrollable area).
|
|
12
|
+
*
|
|
13
|
+
* Nothing is pressed; every scroll position is restored (not interactive). A `column-reverse` box (a chat) starts at a
|
|
14
|
+
* negative `scrollTop`: the start is asked from the browser, so such a box is measured right.
|
|
15
|
+
*
|
|
16
|
+
* Origin: owner, 2026-10-26 02:44 (`IN-2026-10-26-ORC-01`, BFR-FLEET-012 ①): the Logosz conversation screen "cannot be
|
|
17
|
+
* scrolled up to its top, the whole screen is shifted".
|
|
18
|
+
*/
|
|
19
|
+
export declare class DyE2E_ShiftedScroll_Detector implements DyE2E_UICheckDetector_Interface {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly errorClass: string;
|
|
22
|
+
readonly description: string;
|
|
23
|
+
readonly origin: DyE2E_UICheckOrigin_Interface;
|
|
24
|
+
readonly interactive: boolean;
|
|
25
|
+
/** A box counts when it covers at least this share of the viewport, in both directions. */
|
|
26
|
+
static readonly minShare: number;
|
|
27
|
+
/** At most this many findings per page. */
|
|
28
|
+
static readonly maxFindings: number;
|
|
29
|
+
run(page: Page, context: DyE2E_UICheckContext_Interface): Promise<DyE2E_UICheckFinding_Interface[]>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=shifted-scroll.detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shifted-scroll.detector.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/shifted-scroll.detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAmB1F;;;;;;;;;;;;;GAaG;AACH,qBAAa,4BAA6B,YAAW,+BAA+B;IAElF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAoB;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAA+B;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC4E;IACxG,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAE5C;IACF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAS;IAEtC,2FAA2F;IAC3F,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAO;IAEvC,2CAA2C;IAC3C,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAM;IAEnC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC;CAmB1G"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyE2E_ShiftedScroll_Detector = void 0;
|
|
4
|
+
const ui_check_page_scripts_const_1 = require("../constants/ui-check-page-scripts.const");
|
|
5
|
+
const ui_check_page_util_1 = require("../ui-check-page.util");
|
|
6
|
+
/**
|
|
7
|
+
* A SHIFTED SCROLL: the user cannot get back to the top of the page or of a large box. Two measured forms:
|
|
8
|
+
* - `hidden-offset` — the document (either axis) or a box covering a large part of the viewport does not let the user
|
|
9
|
+
* scroll (`overflow: hidden | clip`), yet it IS scrolled (e.g. a `scrollIntoView` moved it): the whole screen stays
|
|
10
|
+
* shifted and no wheel or swipe brings it back;
|
|
11
|
+
* - `content-above-top` — a box (or the document) the user scrolls, scrolled to its very start, still has content
|
|
12
|
+
* above its top edge (a negative margin or a transform pulled it out of the scrollable area).
|
|
13
|
+
*
|
|
14
|
+
* Nothing is pressed; every scroll position is restored (not interactive). A `column-reverse` box (a chat) starts at a
|
|
15
|
+
* negative `scrollTop`: the start is asked from the browser, so such a box is measured right.
|
|
16
|
+
*
|
|
17
|
+
* Origin: owner, 2026-10-26 02:44 (`IN-2026-10-26-ORC-01`, BFR-FLEET-012 ①): the Logosz conversation screen "cannot be
|
|
18
|
+
* scrolled up to its top, the whole screen is shifted".
|
|
19
|
+
*/
|
|
20
|
+
class DyE2E_ShiftedScroll_Detector {
|
|
21
|
+
id = 'shifted-scroll';
|
|
22
|
+
errorClass = 'scroll-start-out-of-reach';
|
|
23
|
+
description = 'The page or a large box is scrolled where the user cannot scroll, or its start stays above its top.';
|
|
24
|
+
origin = {
|
|
25
|
+
code: 'BFR-FLEET-012', foundBy: 'owner, IN-2026-10-26-ORC-01 (Logosz conversation screen)', date: '2026-10-26',
|
|
26
|
+
};
|
|
27
|
+
interactive = false;
|
|
28
|
+
/** A box counts when it covers at least this share of the viewport, in both directions. */
|
|
29
|
+
static minShare = 0.4;
|
|
30
|
+
/** At most this many findings per page. */
|
|
31
|
+
static maxFindings = 10;
|
|
32
|
+
async run(page, context) {
|
|
33
|
+
const shifted = await ui_check_page_util_1.DyE2E_UICheckPage_Util.evaluate(page, ui_check_page_scripts_const_1.DyE2E_UICheckPageScripts_Const['shiftedScrolls'], { minShare: DyE2E_ShiftedScroll_Detector.minShare, max: DyE2E_ShiftedScroll_Detector.maxFindings });
|
|
34
|
+
return shifted.map((one) => ({
|
|
35
|
+
detector: this.id,
|
|
36
|
+
errorClass: this.errorClass,
|
|
37
|
+
url: page.url() || context.url,
|
|
38
|
+
target: { selector: one.selector, tag: one.tag, text: one.className, testId: null, ariaLabel: null },
|
|
39
|
+
measured: one.kind === 'hidden-offset'
|
|
40
|
+
? `"${one.selector}" does not let the user scroll (overflow hidden / clip), yet it is scrolled by ` +
|
|
41
|
+
`${one.scrollTop} px down and ${one.scrollLeft} px across: the view stays shifted.`
|
|
42
|
+
: `"${one.selector}" scrolled to its very start still has ${one.cutPx} px of its content above its top ` +
|
|
43
|
+
`(${one.scrollHeight} / ${one.clientHeight} px): that part cannot be scrolled to.`,
|
|
44
|
+
expected: 'Every part of the page can be scrolled to, and nothing is scrolled where the user cannot scroll back.',
|
|
45
|
+
details: { ...one },
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.DyE2E_ShiftedScroll_Detector = DyE2E_ShiftedScroll_Detector;
|
|
50
|
+
//# sourceMappingURL=shifted-scroll.detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shifted-scroll.detector.js","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/shifted-scroll.detector.ts"],"names":[],"mappings":";;;AAQA,0FAA0F;AAC1F,8DAA+D;AAiB/D;;;;;;;;;;;;;GAaG;AACH,MAAa,4BAA4B;IAE9B,EAAE,GAAW,gBAAgB,CAAC;IAC9B,UAAU,GAAW,2BAA2B,CAAC;IACjD,WAAW,GAClB,qGAAqG,CAAC;IAC/F,MAAM,GAAkC;QAC/C,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,0DAA0D,EAAE,IAAI,EAAE,YAAY;KAC/G,CAAC;IACO,WAAW,GAAY,KAAK,CAAC;IAEtC,2FAA2F;IAC3F,MAAM,CAAU,QAAQ,GAAW,GAAG,CAAC;IAEvC,2CAA2C;IAC3C,MAAM,CAAU,WAAW,GAAW,EAAE,CAAC;IAEzC,KAAK,CAAC,GAAG,CAAC,IAAU,EAAE,OAAuC;QAC3D,MAAM,OAAO,GAAoC,MAAM,2CAAsB,CAAC,QAAQ,CAAC,IAAI,EACzF,4DAA8B,CAAC,gBAAgB,CAAC,EAChD,EAAE,QAAQ,EAAE,4BAA4B,CAAC,QAAQ,EAAE,GAAG,EAAE,4BAA4B,CAAC,WAAW,EAAE,CAAC,CAAC;QAEtG,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAkC,EAAkC,EAAE,CAAC,CAAC;YAC1F,QAAQ,EAAE,IAAI,CAAC,EAAE;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,GAAG;YAC9B,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;YACpG,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,eAAe;gBACpC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,iFAAiF;oBACjG,GAAG,GAAG,CAAC,SAAS,gBAAgB,GAAG,CAAC,UAAU,qCAAqC;gBACrF,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,0CAA0C,GAAG,CAAC,KAAK,mCAAmC;oBACtG,IAAI,GAAG,CAAC,YAAY,MAAM,GAAG,CAAC,YAAY,wCAAwC;YACtF,QAAQ,EAAE,uGAAuG;YACjH,OAAO,EAAE,EAAE,GAAG,GAAG,EAAE;SACpB,CAAC,CAAC,CAAC;IACN,CAAC;;AAnCH,oEAoCC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
import { DyE2E_UICheckContext_Interface } from '../../_models/ui-check-context.interface';
|
|
3
|
+
import { DyE2E_UICheckDetector_Interface, DyE2E_UICheckOrigin_Interface } from '../../_models/ui-check-detector.interface';
|
|
4
|
+
import { DyE2E_UICheckFinding_Interface } from '../../_models/ui-check-finding.interface';
|
|
5
|
+
/**
|
|
6
|
+
* A WRAPPED INFO ROW: a short text (a label + value, a counter, a status line; at most `maxChars` characters, no line
|
|
7
|
+
* break of its own) that the layout breaks into two or more lines. The lines are counted from the text's own line
|
|
8
|
+
* boxes, so a tall font or padding is no wrap. The innermost rows are reported once (a row inside a reported row is
|
|
9
|
+
* not repeated). Run it on several viewport widths: a row may wrap only on a phone.
|
|
10
|
+
*
|
|
11
|
+
* Nothing is pressed (not interactive).
|
|
12
|
+
*
|
|
13
|
+
* Origin: owner, 2026-10-24 20:40 (`IN-2026-10-24-JOBS-RT-01`, BFR-FLEET-012 ④): on the Master Prompter flow cards
|
|
14
|
+
* "0.0 (0)" broke into one or two lines, and "100% sikeres, 17 futásból" into two - "it always looks bad, and it may
|
|
15
|
+
* happen elsewhere too".
|
|
16
|
+
*/
|
|
17
|
+
export declare class DyE2E_WrappedInfoRow_Detector implements DyE2E_UICheckDetector_Interface {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly errorClass: string;
|
|
20
|
+
readonly description: string;
|
|
21
|
+
readonly origin: DyE2E_UICheckOrigin_Interface;
|
|
22
|
+
readonly interactive: boolean;
|
|
23
|
+
notes: string[];
|
|
24
|
+
/** A row counts as short up to this many characters. */
|
|
25
|
+
static readonly maxChars: number;
|
|
26
|
+
/** At most this many findings per page (the rest is counted in a note). */
|
|
27
|
+
static readonly maxFindings: number;
|
|
28
|
+
run(page: Page, context: DyE2E_UICheckContext_Interface): Promise<DyE2E_UICheckFinding_Interface[]>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=wrapped-info-row.detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapped-info-row.detector.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/wrapped-info-row.detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAe1F;;;;;;;;;;;GAWG;AACH,qBAAa,6BAA8B,YAAW,+BAA+B;IAEnF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAsB;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAA0B;IACrD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAkF;IAC9G,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAG5C;IACF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAS;IACtC,KAAK,EAAE,MAAM,EAAE,CAAM;IAErB,wDAAwD;IACxD,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAM;IAEtC,2EAA2E;IAC3E,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAM;IAEnC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC;CAsB1G"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyE2E_WrappedInfoRow_Detector = void 0;
|
|
4
|
+
const ui_check_page_scripts_const_1 = require("../constants/ui-check-page-scripts.const");
|
|
5
|
+
const ui_check_page_util_1 = require("../ui-check-page.util");
|
|
6
|
+
/**
|
|
7
|
+
* A WRAPPED INFO ROW: a short text (a label + value, a counter, a status line; at most `maxChars` characters, no line
|
|
8
|
+
* break of its own) that the layout breaks into two or more lines. The lines are counted from the text's own line
|
|
9
|
+
* boxes, so a tall font or padding is no wrap. The innermost rows are reported once (a row inside a reported row is
|
|
10
|
+
* not repeated). Run it on several viewport widths: a row may wrap only on a phone.
|
|
11
|
+
*
|
|
12
|
+
* Nothing is pressed (not interactive).
|
|
13
|
+
*
|
|
14
|
+
* Origin: owner, 2026-10-24 20:40 (`IN-2026-10-24-JOBS-RT-01`, BFR-FLEET-012 ④): on the Master Prompter flow cards
|
|
15
|
+
* "0.0 (0)" broke into one or two lines, and "100% sikeres, 17 futásból" into two - "it always looks bad, and it may
|
|
16
|
+
* happen elsewhere too".
|
|
17
|
+
*/
|
|
18
|
+
class DyE2E_WrappedInfoRow_Detector {
|
|
19
|
+
id = 'wrapped-info-row';
|
|
20
|
+
errorClass = 'short-info-row-wraps';
|
|
21
|
+
description = 'A short info row (label + value, counter, status) breaks into several lines.';
|
|
22
|
+
origin = {
|
|
23
|
+
code: 'BFR-FLEET-012', foundBy: 'owner, IN-2026-10-24-JOBS-RT-01 (Master Prompter flow cards)',
|
|
24
|
+
date: '2026-10-24',
|
|
25
|
+
};
|
|
26
|
+
interactive = false;
|
|
27
|
+
notes = [];
|
|
28
|
+
/** A row counts as short up to this many characters. */
|
|
29
|
+
static maxChars = 40;
|
|
30
|
+
/** At most this many findings per page (the rest is counted in a note). */
|
|
31
|
+
static maxFindings = 20;
|
|
32
|
+
async run(page, context) {
|
|
33
|
+
const measured = await ui_check_page_util_1.DyE2E_UICheckPage_Util.evaluate(page, ui_check_page_scripts_const_1.DyE2E_UICheckPageScripts_Const['wrappedInfoRows'], { maxChars: DyE2E_WrappedInfoRow_Detector.maxChars, max: DyE2E_WrappedInfoRow_Detector.maxFindings });
|
|
34
|
+
const viewport = page.viewportSize();
|
|
35
|
+
this.notes = measured.total > measured.rows.length
|
|
36
|
+
? [`wrapped-info-row: ${measured.total} wrapped rows, only the first ${measured.rows.length} are listed`]
|
|
37
|
+
: [];
|
|
38
|
+
return measured.rows.map((row) => ({
|
|
39
|
+
detector: this.id,
|
|
40
|
+
errorClass: this.errorClass,
|
|
41
|
+
url: page.url() || context.url,
|
|
42
|
+
target: { selector: row.selector, tag: row.tag, text: row.text, testId: null, ariaLabel: null },
|
|
43
|
+
measured: `"${row.text}" (${row.text.length} characters) is broken into ${row.lines} lines in a ` +
|
|
44
|
+
`${row.width} px box${viewport ? ` at a ${viewport.width} px wide viewport` : ''}.`,
|
|
45
|
+
expected: 'A short info row stays on one line: room for it, `white-space: nowrap` (with an ellipsis if it must ' +
|
|
46
|
+
'shrink), or a layout that moves the whole row.',
|
|
47
|
+
details: { ...row, viewport: viewport },
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.DyE2E_WrappedInfoRow_Detector = DyE2E_WrappedInfoRow_Detector;
|
|
52
|
+
//# sourceMappingURL=wrapped-info-row.detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapped-info-row.detector.js","sourceRoot":"","sources":["../../../../../src/_modules/ui-check/_collections/detectors/wrapped-info-row.detector.ts"],"names":[],"mappings":";;;AAQA,0FAA0F;AAC1F,8DAA+D;AAa/D;;;;;;;;;;;GAWG;AACH,MAAa,6BAA6B;IAE/B,EAAE,GAAW,kBAAkB,CAAC;IAChC,UAAU,GAAW,sBAAsB,CAAC;IAC5C,WAAW,GAAW,8EAA8E,CAAC;IACrG,MAAM,GAAkC;QAC/C,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,8DAA8D;QAC9F,IAAI,EAAE,YAAY;KACnB,CAAC;IACO,WAAW,GAAY,KAAK,CAAC;IACtC,KAAK,GAAa,EAAE,CAAC;IAErB,wDAAwD;IACxD,MAAM,CAAU,QAAQ,GAAW,EAAE,CAAC;IAEtC,2EAA2E;IAC3E,MAAM,CAAU,WAAW,GAAW,EAAE,CAAC;IAEzC,KAAK,CAAC,GAAG,CAAC,IAAU,EAAE,OAAuC;QAC3D,MAAM,QAAQ,GAA8D,MAAM,2CAAsB,CAAC,QAAQ,CAC/G,IAAI,EAAE,4DAA8B,CAAC,iBAAiB,CAAC,EACvD,EAAE,QAAQ,EAAE,6BAA6B,CAAC,QAAQ,EAAE,GAAG,EAAE,6BAA6B,CAAC,WAAW,EAAE,CAAC,CAAC;QACxG,MAAM,QAAQ,GAA6C,IAAI,CAAC,YAAY,EAAE,CAAC;QAE/E,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM;YAChD,CAAC,CAAC,CAAE,qBAAqB,QAAQ,CAAC,KAAK,iCAAiC,QAAQ,CAAC,IAAI,CAAC,MAAM,aAAa,CAAE;YAC3G,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAmC,EAAkC,EAAE,CAAC,CAAC;YACjG,QAAQ,EAAE,IAAI,CAAC,EAAE;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,GAAG;YAC9B,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;YAC/F,QAAQ,EAAE,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,+BAA+B,GAAG,CAAC,KAAK,cAAc;gBAC/F,GAAG,GAAG,CAAC,KAAK,UAAU,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,KAAK,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAAG;YACrF,QAAQ,EAAE,sGAAsG;gBAC9G,gDAAgD;YAClD,OAAO,EAAE,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;SACxC,CAAC,CAAC,CAAC;IACN,CAAC;;AAvCH,sEAwCC"}
|
|
@@ -22,6 +22,15 @@ export declare const DyE2E_UICheckDefaultDetectors_Const: readonly DyE2E_UICheck
|
|
|
22
22
|
* `overscroll-behavior-y: contain` box inside a scrolling frame: the wheel moves 0 px) and stays silent on the
|
|
23
23
|
* fixed layouts; the real page (Organizer TEST task list) was fixed in the project, so the live proof is the
|
|
24
24
|
* "silent now" half only.
|
|
25
|
+
* - `shifted-scroll` (BFR-FLEET-012 ①, owner 2026-10-26, Logosz): fires on fixtures of both measured forms (a
|
|
26
|
+
* scrolled `overflow: hidden` page, content pulled above a box's start) and stays silent on the fixed twins and
|
|
27
|
+
* on a `column-reverse` chat; the live run on the Logosz screen is missing.
|
|
28
|
+
* - `wrapped-info-row` (BFR-FLEET-012 ④, owner 2026-10-24, MP flow cards): fires on fixtures of the two cards the
|
|
29
|
+
* owner saw and stays silent on the fixed twins; the live run on the MP cards is missing.
|
|
30
|
+
* - `error-destination` (BFR-FLEET-012 ②, owner 2026-10-26, Adventor profile picture ⇒ account "not found"):
|
|
31
|
+
* fires on fixtures of the three measured forms (a link to an HTTP 404 page, an in-app "not found" view after a
|
|
32
|
+
* failed request, a press whose request answers 500) and stays silent on the fixed twins; the live run on the
|
|
33
|
+
* Adventor profile picture is missing.
|
|
25
34
|
*/
|
|
26
35
|
export declare const DyE2E_UICheckCandidateDetectors_Const: readonly DyE2E_UICheckDetector_Interface[];
|
|
27
36
|
//# sourceMappingURL=ui-check-default-detectors.const.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-check-default-detectors.const.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-default-detectors.const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"ui-check-default-detectors.const.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-default-detectors.const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,wCAAwC,CAAC;AAUzF;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,EAAE,SAAS,+BAA+B,EAEzF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,qCAAqC,EAAE,SAAS,+BAA+B,EAQ3F,CAAC"}
|
|
@@ -3,9 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DyE2E_UICheckCandidateDetectors_Const = exports.DyE2E_UICheckDefaultDetectors_Const = void 0;
|
|
4
4
|
const covered_control_detector_1 = require("./detectors/covered-control.detector");
|
|
5
5
|
const dead_control_detector_1 = require("./detectors/dead-control.detector");
|
|
6
|
+
const error_destination_detector_1 = require("./detectors/error-destination.detector");
|
|
6
7
|
const nested_scroll_detector_1 = require("./detectors/nested-scroll.detector");
|
|
7
8
|
const non_toggling_control_detector_1 = require("./detectors/non-toggling-control.detector");
|
|
8
9
|
const scroll_trap_detector_1 = require("./detectors/scroll-trap.detector");
|
|
10
|
+
const shifted_scroll_detector_1 = require("./detectors/shifted-scroll.detector");
|
|
11
|
+
const wrapped_info_row_detector_1 = require("./detectors/wrapped-info-row.detector");
|
|
9
12
|
/**
|
|
10
13
|
* The DEFAULT, growing UI detector list (BFR-FLEET-012) — every page, form and feature gets all of them.
|
|
11
14
|
*
|
|
@@ -31,11 +34,23 @@ exports.DyE2E_UICheckDefaultDetectors_Const = [
|
|
|
31
34
|
* `overscroll-behavior-y: contain` box inside a scrolling frame: the wheel moves 0 px) and stays silent on the
|
|
32
35
|
* fixed layouts; the real page (Organizer TEST task list) was fixed in the project, so the live proof is the
|
|
33
36
|
* "silent now" half only.
|
|
37
|
+
* - `shifted-scroll` (BFR-FLEET-012 ①, owner 2026-10-26, Logosz): fires on fixtures of both measured forms (a
|
|
38
|
+
* scrolled `overflow: hidden` page, content pulled above a box's start) and stays silent on the fixed twins and
|
|
39
|
+
* on a `column-reverse` chat; the live run on the Logosz screen is missing.
|
|
40
|
+
* - `wrapped-info-row` (BFR-FLEET-012 ④, owner 2026-10-24, MP flow cards): fires on fixtures of the two cards the
|
|
41
|
+
* owner saw and stays silent on the fixed twins; the live run on the MP cards is missing.
|
|
42
|
+
* - `error-destination` (BFR-FLEET-012 ②, owner 2026-10-26, Adventor profile picture ⇒ account "not found"):
|
|
43
|
+
* fires on fixtures of the three measured forms (a link to an HTTP 404 page, an in-app "not found" view after a
|
|
44
|
+
* failed request, a press whose request answers 500) and stays silent on the fixed twins; the live run on the
|
|
45
|
+
* Adventor profile picture is missing.
|
|
34
46
|
*/
|
|
35
47
|
exports.DyE2E_UICheckCandidateDetectors_Const = [
|
|
36
48
|
new nested_scroll_detector_1.DyE2E_NestedScroll_Detector(),
|
|
37
49
|
new non_toggling_control_detector_1.DyE2E_NonTogglingControl_Detector(),
|
|
38
50
|
new covered_control_detector_1.DyE2E_CoveredControl_Detector(),
|
|
39
51
|
new scroll_trap_detector_1.DyE2E_ScrollTrap_Detector(),
|
|
52
|
+
new shifted_scroll_detector_1.DyE2E_ShiftedScroll_Detector(),
|
|
53
|
+
new wrapped_info_row_detector_1.DyE2E_WrappedInfoRow_Detector(),
|
|
54
|
+
new error_destination_detector_1.DyE2E_ErrorDestination_Detector(),
|
|
40
55
|
];
|
|
41
56
|
//# sourceMappingURL=ui-check-default-detectors.const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-check-default-detectors.const.js","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-default-detectors.const.ts"],"names":[],"mappings":";;;AACA,mFAAqF;AACrF,6EAA+E;AAC/E,+EAAiF;AACjF,6FAA8F;AAC9F,2EAA6E;
|
|
1
|
+
{"version":3,"file":"ui-check-default-detectors.const.js","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-default-detectors.const.ts"],"names":[],"mappings":";;;AACA,mFAAqF;AACrF,6EAA+E;AAC/E,uFAAyF;AACzF,+EAAiF;AACjF,6FAA8F;AAC9F,2EAA6E;AAC7E,iFAAmF;AACnF,qFAAsF;AAEtF;;;;;;GAMG;AACU,QAAA,mCAAmC,GAA+C;IAC7F,IAAI,kDAA0B,EAAE;CACjC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACU,QAAA,qCAAqC,GAA+C;IAC/F,IAAI,oDAA2B,EAAE;IACjC,IAAI,iEAAiC,EAAE;IACvC,IAAI,wDAA6B,EAAE;IACnC,IAAI,gDAAyB,EAAE;IAC/B,IAAI,sDAA4B,EAAE;IAClC,IAAI,yDAA6B,EAAE;IACnC,IAAI,4DAA+B,EAAE;CACtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-check-guard.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-guard.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAyB,MAAM,kBAAkB,CAAC;AAGxE,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AAEvF,yDAAyD;AACzD,MAAM,WAAW,iCAAiC;IAChD,8FAA8F;IAC9F,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iCAAiC;AACjC,MAAM,WAAW,mCAAmC;IAClD,GAAG,EAAE,iCAAiC,CAAC;IACvC,8CAA8C;IAC9C,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAuB;IAElC,+FAA+F;IAC/F,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ui-check-guard.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-guard.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAyB,MAAM,kBAAkB,CAAC;AAGxE,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AAEvF,yDAAyD;AACzD,MAAM,WAAW,iCAAiC;IAChD,8FAA8F;IAC9F,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iCAAiC;AACjC,MAAM,WAAW,mCAAmC;IAClD,GAAG,EAAE,iCAAiC,CAAC;IACvC,8CAA8C;IAC9C,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAuB;IAElC,+FAA+F;IAC/F,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAQxB;IAElB,qGAAqG;IACrG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAGxB;IAElB,+CAA+C;IAC/C,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAgC;IAErE,0DAA0D;IAC1D,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,EAAE,CAA8D;IAE3G,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAqD;IAEzF;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,8BAA8B,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAWlG,+EAA+E;IAC/E,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO;IAStG,iFAAiF;IACjF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,8BAA8B,GAAG,OAAO;IA0B3F,8FAA8F;IAC9F,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO;IAMrE;;;;OAIG;WACU,mBAAmB,CAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,mCAAmC,CAAC;IAqD/C,qCAAqC;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ;IAQvB,2FAA2F;IAC3F,OAAO,CAAC,MAAM,CAAC,QAAQ;CAUxB"}
|
|
@@ -21,6 +21,9 @@ class DyE2E_UICheckGuard_Util {
|
|
|
21
21
|
'eltávolít', '\\bpay', 'fizet', '\\bbuy\\b', 'vásárl', '\\bcheckout\\b', '\\bpurchase', '\\border\\b', 'megrendel',
|
|
22
22
|
'\\bsubscri', 'előfizet', '\\bpublish', 'közzétesz', 'közzététel', '\\bsend\\b', 'küld', '\\binvite', 'meghív',
|
|
23
23
|
'e-?mail', '\\bdonat', 'adomány', '\\bdeactivat', '\\btransfer\\b', '\\bwithdraw', '\\bcredit', 'kredit',
|
|
24
|
+
// BFR-FLEET-012 ② — links are pressed too, and a GET link may act: "unsubscribe" has no word boundary before
|
|
25
|
+
// "subscri", so `\bsubscri` misses it
|
|
26
|
+
'unsubscri', 'leiratkoz',
|
|
24
27
|
].join('|'), 'i');
|
|
25
28
|
/** Request URLs never let through, even when `mutationAllow` matches: payment and e-mail sending. */
|
|
26
29
|
static hardDenyUrlPattern = new RegExp([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-check-guard.util.js","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-guard.util.ts"],"names":[],"mappings":";;;AAEA,gGAAkG;AAmBlG;;;;;;;;;;;GAWG;AACH,MAAa,uBAAuB;IAElC,+FAA+F;IAC/F,MAAM,CAAU,kBAAkB,GAAW,IAAI,MAAM,CAAC;QACtD,wBAAwB,EAAE,yBAAyB,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc;QAC9G,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW;QAClH,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ;QAC9G,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"ui-check-guard.util.js","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-guard.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,8 @@ export interface DyE2E_UICheckControl_Interface extends DyE2E_UICheckTarget_Inte
|
|
|
11
11
|
* `role="tab"` with `aria-selected="true"`): pressing it again is deliberately inert.
|
|
12
12
|
*/
|
|
13
13
|
current?: boolean;
|
|
14
|
+
/** BFR-FLEET-012 ② — a `link` control: its same-origin destination (path + query); `null` for other kinds. */
|
|
15
|
+
href?: string | null;
|
|
14
16
|
}
|
|
15
17
|
/** Everything a press caused (or failed to cause). */
|
|
16
18
|
export interface DyE2E_UICheckPressEffect_Interface {
|
|
@@ -69,10 +71,15 @@ export declare class DyE2E_UICheckPage_Util {
|
|
|
69
71
|
static errorSignature(text: string): string;
|
|
70
72
|
/** The identity of a control across reloads (its CSS path may shift when an earlier press changed the page). */
|
|
71
73
|
static signature(control: DyE2E_UICheckControl_Interface): string;
|
|
74
|
+
/** The same control on the reloaded page: by CSS path + identity, else by identity alone (`signature`). */
|
|
75
|
+
static findAgain(page: Page, context: DyE2E_UICheckContext_Interface, control: DyE2E_UICheckControl_Interface, kind: 'press' | 'toggle' | 'link'): Promise<DyE2E_UICheckControl_Interface | undefined>;
|
|
72
76
|
/** The first line of a press error, plus the Playwright call-log line that names the cause (e.g. what covers it). */
|
|
73
77
|
static describePressError(error: unknown): string;
|
|
74
|
-
/**
|
|
75
|
-
|
|
78
|
+
/**
|
|
79
|
+
* The visible, enabled controls of one kind, minus the denied ones (returned separately). A `link` is denied by its
|
|
80
|
+
* destination path too (a GET link may act: `/logout`, `/unsubscribe/…`).
|
|
81
|
+
*/
|
|
82
|
+
static listControls(page: Page, context: DyE2E_UICheckContext_Interface, kind: 'press' | 'toggle' | 'link'): Promise<{
|
|
76
83
|
controls: DyE2E_UICheckControl_Interface[];
|
|
77
84
|
denied: DyE2E_UICheckControl_Interface[];
|
|
78
85
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-check-page.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-page.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AAEtF,OAAO,EAA2B,mCAAmC,EAAE,MAAM,uBAAuB,CAAC;AAErG,wDAAwD;AACxD,MAAM,WAAW,8BAA+B,SAAQ,6BAA6B;IACnF,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ui-check-page.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-page.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -86,7 +86,15 @@ class DyE2E_UICheckPage_Util {
|
|
|
86
86
|
}
|
|
87
87
|
/** The identity of a control across reloads (its CSS path may shift when an earlier press changed the page). */
|
|
88
88
|
static signature(control) {
|
|
89
|
-
return [control.tag, control.testId ?? '', control.ariaLabel ?? '', control.text].join('|');
|
|
89
|
+
return [control.tag, control.testId ?? '', control.ariaLabel ?? '', control.text, control.href ?? ''].join('|');
|
|
90
|
+
}
|
|
91
|
+
/** The same control on the reloaded page: by CSS path + identity, else by identity alone (`signature`). */
|
|
92
|
+
static async findAgain(page, context, control, kind) {
|
|
93
|
+
const listed = await DyE2E_UICheckPage_Util.listControls(page, context, kind);
|
|
94
|
+
const wanted = DyE2E_UICheckPage_Util.signature(control);
|
|
95
|
+
return listed.controls.find((c) => c.selector === control.selector
|
|
96
|
+
&& DyE2E_UICheckPage_Util.signature(c) === wanted)
|
|
97
|
+
?? listed.controls.find((c) => DyE2E_UICheckPage_Util.signature(c) === wanted);
|
|
90
98
|
}
|
|
91
99
|
/** The first line of a press error, plus the Playwright call-log line that names the cause (e.g. what covers it). */
|
|
92
100
|
static describePressError(error) {
|
|
@@ -95,13 +103,17 @@ class DyE2E_UICheckPage_Util {
|
|
|
95
103
|
const cause = lines.find((line) => /intercepts pointer events|not visible|not enabled|not stable|detached|outside of the viewport/.test(line));
|
|
96
104
|
return (lines[0] + (cause ? ' — ' + cause.trim() : '')).slice(0, 400);
|
|
97
105
|
}
|
|
98
|
-
/**
|
|
106
|
+
/**
|
|
107
|
+
* The visible, enabled controls of one kind, minus the denied ones (returned separately). A `link` is denied by its
|
|
108
|
+
* destination path too (a GET link may act: `/logout`, `/unsubscribe/…`).
|
|
109
|
+
*/
|
|
99
110
|
static async listControls(page, context, kind) {
|
|
100
111
|
const all = await DyE2E_UICheckPage_Util.evaluate(page, ui_check_page_scripts_const_1.DyE2E_UICheckPageScripts_Const['listControls'], { kind: kind, max: (context.maxControls ?? DyE2E_UICheckPage_Util.defaultMaxControls) * 3 });
|
|
101
112
|
const controls = [];
|
|
102
113
|
const denied = [];
|
|
103
114
|
for (const control of all) {
|
|
104
|
-
const label = [control.text, control.ariaLabel, control.title, control.testId]
|
|
115
|
+
const label = [control.text, control.ariaLabel, control.title, control.testId, control.href]
|
|
116
|
+
.filter(Boolean).join(' ');
|
|
105
117
|
(ui_check_guard_util_1.DyE2E_UICheckGuard_Util.isDenied(label, context, control.destructive) ? denied : controls).push(control);
|
|
106
118
|
}
|
|
107
119
|
return { controls: controls.slice(0, context.maxControls ?? DyE2E_UICheckPage_Util.defaultMaxControls),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-check-page.util.js","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-page.util.ts"],"names":[],"mappings":";;;AAIA,yFAAyF;AACzF,+DAAqG;
|
|
1
|
+
{"version":3,"file":"ui-check-page.util.js","sourceRoot":"","sources":["../../../../src/_modules/ui-check/_collections/ui-check-page.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,9 +15,12 @@
|
|
|
15
15
|
export * from './_collections/constants/ui-check-page-scripts.const';
|
|
16
16
|
export * from './_collections/detectors/covered-control.detector';
|
|
17
17
|
export * from './_collections/detectors/dead-control.detector';
|
|
18
|
+
export * from './_collections/detectors/error-destination.detector';
|
|
18
19
|
export * from './_collections/detectors/nested-scroll.detector';
|
|
19
20
|
export * from './_collections/detectors/non-toggling-control.detector';
|
|
20
21
|
export * from './_collections/detectors/scroll-trap.detector';
|
|
22
|
+
export * from './_collections/detectors/shifted-scroll.detector';
|
|
23
|
+
export * from './_collections/detectors/wrapped-info-row.detector';
|
|
21
24
|
export * from './_collections/ui-check-default-detectors.const';
|
|
22
25
|
export * from './_collections/ui-check-guard.util';
|
|
23
26
|
export * from './_collections/ui-check-page.util';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/ui-check/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,cAAc,sDAAsD,CAAC;AACrE,cAAc,mDAAmD,CAAC;AAClE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,iDAAiD,CAAC;AAChE,cAAc,wDAAwD,CAAC;AACvE,cAAc,+CAA+C,CAAC;AAC9D,cAAc,iDAAiD,CAAC;AAChE,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/ui-check/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,cAAc,sDAAsD,CAAC;AACrE,cAAc,mDAAmD,CAAC;AAClE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qDAAqD,CAAC;AACpE,cAAc,iDAAiD,CAAC;AAChE,cAAc,wDAAwD,CAAC;AACvE,cAAc,+CAA+C,CAAC;AAC9D,cAAc,kDAAkD,CAAC;AACjE,cAAc,oDAAoD,CAAC;AACnE,cAAc,iDAAiD,CAAC;AAChE,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC"}
|
|
@@ -31,9 +31,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
31
31
|
__exportStar(require("./_collections/constants/ui-check-page-scripts.const"), exports);
|
|
32
32
|
__exportStar(require("./_collections/detectors/covered-control.detector"), exports);
|
|
33
33
|
__exportStar(require("./_collections/detectors/dead-control.detector"), exports);
|
|
34
|
+
__exportStar(require("./_collections/detectors/error-destination.detector"), exports);
|
|
34
35
|
__exportStar(require("./_collections/detectors/nested-scroll.detector"), exports);
|
|
35
36
|
__exportStar(require("./_collections/detectors/non-toggling-control.detector"), exports);
|
|
36
37
|
__exportStar(require("./_collections/detectors/scroll-trap.detector"), exports);
|
|
38
|
+
__exportStar(require("./_collections/detectors/shifted-scroll.detector"), exports);
|
|
39
|
+
__exportStar(require("./_collections/detectors/wrapped-info-row.detector"), exports);
|
|
37
40
|
__exportStar(require("./_collections/ui-check-default-detectors.const"), exports);
|
|
38
41
|
__exportStar(require("./_collections/ui-check-guard.util"), exports);
|
|
39
42
|
__exportStar(require("./_collections/ui-check-page.util"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/ui-check/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;GAaG;AACH,uFAAqE;AACrE,oFAAkE;AAClE,iFAA+D;AAC/D,kFAAgE;AAChE,yFAAuE;AACvE,gFAA8D;AAC9D,kFAAgE;AAChE,qEAAmD;AACnD,oEAAkD;AAClD,sEAAoD;AACpD,uEAAqD;AACrD,wEAAsD;AACtD,uEAAqD;AACrD,sEAAoD"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/ui-check/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;GAaG;AACH,uFAAqE;AACrE,oFAAkE;AAClE,iFAA+D;AAC/D,sFAAoE;AACpE,kFAAgE;AAChE,yFAAuE;AACvE,gFAA8D;AAC9D,mFAAiE;AACjE,qFAAmE;AACnE,kFAAgE;AAChE,qEAAmD;AACnD,oEAAkD;AAClD,sEAAoD;AACpD,uEAAqD;AACrD,wEAAsD;AACtD,uEAAqD;AACrD,sEAAoD"}
|
package/build/index.js
CHANGED
|
@@ -26,5 +26,5 @@ __exportStar(require("./_modules/game/index"), exports);
|
|
|
26
26
|
__exportStar(require("./_modules/ui-check/index"), exports);
|
|
27
27
|
__exportStar(require("./_modules/coverage/index"), exports);
|
|
28
28
|
/** Package-version stamp — npm-publish-time runtime-érték. */
|
|
29
|
-
exports.DYE2E_PACKAGE_VERSION = '01.18.
|
|
29
|
+
exports.DYE2E_PACKAGE_VERSION = '01.18.38';
|
|
30
30
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/dynamo-e2e",
|
|
3
|
-
"version": "01.18.
|
|
3
|
+
"version": "01.18.38",
|
|
4
4
|
"description": "End-to-end testing engine for the Dynamo + FDP ecosystem — auto-generated form-coverage tests, viewport audit matrix, CWV diagnostics. Settings-POJO-first.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "core-package",
|