@mobilewright/core 0.0.40 → 0.0.42
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/device.d.ts +4 -0
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +13 -2
- package/dist/device.js.map +1 -1
- package/dist/expect.d.ts +82 -11
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +181 -22
- package/dist/expect.js.map +1 -1
- package/dist/expect.test.js +17 -0
- package/dist/expect.test.js.map +1 -1
- package/dist/fake-webview-session.d.ts +14 -0
- package/dist/fake-webview-session.d.ts.map +1 -0
- package/dist/fake-webview-session.js +26 -0
- package/dist/fake-webview-session.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/locator.d.ts +8 -5
- package/dist/locator.d.ts.map +1 -1
- package/dist/locator.js +5 -6
- package/dist/locator.js.map +1 -1
- package/dist/locator.test.js +178 -0
- package/dist/locator.test.js.map +1 -1
- package/dist/page.d.ts +52 -0
- package/dist/page.d.ts.map +1 -0
- package/dist/page.js +226 -0
- package/dist/page.js.map +1 -0
- package/dist/page.test.d.ts +2 -0
- package/dist/page.test.d.ts.map +1 -0
- package/dist/page.test.js +263 -0
- package/dist/page.test.js.map +1 -0
- package/dist/playwright-engine.d.ts +23 -0
- package/dist/playwright-engine.d.ts.map +1 -0
- package/dist/playwright-engine.js +79 -0
- package/dist/playwright-engine.js.map +1 -0
- package/dist/playwright-engine.test.d.ts +2 -0
- package/dist/playwright-engine.test.d.ts.map +1 -0
- package/dist/playwright-engine.test.js +45 -0
- package/dist/playwright-engine.test.js.map +1 -0
- package/dist/query-engine.d.ts +4 -0
- package/dist/query-engine.d.ts.map +1 -1
- package/dist/query-engine.js +15 -0
- package/dist/query-engine.js.map +1 -1
- package/dist/query-engine.test.js +64 -1
- package/dist/query-engine.test.js.map +1 -1
- package/dist/screen.d.ts +7 -0
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +7 -0
- package/dist/screen.js.map +1 -1
- package/dist/stackTrace.d.ts +3 -0
- package/dist/stackTrace.d.ts.map +1 -1
- package/dist/stackTrace.js +10 -0
- package/dist/stackTrace.js.map +1 -1
- package/dist/stackTrace.test.d.ts +2 -0
- package/dist/stackTrace.test.d.ts.map +1 -0
- package/dist/stackTrace.test.js +43 -0
- package/dist/stackTrace.test.js.map +1 -0
- package/dist/web-expect-matcher.d.ts +29 -0
- package/dist/web-expect-matcher.d.ts.map +1 -0
- package/dist/web-expect-matcher.js +23 -0
- package/dist/web-expect-matcher.js.map +1 -0
- package/dist/web-expect-matcher.test.d.ts +2 -0
- package/dist/web-expect-matcher.test.d.ts.map +1 -0
- package/dist/web-expect-matcher.test.js +21 -0
- package/dist/web-expect-matcher.test.js.map +1 -0
- package/dist/web-expect.test.d.ts +2 -0
- package/dist/web-expect.test.d.ts.map +1 -0
- package/dist/web-expect.test.js +93 -0
- package/dist/web-expect.test.js.map +1 -0
- package/dist/web-locator-pwexpect.test.d.ts +2 -0
- package/dist/web-locator-pwexpect.test.d.ts.map +1 -0
- package/dist/web-locator-pwexpect.test.js +36 -0
- package/dist/web-locator-pwexpect.test.js.map +1 -0
- package/dist/web-locator-reinjection.test.d.ts +2 -0
- package/dist/web-locator-reinjection.test.d.ts.map +1 -0
- package/dist/web-locator-reinjection.test.js +83 -0
- package/dist/web-locator-reinjection.test.js.map +1 -0
- package/dist/web-locator.d.ts +120 -0
- package/dist/web-locator.d.ts.map +1 -0
- package/dist/web-locator.js +332 -0
- package/dist/web-locator.js.map +1 -0
- package/dist/web-locator.test.d.ts +2 -0
- package/dist/web-locator.test.d.ts.map +1 -0
- package/dist/web-locator.test.js +424 -0
- package/dist/web-locator.test.js.map +1 -0
- package/dist/webview-locator.d.ts +14 -0
- package/dist/webview-locator.d.ts.map +1 -0
- package/dist/webview-locator.js +95 -0
- package/dist/webview-locator.js.map +1 -0
- package/dist/webview-locator.test.d.ts +2 -0
- package/dist/webview-locator.test.d.ts.map +1 -0
- package/dist/webview-locator.test.js +203 -0
- package/dist/webview-locator.test.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { Locator } from '@playwright/test';
|
|
2
|
+
import type { Bounds, WebViewSession } from '@mobilewright/protocol';
|
|
3
|
+
import type { StepFn } from './locator.js';
|
|
4
|
+
import { type FrameExpectParams, type ExpectResult, type ExpectedTextValue } from './web-expect-matcher.js';
|
|
5
|
+
interface PlaywrightExpectOptions {
|
|
6
|
+
isNot?: boolean;
|
|
7
|
+
timeout?: number;
|
|
8
|
+
expectedText?: ExpectedTextValue[];
|
|
9
|
+
expectedNumber?: number;
|
|
10
|
+
expectedValue?: unknown;
|
|
11
|
+
expressionArg?: unknown;
|
|
12
|
+
}
|
|
13
|
+
interface PlaywrightExpectResult {
|
|
14
|
+
matches: boolean;
|
|
15
|
+
received?: unknown;
|
|
16
|
+
timedOut: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class MobileWebViewLocator {
|
|
19
|
+
protected readonly session: WebViewSession;
|
|
20
|
+
protected readonly selector: string;
|
|
21
|
+
_stepFn: StepFn | null;
|
|
22
|
+
constructor(session: WebViewSession, selector: string);
|
|
23
|
+
private derive;
|
|
24
|
+
private child;
|
|
25
|
+
private _step;
|
|
26
|
+
private firstEl;
|
|
27
|
+
private firstElExpr;
|
|
28
|
+
private evalEngine;
|
|
29
|
+
private evalOnFirst;
|
|
30
|
+
private actOnFirst;
|
|
31
|
+
private pollBoolean;
|
|
32
|
+
private readElementState;
|
|
33
|
+
private readFromFirst;
|
|
34
|
+
private readStringProp;
|
|
35
|
+
locator(selector: string): MobileWebViewLocator;
|
|
36
|
+
getByRole(role: string, opts?: {
|
|
37
|
+
name?: string | RegExp;
|
|
38
|
+
exact?: boolean;
|
|
39
|
+
}): MobileWebViewLocator;
|
|
40
|
+
getByText(text: string | RegExp, opts?: {
|
|
41
|
+
exact?: boolean;
|
|
42
|
+
}): MobileWebViewLocator;
|
|
43
|
+
getByLabel(label: string | RegExp, opts?: {
|
|
44
|
+
exact?: boolean;
|
|
45
|
+
}): MobileWebViewLocator;
|
|
46
|
+
getByPlaceholder(text: string | RegExp, opts?: {
|
|
47
|
+
exact?: boolean;
|
|
48
|
+
}): MobileWebViewLocator;
|
|
49
|
+
getByTestId(testId: string): MobileWebViewLocator;
|
|
50
|
+
getByAltText(text: string | RegExp): MobileWebViewLocator;
|
|
51
|
+
getByTitle(text: string | RegExp): MobileWebViewLocator;
|
|
52
|
+
first(): MobileWebViewLocator;
|
|
53
|
+
last(): MobileWebViewLocator;
|
|
54
|
+
nth(index: number): MobileWebViewLocator;
|
|
55
|
+
count(): Promise<number>;
|
|
56
|
+
getText(opts?: {
|
|
57
|
+
timeout?: number;
|
|
58
|
+
}): Promise<string>;
|
|
59
|
+
getValue(opts?: {
|
|
60
|
+
timeout?: number;
|
|
61
|
+
}): Promise<string>;
|
|
62
|
+
all(): Promise<MobileWebViewLocator[]>;
|
|
63
|
+
isVisible(opts?: {
|
|
64
|
+
timeout?: number;
|
|
65
|
+
}): Promise<boolean>;
|
|
66
|
+
isHidden(opts?: {
|
|
67
|
+
timeout?: number;
|
|
68
|
+
}): Promise<boolean>;
|
|
69
|
+
isEnabled(opts?: {
|
|
70
|
+
timeout?: number;
|
|
71
|
+
}): Promise<boolean>;
|
|
72
|
+
isDisabled(opts?: {
|
|
73
|
+
timeout?: number;
|
|
74
|
+
}): Promise<boolean>;
|
|
75
|
+
isChecked(opts?: {
|
|
76
|
+
timeout?: number;
|
|
77
|
+
}): Promise<boolean>;
|
|
78
|
+
textContent(opts?: {
|
|
79
|
+
timeout?: number;
|
|
80
|
+
}): Promise<string>;
|
|
81
|
+
innerText(opts?: {
|
|
82
|
+
timeout?: number;
|
|
83
|
+
}): Promise<string>;
|
|
84
|
+
innerHTML(opts?: {
|
|
85
|
+
timeout?: number;
|
|
86
|
+
}): Promise<string>;
|
|
87
|
+
inputValue(opts?: {
|
|
88
|
+
timeout?: number;
|
|
89
|
+
}): Promise<string>;
|
|
90
|
+
getAttribute(name: string, opts?: {
|
|
91
|
+
timeout?: number;
|
|
92
|
+
}): Promise<string | null>;
|
|
93
|
+
boundingBox(opts?: {
|
|
94
|
+
timeout?: number;
|
|
95
|
+
}): Promise<Bounds | null>;
|
|
96
|
+
waitFor(opts?: {
|
|
97
|
+
state?: 'visible' | 'hidden' | 'attached' | 'detached';
|
|
98
|
+
timeout?: number;
|
|
99
|
+
}): Promise<void>;
|
|
100
|
+
click(opts?: {
|
|
101
|
+
timeout?: number;
|
|
102
|
+
}): Promise<void>;
|
|
103
|
+
fill(text: string, opts?: {
|
|
104
|
+
timeout?: number;
|
|
105
|
+
}): Promise<void>;
|
|
106
|
+
type(text: string): Promise<void>;
|
|
107
|
+
press(key: string): Promise<void>;
|
|
108
|
+
focus(): Promise<void>;
|
|
109
|
+
hover(): Promise<void>;
|
|
110
|
+
scrollIntoViewIfNeeded(): Promise<void>;
|
|
111
|
+
private pollActionable;
|
|
112
|
+
private pollUntilVisible;
|
|
113
|
+
_runInjectedExpect(params: FrameExpectParams): Promise<ExpectResult>;
|
|
114
|
+
_expect(expression: string, options: PlaywrightExpectOptions): Promise<PlaywrightExpectResult>;
|
|
115
|
+
get expectTimeout(): number | undefined;
|
|
116
|
+
}
|
|
117
|
+
export interface MobileWebViewLocator extends Locator {
|
|
118
|
+
}
|
|
119
|
+
export { MobileWebViewLocator as WebLocator };
|
|
120
|
+
//# sourceMappingURL=web-locator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator.d.ts","sourceRoot":"","sources":["../src/web-locator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import createDebug from 'debug';
|
|
2
|
+
import { retryUntil } from './poll.js';
|
|
3
|
+
import { sleep } from './sleep.js';
|
|
4
|
+
import { runStep } from './stackTrace.js';
|
|
5
|
+
import { getByRoleSelector, getByTextSelector, getByLabelSelector, getByPlaceholderSelector, getByAltTextSelector, getByTitleSelector, getByTestIdSelector, TEST_ID_ATTR, evaluateWithEngine, } from './playwright-engine.js';
|
|
6
|
+
import { buildExpectEvaluate } from './web-expect-matcher.js';
|
|
7
|
+
const DEFAULT_TIMEOUT = 5_000;
|
|
8
|
+
const EXPECT_POLL_INTERVAL = 100;
|
|
9
|
+
const debug = createDebug('mw:web-locator');
|
|
10
|
+
// Playwright's injected engine throws this when a strict selector matches >1
|
|
11
|
+
// element. Detected by message text because it crosses the in-page boundary as
|
|
12
|
+
// a plain serialized error.
|
|
13
|
+
function isStrictModeViolation(e) {
|
|
14
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
15
|
+
return message.includes('strict mode violation');
|
|
16
|
+
}
|
|
17
|
+
export class MobileWebViewLocator {
|
|
18
|
+
constructor(session,
|
|
19
|
+
// A Playwright selector string (e.g. 'internal:role=button[name="OK"i]' or a
|
|
20
|
+
// raw CSS selector). Resolved in-page by the imported Playwright engine.
|
|
21
|
+
selector) {
|
|
22
|
+
this.session = session;
|
|
23
|
+
this.selector = selector;
|
|
24
|
+
this._stepFn = null;
|
|
25
|
+
}
|
|
26
|
+
// Build a MobileWebViewLocator from a selector, carrying step instrumentation forward.
|
|
27
|
+
derive(selector) {
|
|
28
|
+
const loc = new MobileWebViewLocator(this.session, selector);
|
|
29
|
+
loc._stepFn = this._stepFn;
|
|
30
|
+
return loc;
|
|
31
|
+
}
|
|
32
|
+
// Compose a child selector within this locator's scope, Playwright-style.
|
|
33
|
+
child(childSelector) {
|
|
34
|
+
return this.derive(`${this.selector} >> ${childSelector}`);
|
|
35
|
+
}
|
|
36
|
+
async _step(title, fn) {
|
|
37
|
+
return runStep(this._stepFn, title, fn);
|
|
38
|
+
}
|
|
39
|
+
// JS expression resolving to the first match via the imported Playwright
|
|
40
|
+
// engine. strict=true: a selector matching >1 element throws a strict-mode
|
|
41
|
+
// violation in-page, matching Playwright's strict locators.
|
|
42
|
+
firstEl() {
|
|
43
|
+
const sel = JSON.stringify(this.selector);
|
|
44
|
+
return `window.__mwInjected.querySelector(window.__mwInjected.parseSelector(${sel}), document, true)`;
|
|
45
|
+
}
|
|
46
|
+
firstElExpr(body) {
|
|
47
|
+
return `(() => { const el = ${this.firstEl()}; ${body} })()`;
|
|
48
|
+
}
|
|
49
|
+
// Every engine-dependent evaluate goes through here so it self-heals: if a
|
|
50
|
+
// page-initiated navigation dropped window.__mwInjected, the engine is
|
|
51
|
+
// re-injected and the call retried once.
|
|
52
|
+
evalEngine(expr) {
|
|
53
|
+
return evaluateWithEngine(this.session, expr);
|
|
54
|
+
}
|
|
55
|
+
evalOnFirst(body) {
|
|
56
|
+
return this.evalEngine(this.firstElExpr(body));
|
|
57
|
+
}
|
|
58
|
+
// Run a mutating action against the first match. Throws in-page when the
|
|
59
|
+
// element is absent so the action rejects instead of silently no-op'ing.
|
|
60
|
+
actOnFirst(action, what) {
|
|
61
|
+
const notFound = JSON.stringify(`${what}: element not found`);
|
|
62
|
+
return this.evalEngine(`(() => { const el = ${this.firstEl()}; if (!el) { throw new Error(${notFound}); } ${action} })()`);
|
|
63
|
+
}
|
|
64
|
+
// Poll a boolean predicate, retrying until true or timeout. timeout 0 checks
|
|
65
|
+
// once. Transient errors (missing element, mid-navigation) count as false, but
|
|
66
|
+
// strict-mode violations propagate — matching Playwright's isVisible.
|
|
67
|
+
async pollBoolean(js, timeout, what) {
|
|
68
|
+
const read = async () => {
|
|
69
|
+
try {
|
|
70
|
+
return await this.evalEngine(js);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
if (isStrictModeViolation(e)) {
|
|
74
|
+
throw e;
|
|
75
|
+
}
|
|
76
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
77
|
+
debug('"%s" check evaluation failed, treating as false: %s', what, message);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
if (timeout === 0) {
|
|
82
|
+
return read();
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
let result = false;
|
|
86
|
+
await retryUntil(async () => { result = await read(); return result; }, (v) => v, timeout, `MobileWebViewLocator: timed out waiting for element to be ${what}`);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
if (isStrictModeViolation(e)) {
|
|
91
|
+
throw e;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Resolve the element (waiting up to timeout) and read an injected element
|
|
97
|
+
// state. Throws "<what>: element not found" when no element resolves —
|
|
98
|
+
// matching Playwright's isEnabled/isChecked, which require an attached element.
|
|
99
|
+
async readElementState(state, timeout, what) {
|
|
100
|
+
const sel = JSON.stringify(this.selector);
|
|
101
|
+
const stateArg = JSON.stringify(state);
|
|
102
|
+
const js = `(() => { const is = window.__mwInjected; const el = is.querySelector(is.parseSelector(${sel}), document, true); if (!el) { return null; } return is.elementState(el, ${stateArg}).matches; })()`;
|
|
103
|
+
let result = false;
|
|
104
|
+
await retryUntil(async () => {
|
|
105
|
+
const matches = await this.evalEngine(js);
|
|
106
|
+
if (matches === null) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
result = matches;
|
|
110
|
+
return true;
|
|
111
|
+
}, (found) => found, timeout, `${what}: element not found`);
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
// Wait for the element to be visible, then return a value read from it.
|
|
115
|
+
async readFromFirst(valueExpr, opts) {
|
|
116
|
+
await this.pollUntilVisible(opts?.timeout ?? DEFAULT_TIMEOUT);
|
|
117
|
+
return this.evalOnFirst(`return ${valueExpr};`);
|
|
118
|
+
}
|
|
119
|
+
async readStringProp(prop, opts) {
|
|
120
|
+
return this.readFromFirst(`el?.${prop} ?? ''`, opts);
|
|
121
|
+
}
|
|
122
|
+
// ─── Chaining ────────────────────────────────────────────────
|
|
123
|
+
locator(selector) {
|
|
124
|
+
return this.child(selector);
|
|
125
|
+
}
|
|
126
|
+
getByRole(role, opts) {
|
|
127
|
+
return this.child(getByRoleSelector(role, { name: opts?.name, exact: opts?.exact }));
|
|
128
|
+
}
|
|
129
|
+
getByText(text, opts) {
|
|
130
|
+
return this.child(getByTextSelector(text, { exact: opts?.exact }));
|
|
131
|
+
}
|
|
132
|
+
getByLabel(label, opts) {
|
|
133
|
+
return this.child(getByLabelSelector(label, { exact: opts?.exact }));
|
|
134
|
+
}
|
|
135
|
+
getByPlaceholder(text, opts) {
|
|
136
|
+
return this.child(getByPlaceholderSelector(text, { exact: opts?.exact }));
|
|
137
|
+
}
|
|
138
|
+
getByTestId(testId) {
|
|
139
|
+
return this.child(getByTestIdSelector(TEST_ID_ATTR, testId));
|
|
140
|
+
}
|
|
141
|
+
getByAltText(text) {
|
|
142
|
+
return this.child(getByAltTextSelector(text));
|
|
143
|
+
}
|
|
144
|
+
getByTitle(text) {
|
|
145
|
+
return this.child(getByTitleSelector(text));
|
|
146
|
+
}
|
|
147
|
+
// ─── Collection ──────────────────────────────────────────────
|
|
148
|
+
first() {
|
|
149
|
+
return this.nth(0);
|
|
150
|
+
}
|
|
151
|
+
last() {
|
|
152
|
+
return this.nth(-1);
|
|
153
|
+
}
|
|
154
|
+
nth(index) {
|
|
155
|
+
return this.derive(`${this.selector} >> nth=${index}`);
|
|
156
|
+
}
|
|
157
|
+
async count() {
|
|
158
|
+
const sel = JSON.stringify(this.selector);
|
|
159
|
+
return this.evalEngine(`window.__mwInjected.querySelectorAll(window.__mwInjected.parseSelector(${sel}), document).length`);
|
|
160
|
+
}
|
|
161
|
+
// Aliases matching native Locator's API so LocatorAssertions works with MobileWebViewLocator
|
|
162
|
+
async getText(opts) {
|
|
163
|
+
return this.textContent(opts);
|
|
164
|
+
}
|
|
165
|
+
async getValue(opts) {
|
|
166
|
+
return this.inputValue(opts);
|
|
167
|
+
}
|
|
168
|
+
async all() {
|
|
169
|
+
const n = await this.count();
|
|
170
|
+
return Array.from({ length: n }, (_, i) => this.nth(i));
|
|
171
|
+
}
|
|
172
|
+
// ─── State queries ───────────────────────────────────────────
|
|
173
|
+
async isVisible(opts) {
|
|
174
|
+
const sel = JSON.stringify(this.selector);
|
|
175
|
+
const js = `(() => { const is = window.__mwInjected; const el = is.querySelector(is.parseSelector(${sel}), document, true); if (!el) { return false; } return is.elementState(el, 'visible').matches; })()`;
|
|
176
|
+
return this.pollBoolean(js, opts?.timeout ?? DEFAULT_TIMEOUT, 'visible');
|
|
177
|
+
}
|
|
178
|
+
async isHidden(opts) {
|
|
179
|
+
const visible = await this.isVisible({ timeout: opts?.timeout ?? 0 });
|
|
180
|
+
return !visible;
|
|
181
|
+
}
|
|
182
|
+
async isEnabled(opts) {
|
|
183
|
+
return this.readElementState('enabled', opts?.timeout ?? 0, 'locator.isEnabled()');
|
|
184
|
+
}
|
|
185
|
+
async isDisabled(opts) {
|
|
186
|
+
const enabled = await this.isEnabled(opts);
|
|
187
|
+
return !enabled;
|
|
188
|
+
}
|
|
189
|
+
async isChecked(opts) {
|
|
190
|
+
return this.readElementState('checked', opts?.timeout ?? 0, 'locator.isChecked()');
|
|
191
|
+
}
|
|
192
|
+
// ─── Value queries ───────────────────────────────────────────
|
|
193
|
+
async textContent(opts) {
|
|
194
|
+
return this.readStringProp('textContent', opts);
|
|
195
|
+
}
|
|
196
|
+
async innerText(opts) {
|
|
197
|
+
return this.readStringProp('innerText', opts);
|
|
198
|
+
}
|
|
199
|
+
async innerHTML(opts) {
|
|
200
|
+
return this.readStringProp('innerHTML', opts);
|
|
201
|
+
}
|
|
202
|
+
async inputValue(opts) {
|
|
203
|
+
return this.readStringProp('value', opts);
|
|
204
|
+
}
|
|
205
|
+
async getAttribute(name, opts) {
|
|
206
|
+
return this.readFromFirst(`el ? el.getAttribute(${JSON.stringify(name)}) : null`, opts);
|
|
207
|
+
}
|
|
208
|
+
async boundingBox(opts) {
|
|
209
|
+
const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;
|
|
210
|
+
await this.pollUntilVisible(timeout);
|
|
211
|
+
return this.evalOnFirst('if (!el) return null; const r = el.getBoundingClientRect(); return { x: r.left, y: r.top, width: r.width, height: r.height };');
|
|
212
|
+
}
|
|
213
|
+
async waitFor(opts) {
|
|
214
|
+
const state = opts?.state ?? 'visible';
|
|
215
|
+
const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;
|
|
216
|
+
await retryUntil(async () => {
|
|
217
|
+
const n = await this.count();
|
|
218
|
+
const visible = n > 0 && await this.isVisible({ timeout: 0 });
|
|
219
|
+
switch (state) {
|
|
220
|
+
case 'visible': return visible;
|
|
221
|
+
case 'hidden': return !visible;
|
|
222
|
+
case 'attached': return n > 0;
|
|
223
|
+
case 'detached': return n === 0;
|
|
224
|
+
}
|
|
225
|
+
}, (result) => result, timeout, `MobileWebViewLocator: timed out waiting for state "${state}"`);
|
|
226
|
+
}
|
|
227
|
+
// ─── Actions ─────────────────────────────────────────────────
|
|
228
|
+
async click(opts) {
|
|
229
|
+
return this._step('locator.click()', async () => {
|
|
230
|
+
await this.pollActionable(['visible', 'enabled'], opts?.timeout ?? DEFAULT_TIMEOUT);
|
|
231
|
+
await this.actOnFirst('el.click();', 'locator.click()');
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
async fill(text, opts) {
|
|
235
|
+
return this._step(`locator.fill(${JSON.stringify(text)})`, async () => {
|
|
236
|
+
await this.pollUntilVisible(opts?.timeout ?? DEFAULT_TIMEOUT);
|
|
237
|
+
await this.actOnFirst(`el.focus(); el.value = ''; el.value = ${JSON.stringify(text)}; el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true }));`, 'locator.fill()');
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
async type(text) {
|
|
241
|
+
return this._step(`locator.type(${JSON.stringify(text)})`, async () => {
|
|
242
|
+
await this.pollUntilVisible(DEFAULT_TIMEOUT);
|
|
243
|
+
await this.actOnFirst(`el.focus(); el.value = (el.value || '') + ${JSON.stringify(text)}; el.dispatchEvent(new Event('input', { bubbles: true }));`, 'locator.type()');
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
async press(key) {
|
|
247
|
+
return this._step(`locator.press(${JSON.stringify(key)})`, async () => {
|
|
248
|
+
await this.actOnFirst(`['keydown','keypress','keyup'].forEach(t => el.dispatchEvent(new KeyboardEvent(t, { key: ${JSON.stringify(key)}, bubbles: true })));`, 'locator.press()');
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async focus() {
|
|
252
|
+
return this._step('locator.focus()', async () => {
|
|
253
|
+
await this.actOnFirst('el.focus();', 'locator.focus()');
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
async hover() {
|
|
257
|
+
return this._step('locator.hover()', async () => {
|
|
258
|
+
await this.pollUntilVisible(DEFAULT_TIMEOUT);
|
|
259
|
+
await this.actOnFirst('el.dispatchEvent(new MouseEvent("mouseover", { bubbles: true })); el.dispatchEvent(new MouseEvent("mouseenter", { bubbles: true }));', 'locator.hover()');
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
async scrollIntoViewIfNeeded() {
|
|
263
|
+
return this._step('locator.scrollIntoViewIfNeeded()', async () => {
|
|
264
|
+
await this.actOnFirst('el.scrollIntoView({ block: "nearest" });', 'locator.scrollIntoViewIfNeeded()');
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// ─── Private helpers ─────────────────────────────────────────
|
|
268
|
+
// Poll Playwright's own checkElementStates until the element satisfies all the
|
|
269
|
+
// given states (it returns undefined when they all pass). Used by click to
|
|
270
|
+
// gate on visible+enabled before a synthetic dispatch (slice-1 behavior).
|
|
271
|
+
async pollActionable(states, timeout) {
|
|
272
|
+
const sel = JSON.stringify(this.selector);
|
|
273
|
+
const list = JSON.stringify(states);
|
|
274
|
+
await retryUntil(() => this.evalEngine(`(async () => { const is = window.__mwInjected; const el = is.querySelector(is.parseSelector(${sel}), document, true); if (!el) { return false; } const missing = await is.checkElementStates(el, ${list}); return missing === undefined; })()`), (ready) => ready, timeout, 'MobileWebViewLocator: timed out waiting for element to be actionable');
|
|
275
|
+
}
|
|
276
|
+
async pollUntilVisible(timeout) {
|
|
277
|
+
await retryUntil(() => this.isVisible({ timeout: 0 }), (v) => v, timeout, 'MobileWebViewLocator: timed out waiting for element to be visible');
|
|
278
|
+
}
|
|
279
|
+
// Run Playwright's injected expect() matcher for this locator's selector and
|
|
280
|
+
// return its raw verdict. The assertion layer (expect.ts) decides pass/fail
|
|
281
|
+
// (pass = matches !== isNot) and handles retry/negation/messages.
|
|
282
|
+
async _runInjectedExpect(params) {
|
|
283
|
+
return this.evalEngine(buildExpectEvaluate(this.selector, params));
|
|
284
|
+
}
|
|
285
|
+
// The private hook Playwright's web-first matchers call: expect(locator).toBeX()
|
|
286
|
+
// dispatches to locator._expect(expression, options). We run the same injected
|
|
287
|
+
// matcher we already use, polling until the expectation holds (matches !== isNot)
|
|
288
|
+
// or the timeout elapses, and return the { matches, received, timedOut } shape
|
|
289
|
+
// the matchers read back. This makes `expect()` from @playwright/test drive a
|
|
290
|
+
// MobileWebViewLocator with no mobilewright-specific assertion API.
|
|
291
|
+
async _expect(expression, options) {
|
|
292
|
+
const isNot = options.isNot ?? false;
|
|
293
|
+
const timeout = options.timeout ?? DEFAULT_TIMEOUT;
|
|
294
|
+
const deadline = Date.now() + timeout;
|
|
295
|
+
let lastMatches = false;
|
|
296
|
+
let received;
|
|
297
|
+
const check = async () => {
|
|
298
|
+
const result = await this._runInjectedExpect({
|
|
299
|
+
expression,
|
|
300
|
+
expressionArg: options.expressionArg,
|
|
301
|
+
expectedText: options.expectedText,
|
|
302
|
+
expectedNumber: options.expectedNumber,
|
|
303
|
+
expectedValue: options.expectedValue,
|
|
304
|
+
isNot,
|
|
305
|
+
timeout: 0,
|
|
306
|
+
});
|
|
307
|
+
lastMatches = result.matches;
|
|
308
|
+
received = result.received;
|
|
309
|
+
return result.matches !== isNot;
|
|
310
|
+
};
|
|
311
|
+
let reached = await check();
|
|
312
|
+
while (!reached && Date.now() < deadline) {
|
|
313
|
+
await sleep(EXPECT_POLL_INTERVAL);
|
|
314
|
+
reached = await check();
|
|
315
|
+
}
|
|
316
|
+
return { matches: lastMatches, received, timedOut: !reached };
|
|
317
|
+
}
|
|
318
|
+
// Default expect() timeout for assertions on this locator (none → fall back to
|
|
319
|
+
// the assertion default). Present so LocatorAssertions-style timeout
|
|
320
|
+
// resolution works uniformly across native and web locators.
|
|
321
|
+
get expectTimeout() {
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// Playwright's web-first matchers gate on `receiver.constructor.name === 'Locator'`
|
|
326
|
+
// (see expectTypes in playwright/lib/util). Report that name so expect() from
|
|
327
|
+
// @playwright/test accepts a MobileWebViewLocator, while the exported class name stays
|
|
328
|
+
// distinct for our own code.
|
|
329
|
+
Object.defineProperty(MobileWebViewLocator, 'name', { value: 'Locator', configurable: true });
|
|
330
|
+
// Back-compat alias for internal callers that still import WebLocator.
|
|
331
|
+
export { MobileWebViewLocator as WebLocator };
|
|
332
|
+
//# sourceMappingURL=web-locator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator.js","sourceRoot":"","sources":["../src/web-locator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator.test.d.ts","sourceRoot":"","sources":["../src/web-locator.test.ts"],"names":[],"mappings":""}
|