@glubean/browser 0.8.1 → 0.9.0
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/dist/evidence.d.ts +470 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +721 -0
- package/dist/evidence.js.map +1 -0
- package/dist/frame.d.ts +83 -0
- package/dist/frame.d.ts.map +1 -0
- package/dist/frame.js +183 -0
- package/dist/frame.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/locator.d.ts +73 -2
- package/dist/locator.d.ts.map +1 -1
- package/dist/locator.js +127 -2
- package/dist/locator.js.map +1 -1
- package/dist/network.d.ts +15 -5
- package/dist/network.d.ts.map +1 -1
- package/dist/network.js +16 -12
- package/dist/network.js.map +1 -1
- package/dist/page.d.ts +213 -17
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +508 -107
- package/dist/page.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"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"}
|
package/dist/frame.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GlubeanFrame — locator ergonomics scoped to an `<iframe>`'s content frame.
|
|
3
|
+
*
|
|
4
|
+
* Per the proposal's "iframe is a hybrid" note (browser-testing-cloud-rollout.md
|
|
5
|
+
* M5): CDP already does the execution-context switch — that's Puppeteer's own
|
|
6
|
+
* `Frame` object, wired up via `Page.frameAttached` / `Runtime.executionContextCreated`
|
|
7
|
+
* before this module ever runs. The only thing missing was the encapsulation
|
|
8
|
+
* layer's locator ergonomics (byTestId/byText/byRole/byLabel, auto-tracing
|
|
9
|
+
* click/fill/type/hover, auto-retrying expect*) scoped to a frame instead of
|
|
10
|
+
* the top-level page — that's what this module adds. Created via
|
|
11
|
+
* `GlubeanPage.frame(selector)`.
|
|
12
|
+
*
|
|
13
|
+
* @module frame
|
|
14
|
+
*/
|
|
15
|
+
import type { Frame } from "puppeteer-core";
|
|
16
|
+
import { type LocatorContext, type WrappedLocator } from "./locator.js";
|
|
17
|
+
/** Options accepted by GlubeanFrame's interaction methods. */
|
|
18
|
+
export interface FrameActionOptions {
|
|
19
|
+
/** Timeout in ms (overrides the frame's configured default). */
|
|
20
|
+
timeout?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A Puppeteer `Frame` wrapped with the same locator/assertion ergonomics as
|
|
24
|
+
* `GlubeanPage`, scoped to that frame's content. Returned by `page.frame()`.
|
|
25
|
+
*/
|
|
26
|
+
export declare class GlubeanFrame {
|
|
27
|
+
/** The underlying Puppeteer Frame for advanced use cases. */
|
|
28
|
+
readonly raw: Frame;
|
|
29
|
+
private readonly _ctx;
|
|
30
|
+
private readonly _actionTimeout;
|
|
31
|
+
/** @internal — created by `GlubeanPage.frame()`. */
|
|
32
|
+
constructor(frame: Frame, ctx: LocatorContext, actionTimeout: number);
|
|
33
|
+
/** Current frame URL. */
|
|
34
|
+
url(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Create a WrappedLocator scoped to this frame — same auto-tracing/
|
|
37
|
+
* screenshot behavior as `GlubeanPage.locator()`.
|
|
38
|
+
*/
|
|
39
|
+
locator(selector: string): WrappedLocator;
|
|
40
|
+
/** Locate an element by its `data-testid` attribute, scoped to this frame. */
|
|
41
|
+
byTestId(id: string): WrappedLocator;
|
|
42
|
+
/** Locate an element by its visible text content, scoped to this frame. */
|
|
43
|
+
byText(text: string): WrappedLocator;
|
|
44
|
+
/** Locate an element by its ARIA role (and optionally accessible name), scoped to this frame. */
|
|
45
|
+
byRole(role: string, options?: {
|
|
46
|
+
name?: string;
|
|
47
|
+
}): WrappedLocator;
|
|
48
|
+
/** Locate an element by its accessible name (ARIA label), scoped to this frame. */
|
|
49
|
+
byLabel(label: string): WrappedLocator;
|
|
50
|
+
/** Click an element matching the selector, scoped to this frame. */
|
|
51
|
+
click(selector: string, options?: FrameActionOptions): Promise<void>;
|
|
52
|
+
/** Clear an input and type a new value, scoped to this frame. */
|
|
53
|
+
fill(selector: string, value: string, options?: FrameActionOptions): Promise<void>;
|
|
54
|
+
/** Type text into an element (appends — does not clear), scoped to this frame. */
|
|
55
|
+
type(selector: string, text: string, options?: FrameActionOptions): Promise<void>;
|
|
56
|
+
/** Hover over an element matching the selector, scoped to this frame. */
|
|
57
|
+
hover(selector: string, options?: FrameActionOptions): Promise<void>;
|
|
58
|
+
/** Check whether an element is currently visible. Returns immediately — does not wait. */
|
|
59
|
+
isVisible(selector: string): Promise<boolean>;
|
|
60
|
+
/** Assert that an element is visible, scoped to this frame. Retries until visible or timeout. */
|
|
61
|
+
expectVisible(selector: string, options?: {
|
|
62
|
+
timeout?: number;
|
|
63
|
+
}): Promise<void>;
|
|
64
|
+
/** Assert that an element is hidden or absent, scoped to this frame. Retries until hidden or timeout. */
|
|
65
|
+
expectHidden(selector: string, options?: {
|
|
66
|
+
timeout?: number;
|
|
67
|
+
}): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Assert that an element's text content matches `expected`, scoped to this
|
|
70
|
+
* frame. Retries until match or timeout. Same normalize/match rules as
|
|
71
|
+
* `GlubeanPage.expectText()`.
|
|
72
|
+
*/
|
|
73
|
+
expectText(selector: string, expected: string | RegExp, options?: {
|
|
74
|
+
timeout?: number;
|
|
75
|
+
exact?: boolean;
|
|
76
|
+
ignoreCase?: boolean;
|
|
77
|
+
}): Promise<void>;
|
|
78
|
+
private static readonly _POLL_MS;
|
|
79
|
+
private _retryUntil;
|
|
80
|
+
}
|
|
81
|
+
/** @internal Build a {@link GlubeanFrame} — called by `GlubeanPage.frame()`. */
|
|
82
|
+
export declare function createFrame(frame: Frame, ctx: LocatorContext, actionTimeout: number): GlubeanFrame;
|
|
83
|
+
//# sourceMappingURL=frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../src/frame.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAwB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9F,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;IAEpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,oDAAoD;gBACxC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;IAMpE,yBAAyB;IACzB,GAAG,IAAI,MAAM;IAIb;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAKzC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc;IAIpC,2EAA2E;IAC3E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAIpC,iGAAiG;IACjG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc;IAOjE,mFAAmF;IACnF,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc;IAItC,oEAAoE;IAC9D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E,iEAAiE;IAC3D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxF,kFAAkF;IAC5E,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvF,yEAAyE;IACnE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E,0FAA0F;IACpF,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBnD,iGAAiG;IAC3F,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpF,yGAAyG;IACnG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnF;;;;OAIG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACpE,OAAO,CAAC,IAAI,CAAC;IA4BhB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAO;YAEzB,WAAW;CA8C1B;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,cAAc,EACnB,aAAa,EAAE,MAAM,GACpB,YAAY,CAEd"}
|
package/dist/frame.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GlubeanFrame — locator ergonomics scoped to an `<iframe>`'s content frame.
|
|
3
|
+
*
|
|
4
|
+
* Per the proposal's "iframe is a hybrid" note (browser-testing-cloud-rollout.md
|
|
5
|
+
* M5): CDP already does the execution-context switch — that's Puppeteer's own
|
|
6
|
+
* `Frame` object, wired up via `Page.frameAttached` / `Runtime.executionContextCreated`
|
|
7
|
+
* before this module ever runs. The only thing missing was the encapsulation
|
|
8
|
+
* layer's locator ergonomics (byTestId/byText/byRole/byLabel, auto-tracing
|
|
9
|
+
* click/fill/type/hover, auto-retrying expect*) scoped to a frame instead of
|
|
10
|
+
* the top-level page — that's what this module adds. Created via
|
|
11
|
+
* `GlubeanPage.frame(selector)`.
|
|
12
|
+
*
|
|
13
|
+
* @module frame
|
|
14
|
+
*/
|
|
15
|
+
import { createWrappedLocator } from "./locator.js";
|
|
16
|
+
/**
|
|
17
|
+
* A Puppeteer `Frame` wrapped with the same locator/assertion ergonomics as
|
|
18
|
+
* `GlubeanPage`, scoped to that frame's content. Returned by `page.frame()`.
|
|
19
|
+
*/
|
|
20
|
+
export class GlubeanFrame {
|
|
21
|
+
/** The underlying Puppeteer Frame for advanced use cases. */
|
|
22
|
+
raw;
|
|
23
|
+
_ctx;
|
|
24
|
+
_actionTimeout;
|
|
25
|
+
/** @internal — created by `GlubeanPage.frame()`. */
|
|
26
|
+
constructor(frame, ctx, actionTimeout) {
|
|
27
|
+
this.raw = frame;
|
|
28
|
+
this._ctx = ctx;
|
|
29
|
+
this._actionTimeout = actionTimeout;
|
|
30
|
+
}
|
|
31
|
+
/** Current frame URL. */
|
|
32
|
+
url() {
|
|
33
|
+
return this.raw.url();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a WrappedLocator scoped to this frame — same auto-tracing/
|
|
37
|
+
* screenshot behavior as `GlubeanPage.locator()`.
|
|
38
|
+
*/
|
|
39
|
+
locator(selector) {
|
|
40
|
+
const inner = this.raw.locator(selector);
|
|
41
|
+
return createWrappedLocator(inner, this._ctx, selector, this.raw);
|
|
42
|
+
}
|
|
43
|
+
/** Locate an element by its `data-testid` attribute, scoped to this frame. */
|
|
44
|
+
byTestId(id) {
|
|
45
|
+
return this.locator(`[data-testid="${id}"]`);
|
|
46
|
+
}
|
|
47
|
+
/** Locate an element by its visible text content, scoped to this frame. */
|
|
48
|
+
byText(text) {
|
|
49
|
+
return this.locator(`::-p-text(${text})`);
|
|
50
|
+
}
|
|
51
|
+
/** Locate an element by its ARIA role (and optionally accessible name), scoped to this frame. */
|
|
52
|
+
byRole(role, options) {
|
|
53
|
+
if (options?.name) {
|
|
54
|
+
return this.locator(`::-p-aria(${options.name}[role="${role}"])`);
|
|
55
|
+
}
|
|
56
|
+
return this.locator(`[role="${role}"]`);
|
|
57
|
+
}
|
|
58
|
+
/** Locate an element by its accessible name (ARIA label), scoped to this frame. */
|
|
59
|
+
byLabel(label) {
|
|
60
|
+
return this.locator(`::-p-aria(${label})`);
|
|
61
|
+
}
|
|
62
|
+
/** Click an element matching the selector, scoped to this frame. */
|
|
63
|
+
async click(selector, options) {
|
|
64
|
+
await this.locator(selector)
|
|
65
|
+
.setTimeout(options?.timeout ?? this._actionTimeout)
|
|
66
|
+
.click();
|
|
67
|
+
}
|
|
68
|
+
/** Clear an input and type a new value, scoped to this frame. */
|
|
69
|
+
async fill(selector, value, options) {
|
|
70
|
+
await this.locator(selector)
|
|
71
|
+
.setTimeout(options?.timeout ?? this._actionTimeout)
|
|
72
|
+
.fill(value);
|
|
73
|
+
}
|
|
74
|
+
/** Type text into an element (appends — does not clear), scoped to this frame. */
|
|
75
|
+
async type(selector, text, options) {
|
|
76
|
+
await this.locator(selector)
|
|
77
|
+
.setTimeout(options?.timeout ?? this._actionTimeout)
|
|
78
|
+
.type(text);
|
|
79
|
+
}
|
|
80
|
+
/** Hover over an element matching the selector, scoped to this frame. */
|
|
81
|
+
async hover(selector, options) {
|
|
82
|
+
await this.locator(selector)
|
|
83
|
+
.setTimeout(options?.timeout ?? this._actionTimeout)
|
|
84
|
+
.hover();
|
|
85
|
+
}
|
|
86
|
+
/** Check whether an element is currently visible. Returns immediately — does not wait. */
|
|
87
|
+
async isVisible(selector) {
|
|
88
|
+
const handle = await this.raw.$(selector);
|
|
89
|
+
if (!handle)
|
|
90
|
+
return false;
|
|
91
|
+
try {
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
93
|
+
return await handle.evaluate((el) => {
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
+
const style = globalThis.getComputedStyle(el);
|
|
96
|
+
if (style.display === "none" || style.visibility === "hidden")
|
|
97
|
+
return false;
|
|
98
|
+
const box = el.getBoundingClientRect();
|
|
99
|
+
return box.width > 0 && box.height > 0;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
await handle.dispose();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Assert that an element is visible, scoped to this frame. Retries until visible or timeout. */
|
|
107
|
+
async expectVisible(selector, options) {
|
|
108
|
+
await this._retryUntil(() => this.isVisible(selector), (visible) => visible === true, "browser:assert", `expectVisible("${selector}")`, () => `expectVisible("${selector}"): element was not visible after ${options?.timeout ?? 5_000}ms`, options);
|
|
109
|
+
}
|
|
110
|
+
/** Assert that an element is hidden or absent, scoped to this frame. Retries until hidden or timeout. */
|
|
111
|
+
async expectHidden(selector, options) {
|
|
112
|
+
await this._retryUntil(() => this.isVisible(selector), (visible) => visible === false, "browser:assert", `expectHidden("${selector}")`, () => `expectHidden("${selector}"): element was still visible after ${options?.timeout ?? 5_000}ms`, options);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Assert that an element's text content matches `expected`, scoped to this
|
|
116
|
+
* frame. Retries until match or timeout. Same normalize/match rules as
|
|
117
|
+
* `GlubeanPage.expectText()`.
|
|
118
|
+
*/
|
|
119
|
+
async expectText(selector, expected, options) {
|
|
120
|
+
const normalize = (s) => s.replace(/\s+/g, " ").trim();
|
|
121
|
+
const matches = (text) => {
|
|
122
|
+
if (text === null)
|
|
123
|
+
return false;
|
|
124
|
+
if (expected instanceof RegExp)
|
|
125
|
+
return expected.test(text);
|
|
126
|
+
const norm = normalize(text);
|
|
127
|
+
const exp = normalize(expected);
|
|
128
|
+
if (options?.exact) {
|
|
129
|
+
return options?.ignoreCase ? norm.toLowerCase() === exp.toLowerCase() : norm === exp;
|
|
130
|
+
}
|
|
131
|
+
return options?.ignoreCase ? norm.toLowerCase().includes(exp.toLowerCase()) : norm.includes(exp);
|
|
132
|
+
};
|
|
133
|
+
await this._retryUntil(
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
135
|
+
() => this.raw.$eval(selector, (el) => el.textContent).catch(() => null), matches, "browser:assert", `expectText("${selector}")`, (lastVal) => `expectText("${selector}"): expected ${JSON.stringify(expected)} but received ` +
|
|
136
|
+
`${JSON.stringify(lastVal)} after ${options?.timeout ?? 5_000}ms`, options);
|
|
137
|
+
}
|
|
138
|
+
// ── Retry utility (mirrors GlubeanPage._retryUntil) ─────────────────
|
|
139
|
+
static _POLL_MS = 100;
|
|
140
|
+
async _retryUntil(fn, check, category, target, errorMsg, options) {
|
|
141
|
+
const timeout = options?.timeout ?? 5_000;
|
|
142
|
+
const start = Date.now();
|
|
143
|
+
let lastVal;
|
|
144
|
+
while (Date.now() - start < timeout) {
|
|
145
|
+
try {
|
|
146
|
+
lastVal = await fn();
|
|
147
|
+
if (check(lastVal)) {
|
|
148
|
+
this._ctx.action({ category, target, duration: Date.now() - start, status: "ok" });
|
|
149
|
+
return lastVal;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// element may not exist yet — retry
|
|
154
|
+
}
|
|
155
|
+
await new Promise((r) => setTimeout(r, GlubeanFrame._POLL_MS));
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
lastVal = await fn();
|
|
159
|
+
if (check(lastVal)) {
|
|
160
|
+
this._ctx.action({ category, target, duration: Date.now() - start, status: "ok" });
|
|
161
|
+
return lastVal;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// fall through to error
|
|
166
|
+
}
|
|
167
|
+
const msg = errorMsg(lastVal);
|
|
168
|
+
this._ctx.action({
|
|
169
|
+
category,
|
|
170
|
+
target,
|
|
171
|
+
duration: Date.now() - start,
|
|
172
|
+
status: "timeout",
|
|
173
|
+
detail: { error: msg },
|
|
174
|
+
});
|
|
175
|
+
await this._ctx.captureFailure(target);
|
|
176
|
+
throw new Error(msg);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** @internal Build a {@link GlubeanFrame} — called by `GlubeanPage.frame()`. */
|
|
180
|
+
export function createFrame(frame, ctx, actionTimeout) {
|
|
181
|
+
return new GlubeanFrame(frame, ctx, actionTimeout);
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../src/frame.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -38,6 +38,9 @@
|
|
|
38
38
|
*/
|
|
39
39
|
export { browser } from "./plugin.js";
|
|
40
40
|
export { GlubeanBrowser, GlubeanPage } from "./page.js";
|
|
41
|
-
export type { ActionOptions, BrowserAction, BrowserEvent, BrowserOptions, BrowserTestContext, InstrumentedPage, PuppeteerLike, NetworkTraceOptions, ResponseChecks,
|
|
42
|
-
export type {
|
|
41
|
+
export type { ActionOptions, BrowserAction, BrowserEvent, BrowserOptions, BrowserTestContext, DialogHandler, DialogMode, InstrumentedPage, PuppeteerLike, NetworkTraceOptions, ResponseChecks, } from "./page.js";
|
|
42
|
+
export type { DownloadEntry, DownloadOptions, DownloadState, EmulationOptions, EvidenceScreenshotOptions, GeolocationOverride, MockRule, ScreenshotEntry, ScreenshotMode, ScreenshotTrigger, StorageCookie, StorageState, ViewportOverride, } from "./evidence.js";
|
|
43
|
+
export type { IndexedLocator, Queryable, WrappedLocator } from "./locator.js";
|
|
44
|
+
export { GlubeanFrame } from "./frame.js";
|
|
45
|
+
export type { FrameActionOptions } from "./frame.js";
|
|
43
46
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,QAAQ,EACR,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA8BxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/locator.d.ts
CHANGED
|
@@ -4,7 +4,16 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @module locator
|
|
6
6
|
*/
|
|
7
|
-
import type { Locator } from "puppeteer-core";
|
|
7
|
+
import type { ElementHandle, Locator } from "puppeteer-core";
|
|
8
|
+
/**
|
|
9
|
+
* Structural subset of `Page` / `Frame` needed to re-query a selector for
|
|
10
|
+
* `count()` / `nth()`. Both Puppeteer types satisfy this — widened from a
|
|
11
|
+
* hard `Page` type (BT1-M5) so `createWrappedLocator` also works when called
|
|
12
|
+
* with a `Frame` (`page.frame()`'s locator scoping), not just a top-level Page.
|
|
13
|
+
*/
|
|
14
|
+
export interface Queryable {
|
|
15
|
+
$$(selector: string): Promise<ElementHandle[]>;
|
|
16
|
+
}
|
|
8
17
|
/** Context required by the WrappedLocator for trace/screenshot injection. */
|
|
9
18
|
export interface LocatorContext {
|
|
10
19
|
action(event: {
|
|
@@ -17,6 +26,25 @@ export interface LocatorContext {
|
|
|
17
26
|
captureStep(label: string): Promise<void>;
|
|
18
27
|
captureFailure(label: string): Promise<void>;
|
|
19
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* An index-scoped locator returned by `WrappedLocator.nth()`.
|
|
31
|
+
*
|
|
32
|
+
* Puppeteer's own `Locator` resolves a CSS/text/ARIA selector to its
|
|
33
|
+
* **first** match only — there is no native way to act on the Nth match.
|
|
34
|
+
* `nth()` fills that gap with a minimal, independently-polled action surface
|
|
35
|
+
* (not a full `Locator`), resolving matches via `page.$$()` so Puppeteer's
|
|
36
|
+
* `::-p-text()` / `::-p-aria()` / `::-p-xpath()` pseudo-selectors still work.
|
|
37
|
+
*/
|
|
38
|
+
export interface IndexedLocator {
|
|
39
|
+
click(): Promise<void>;
|
|
40
|
+
/** Clears the field's existing value, then types `value`. */
|
|
41
|
+
fill(value: string): Promise<void>;
|
|
42
|
+
hover(): Promise<void>;
|
|
43
|
+
/** Types `text` without clearing the existing value. */
|
|
44
|
+
type(text: string): Promise<void>;
|
|
45
|
+
/** Resolve (waiting up to the configured timeout) and return the raw handle. */
|
|
46
|
+
waitHandle(): Promise<ElementHandle>;
|
|
47
|
+
}
|
|
20
48
|
/** A Puppeteer Locator enhanced with auto-tracing and screenshot capture. */
|
|
21
49
|
export type WrappedLocator = Locator<any> & {
|
|
22
50
|
/**
|
|
@@ -26,14 +54,57 @@ export type WrappedLocator = Locator<any> & {
|
|
|
26
54
|
* that calls `waitHandle()` + `handle.type()` under the hood.
|
|
27
55
|
*/
|
|
28
56
|
type(text: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Immediate count of elements currently matching the selector. Does **not**
|
|
59
|
+
* wait/retry — for an auto-retrying count assertion, use `page.expectCount()`.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* const n = await page.locator('[data-testid="product-item"]').count();
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
count(): Promise<number>;
|
|
67
|
+
/**
|
|
68
|
+
* Locate the Nth (0-based) element matching this locator's selector.
|
|
69
|
+
*
|
|
70
|
+
* Independently polled — see {@link IndexedLocator}. Puppeteer's Locator
|
|
71
|
+
* always resolves to the first DOM match, so `nth()` is the only way to
|
|
72
|
+
* act on e.g. "the 2nd product card" without a bespoke selector.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* await page.locator('[data-testid="add-to-cart"]').nth(1).click();
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
nth(index: number, options?: {
|
|
80
|
+
timeout?: number;
|
|
81
|
+
}): IndexedLocator;
|
|
29
82
|
};
|
|
83
|
+
/**
|
|
84
|
+
* @internal Poll for the 0-based `index`-th element matching `selector`,
|
|
85
|
+
* returning its ElementHandle. Uses Puppeteer's own `page.$$()` (not raw
|
|
86
|
+
* `document.querySelectorAll`) so it understands Puppeteer's custom
|
|
87
|
+
* pseudo-selectors — `::-p-text()`, `::-p-aria()`, `::-p-xpath()` — that
|
|
88
|
+
* `byText()` / `byRole()` / `byLabel()` emit and that the DOM API can't parse.
|
|
89
|
+
* The non-chosen matches are disposed each poll; only the returned handle
|
|
90
|
+
* survives (the caller disposes it). Throws with a clear message on timeout.
|
|
91
|
+
*/
|
|
92
|
+
export declare function resolveNthHandle(page: Queryable, selector: string, index: number, timeoutMs: number): Promise<ElementHandle>;
|
|
30
93
|
/**
|
|
31
94
|
* Create a WrappedLocator that proxies a Puppeteer Locator with auto-tracing.
|
|
32
95
|
*
|
|
33
96
|
* - **Chain methods** (setTimeout, setVisibility, etc.) return a new WrappedLocator.
|
|
34
97
|
* - **Action methods** (click, fill, hover, scroll) inject trace + screenshot.
|
|
35
98
|
* - **type()** is a custom extension (Locator has no type method).
|
|
99
|
+
* - **count() / nth()** are custom extensions (see {@link IndexedLocator}) —
|
|
100
|
+
* Puppeteer's Locator only ever resolves the first DOM match. They re-query
|
|
101
|
+
* by the selector string (via `page.$$`, which understands Puppeteer's
|
|
102
|
+
* `::-p-*` pseudo-selectors), so they cannot honor a `.filter()` / `.map()`
|
|
103
|
+
* predicate — calling them after those throws rather than mislead.
|
|
36
104
|
* - Everything else is transparently forwarded.
|
|
105
|
+
*
|
|
106
|
+
* @param filtered — set on locators produced by a `.filter()` / `.map()` chain;
|
|
107
|
+
* makes `count()` / `nth()` throw (their selector re-query can't replay the predicate).
|
|
37
108
|
*/
|
|
38
|
-
export declare function createWrappedLocator(inner: Locator<unknown>, ctx: LocatorContext, selector: string): WrappedLocator;
|
|
109
|
+
export declare function createWrappedLocator(inner: Locator<unknown>, ctx: LocatorContext, selector: string, page: Queryable, filtered?: boolean): WrappedLocator;
|
|
39
110
|
//# sourceMappingURL=locator.d.ts.map
|
package/dist/locator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locator.d.ts","sourceRoot":"","sources":["../src/locator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"locator.d.ts","sourceRoot":"","sources":["../src/locator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAChD;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,KAAK,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,IAAI,CAAC;IACT,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,6DAA6D;IAC7D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,wDAAwD;IACxD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,gFAAgF;IAChF,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACtC;AAED,6EAA6E;AAE7E,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG;IAC1C;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC;;;;;;;;OAQG;IACH,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC;CACpE,CAAC;AAaF;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAiBxB;AA6FD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EACvB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,SAAS,EACf,QAAQ,UAAQ,GACf,cAAc,CAqHhB"}
|
package/dist/locator.js
CHANGED
|
@@ -4,6 +4,88 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @module locator
|
|
6
6
|
*/
|
|
7
|
+
/** @internal Default poll interval while waiting for an nth() match. */
|
|
8
|
+
const NTH_POLL_MS = 100;
|
|
9
|
+
/** @internal Default nth()/count() action timeout — mirrors `actionTimeout`. */
|
|
10
|
+
const NTH_DEFAULT_TIMEOUT_MS = 30_000;
|
|
11
|
+
/** @internal Error thrown when count()/nth() are used on a filtered/mapped locator. */
|
|
12
|
+
const COUNT_NTH_FILTERED_MSG = (method) => `${method}() is not supported after .filter()/.map(): it re-queries by the ` +
|
|
13
|
+
`original selector and cannot replay the predicate. Encode the condition in ` +
|
|
14
|
+
`the selector, or use page.$$()/page.$$eval() directly.`;
|
|
15
|
+
/**
|
|
16
|
+
* @internal Poll for the 0-based `index`-th element matching `selector`,
|
|
17
|
+
* returning its ElementHandle. Uses Puppeteer's own `page.$$()` (not raw
|
|
18
|
+
* `document.querySelectorAll`) so it understands Puppeteer's custom
|
|
19
|
+
* pseudo-selectors — `::-p-text()`, `::-p-aria()`, `::-p-xpath()` — that
|
|
20
|
+
* `byText()` / `byRole()` / `byLabel()` emit and that the DOM API can't parse.
|
|
21
|
+
* The non-chosen matches are disposed each poll; only the returned handle
|
|
22
|
+
* survives (the caller disposes it). Throws with a clear message on timeout.
|
|
23
|
+
*/
|
|
24
|
+
export async function resolveNthHandle(page, selector, index, timeoutMs) {
|
|
25
|
+
const start = Date.now();
|
|
26
|
+
for (;;) {
|
|
27
|
+
const handles = await page.$$(selector);
|
|
28
|
+
const chosen = handles[index];
|
|
29
|
+
// Dispose every handle we're not returning so remote objects don't leak.
|
|
30
|
+
await Promise.all(handles.map((h) => (h === chosen ? Promise.resolve() : h.dispose())));
|
|
31
|
+
if (chosen)
|
|
32
|
+
return chosen;
|
|
33
|
+
if (Date.now() - start >= timeoutMs) {
|
|
34
|
+
throw new Error(`nth(${index}): no element matched "${selector}" at index ${index} after ${timeoutMs}ms`);
|
|
35
|
+
}
|
|
36
|
+
await new Promise((r) => setTimeout(r, NTH_POLL_MS));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** @internal Build the {@link IndexedLocator} returned by `WrappedLocator.nth()`. */
|
|
40
|
+
function createIndexedLocator(page, ctx, selector, index, timeoutMs) {
|
|
41
|
+
const label = `${selector} >> nth=${index}`;
|
|
42
|
+
const act = async (category, detail, fn) => {
|
|
43
|
+
const start = Date.now();
|
|
44
|
+
try {
|
|
45
|
+
const handle = await resolveNthHandle(page, selector, index, timeoutMs);
|
|
46
|
+
try {
|
|
47
|
+
await fn(handle);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
await handle.dispose();
|
|
51
|
+
}
|
|
52
|
+
ctx.action({
|
|
53
|
+
category: `browser:${category}`,
|
|
54
|
+
target: label,
|
|
55
|
+
duration: Date.now() - start,
|
|
56
|
+
status: "ok",
|
|
57
|
+
detail,
|
|
58
|
+
});
|
|
59
|
+
await ctx.captureStep(`${category}-${label}`);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
ctx.action({
|
|
63
|
+
category: `browser:${category}`,
|
|
64
|
+
target: label,
|
|
65
|
+
duration: Date.now() - start,
|
|
66
|
+
status: "timeout",
|
|
67
|
+
detail: { ...detail, error: String(err) },
|
|
68
|
+
});
|
|
69
|
+
await ctx.captureFailure(`${category}-${label}`);
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
click: () => act("click", undefined, (h) => h.click()),
|
|
75
|
+
fill: (value) => act("fill", { textLength: value.length }, async (h) => {
|
|
76
|
+
await h.evaluate((el) => {
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
+
const input = el;
|
|
79
|
+
input.value = "";
|
|
80
|
+
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
81
|
+
});
|
|
82
|
+
await h.type(value);
|
|
83
|
+
}),
|
|
84
|
+
hover: () => act("hover", undefined, (h) => h.hover()),
|
|
85
|
+
type: (text) => act("type", { textLength: text.length }, (h) => h.type(text)),
|
|
86
|
+
waitHandle: () => resolveNthHandle(page, selector, index, timeoutMs),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
7
89
|
/** Methods that return a new Locator — we re-wrap the result. */
|
|
8
90
|
const CHAIN_METHODS = new Set([
|
|
9
91
|
"setTimeout",
|
|
@@ -15,6 +97,13 @@ const CHAIN_METHODS = new Set([
|
|
|
15
97
|
"filter",
|
|
16
98
|
"map",
|
|
17
99
|
]);
|
|
100
|
+
/**
|
|
101
|
+
* Chain methods that change the *match set* a Locator resolves — after these,
|
|
102
|
+
* `count()` / `nth()` (which re-query by the raw selector string, not by
|
|
103
|
+
* replaying the Locator's predicate) would give results inconsistent with the
|
|
104
|
+
* chained Locator. They throw instead of silently returning wrong matches.
|
|
105
|
+
*/
|
|
106
|
+
const SET_MUTATING_METHODS = new Set(["filter", "map"]);
|
|
18
107
|
/** Action methods that get trace/screenshot injection. */
|
|
19
108
|
const ACTION_METHODS = new Set([
|
|
20
109
|
"click",
|
|
@@ -28,11 +117,43 @@ const ACTION_METHODS = new Set([
|
|
|
28
117
|
* - **Chain methods** (setTimeout, setVisibility, etc.) return a new WrappedLocator.
|
|
29
118
|
* - **Action methods** (click, fill, hover, scroll) inject trace + screenshot.
|
|
30
119
|
* - **type()** is a custom extension (Locator has no type method).
|
|
120
|
+
* - **count() / nth()** are custom extensions (see {@link IndexedLocator}) —
|
|
121
|
+
* Puppeteer's Locator only ever resolves the first DOM match. They re-query
|
|
122
|
+
* by the selector string (via `page.$$`, which understands Puppeteer's
|
|
123
|
+
* `::-p-*` pseudo-selectors), so they cannot honor a `.filter()` / `.map()`
|
|
124
|
+
* predicate — calling them after those throws rather than mislead.
|
|
31
125
|
* - Everything else is transparently forwarded.
|
|
126
|
+
*
|
|
127
|
+
* @param filtered — set on locators produced by a `.filter()` / `.map()` chain;
|
|
128
|
+
* makes `count()` / `nth()` throw (their selector re-query can't replay the predicate).
|
|
32
129
|
*/
|
|
33
|
-
export function createWrappedLocator(inner, ctx, selector) {
|
|
130
|
+
export function createWrappedLocator(inner, ctx, selector, page, filtered = false) {
|
|
34
131
|
const proxy = new Proxy(inner, {
|
|
35
132
|
get(target, prop, receiver) {
|
|
133
|
+
if (prop === "count") {
|
|
134
|
+
// Non-async so the filtered guard throws synchronously (like nth()),
|
|
135
|
+
// not as a rejected promise. Dispose the handles `$$` returns — we only
|
|
136
|
+
// want the count, and undisposed handles leak remote objects in Chrome.
|
|
137
|
+
return () => {
|
|
138
|
+
if (filtered)
|
|
139
|
+
throw new Error(COUNT_NTH_FILTERED_MSG("count"));
|
|
140
|
+
return page.$$(selector).then(async (handles) => {
|
|
141
|
+
try {
|
|
142
|
+
return handles.length;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
await Promise.all(handles.map((h) => h.dispose()));
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
if (prop === "nth") {
|
|
151
|
+
return (index, options) => {
|
|
152
|
+
if (filtered)
|
|
153
|
+
throw new Error(COUNT_NTH_FILTERED_MSG("nth"));
|
|
154
|
+
return createIndexedLocator(page, ctx, selector, index, options?.timeout ?? NTH_DEFAULT_TIMEOUT_MS);
|
|
155
|
+
};
|
|
156
|
+
}
|
|
36
157
|
if (prop === "type") {
|
|
37
158
|
return async (text) => {
|
|
38
159
|
const start = Date.now();
|
|
@@ -70,7 +191,11 @@ export function createWrappedLocator(inner, ctx, selector) {
|
|
|
70
191
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
192
|
return (...args) => {
|
|
72
193
|
const newLocator = origFn.apply(target, args);
|
|
73
|
-
|
|
194
|
+
// Once a match-set-mutating method (filter/map) is applied, the
|
|
195
|
+
// re-wrapped locator carries `filtered` so count()/nth() refuse
|
|
196
|
+
// to run against the raw selector.
|
|
197
|
+
const nextFiltered = filtered || SET_MUTATING_METHODS.has(prop);
|
|
198
|
+
return createWrappedLocator(newLocator, ctx, selector, page, nextFiltered);
|
|
74
199
|
};
|
|
75
200
|
}
|
|
76
201
|
}
|