@mobilewright/core 0.0.41 → 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.
Files changed (95) hide show
  1. package/dist/device.d.ts +4 -0
  2. package/dist/device.d.ts.map +1 -1
  3. package/dist/device.js +13 -2
  4. package/dist/device.js.map +1 -1
  5. package/dist/expect.d.ts +82 -11
  6. package/dist/expect.d.ts.map +1 -1
  7. package/dist/expect.js +181 -22
  8. package/dist/expect.js.map +1 -1
  9. package/dist/expect.test.js +17 -0
  10. package/dist/expect.test.js.map +1 -1
  11. package/dist/fake-webview-session.d.ts +14 -0
  12. package/dist/fake-webview-session.d.ts.map +1 -0
  13. package/dist/fake-webview-session.js +26 -0
  14. package/dist/fake-webview-session.js.map +1 -0
  15. package/dist/index.d.ts +4 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +3 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/locator.d.ts +8 -5
  20. package/dist/locator.d.ts.map +1 -1
  21. package/dist/locator.js +5 -6
  22. package/dist/locator.js.map +1 -1
  23. package/dist/locator.test.js +178 -0
  24. package/dist/locator.test.js.map +1 -1
  25. package/dist/page.d.ts +52 -0
  26. package/dist/page.d.ts.map +1 -0
  27. package/dist/page.js +226 -0
  28. package/dist/page.js.map +1 -0
  29. package/dist/page.test.d.ts +2 -0
  30. package/dist/page.test.d.ts.map +1 -0
  31. package/dist/page.test.js +263 -0
  32. package/dist/page.test.js.map +1 -0
  33. package/dist/playwright-engine.d.ts +23 -0
  34. package/dist/playwright-engine.d.ts.map +1 -0
  35. package/dist/playwright-engine.js +79 -0
  36. package/dist/playwright-engine.js.map +1 -0
  37. package/dist/playwright-engine.test.d.ts +2 -0
  38. package/dist/playwright-engine.test.d.ts.map +1 -0
  39. package/dist/playwright-engine.test.js +45 -0
  40. package/dist/playwright-engine.test.js.map +1 -0
  41. package/dist/query-engine.d.ts +4 -0
  42. package/dist/query-engine.d.ts.map +1 -1
  43. package/dist/query-engine.js +15 -0
  44. package/dist/query-engine.js.map +1 -1
  45. package/dist/query-engine.test.js +64 -1
  46. package/dist/query-engine.test.js.map +1 -1
  47. package/dist/screen.d.ts +7 -0
  48. package/dist/screen.d.ts.map +1 -1
  49. package/dist/screen.js +7 -0
  50. package/dist/screen.js.map +1 -1
  51. package/dist/stackTrace.d.ts +3 -0
  52. package/dist/stackTrace.d.ts.map +1 -1
  53. package/dist/stackTrace.js +10 -0
  54. package/dist/stackTrace.js.map +1 -1
  55. package/dist/stackTrace.test.d.ts +2 -0
  56. package/dist/stackTrace.test.d.ts.map +1 -0
  57. package/dist/stackTrace.test.js +43 -0
  58. package/dist/stackTrace.test.js.map +1 -0
  59. package/dist/web-expect-matcher.d.ts +29 -0
  60. package/dist/web-expect-matcher.d.ts.map +1 -0
  61. package/dist/web-expect-matcher.js +23 -0
  62. package/dist/web-expect-matcher.js.map +1 -0
  63. package/dist/web-expect-matcher.test.d.ts +2 -0
  64. package/dist/web-expect-matcher.test.d.ts.map +1 -0
  65. package/dist/web-expect-matcher.test.js +21 -0
  66. package/dist/web-expect-matcher.test.js.map +1 -0
  67. package/dist/web-expect.test.d.ts +2 -0
  68. package/dist/web-expect.test.d.ts.map +1 -0
  69. package/dist/web-expect.test.js +93 -0
  70. package/dist/web-expect.test.js.map +1 -0
  71. package/dist/web-locator-pwexpect.test.d.ts +2 -0
  72. package/dist/web-locator-pwexpect.test.d.ts.map +1 -0
  73. package/dist/web-locator-pwexpect.test.js +36 -0
  74. package/dist/web-locator-pwexpect.test.js.map +1 -0
  75. package/dist/web-locator-reinjection.test.d.ts +2 -0
  76. package/dist/web-locator-reinjection.test.d.ts.map +1 -0
  77. package/dist/web-locator-reinjection.test.js +83 -0
  78. package/dist/web-locator-reinjection.test.js.map +1 -0
  79. package/dist/web-locator.d.ts +120 -0
  80. package/dist/web-locator.d.ts.map +1 -0
  81. package/dist/web-locator.js +332 -0
  82. package/dist/web-locator.js.map +1 -0
  83. package/dist/web-locator.test.d.ts +2 -0
  84. package/dist/web-locator.test.d.ts.map +1 -0
  85. package/dist/web-locator.test.js +424 -0
  86. package/dist/web-locator.test.js.map +1 -0
  87. package/dist/webview-locator.d.ts +14 -0
  88. package/dist/webview-locator.d.ts.map +1 -0
  89. package/dist/webview-locator.js +95 -0
  90. package/dist/webview-locator.js.map +1 -0
  91. package/dist/webview-locator.test.d.ts +2 -0
  92. package/dist/webview-locator.test.d.ts.map +1 -0
  93. package/dist/webview-locator.test.js +203 -0
  94. package/dist/webview-locator.test.js.map +1 -0
  95. package/package.json +3 -2
@@ -0,0 +1,263 @@
1
+ import { test, expect as playwrightExpect } from '@playwright/test';
2
+ import { Page } from './page.js';
3
+ import { WebLocator } from './web-locator.js';
4
+ import { expect } from './expect.js';
5
+ import { fakeWebViewSession } from './fake-webview-session.js';
6
+ // A step function that records the title of every step it wraps, then runs the body.
7
+ function recordingStepFn() {
8
+ const titles = [];
9
+ const stepFn = (title, body) => {
10
+ titles.push(title);
11
+ return body();
12
+ };
13
+ return { stepFn, titles };
14
+ }
15
+ // ─── Mock helpers ────────────────────────────────────────────
16
+ function sessionWithResponses(...evaluateResponses) {
17
+ return fakeWebViewSession({ evaluateResponses, url: 'https://example.com/home', title: 'Home' });
18
+ }
19
+ function sessionWithUrl(currentUrl) {
20
+ return fakeWebViewSession({ url: currentUrl, title: 'Page Title' });
21
+ }
22
+ // ─── Page.attach ─────────────────────────────────────────────
23
+ test.describe('Page.attach()', () => {
24
+ test('injects only the engine bootstrap on attach (no hand-rolled DOM engine)', async () => {
25
+ const { session, evaluateCalls } = sessionWithResponses();
26
+ await Page.attach(session);
27
+ playwrightExpect(evaluateCalls).toHaveLength(1);
28
+ playwrightExpect(evaluateCalls[0]).toContain('window.__mwInjected = new (module.exports.InjectedScript())(globalThis,');
29
+ playwrightExpect(evaluateCalls.some(c => c.includes('window.__mw.findBy'))).toBe(false);
30
+ });
31
+ test('returns a Page instance', async () => {
32
+ const { session } = sessionWithResponses();
33
+ const page = await Page.attach(session);
34
+ playwrightExpect(page instanceof Page).toBe(true);
35
+ });
36
+ test('injects the Playwright engine bootstrap so window.__mwInjected exists', async () => {
37
+ const { session, evaluateCalls } = sessionWithResponses();
38
+ await Page.attach(session);
39
+ const injectedBootstrap = evaluateCalls.some((c) => c.includes('window.__mwInjected = new (module.exports.InjectedScript())(globalThis,'));
40
+ playwrightExpect(injectedBootstrap).toBe(true);
41
+ });
42
+ });
43
+ // ─── Page-level methods ───────────────────────────────────────
44
+ test.describe('Page.url()', () => {
45
+ test('returns the current page URL from the session', async () => {
46
+ const { session } = sessionWithUrl('https://app.example.com/dashboard');
47
+ const page = await Page.attach(session);
48
+ playwrightExpect(await page.url()).toBe('https://app.example.com/dashboard');
49
+ });
50
+ });
51
+ test.describe('Page.title()', () => {
52
+ test('returns the page title from the session', async () => {
53
+ const { session } = sessionWithUrl('https://example.com');
54
+ const page = await Page.attach(session);
55
+ playwrightExpect(await page.title()).toBe('Page Title');
56
+ });
57
+ });
58
+ test.describe('Page.goto()', () => {
59
+ test('calls session.goto with the given URL', async () => {
60
+ const { session, gotoCalls } = sessionWithUrl('https://example.com');
61
+ const page = await Page.attach(session);
62
+ await page.goto('https://example.com/login');
63
+ playwrightExpect(gotoCalls).toContain('https://example.com/login');
64
+ });
65
+ test('re-injects the engine after navigating (a new document drops window.__mwInjected)', async () => {
66
+ const { session, evaluateCalls } = sessionWithResponses();
67
+ const page = await Page.attach(session);
68
+ await page.goto('https://example.com/login');
69
+ // Engine bootstrap is injected once at attach and once more after goto.
70
+ const injections = evaluateCalls.filter((c) => c.includes('window.__mwInjected = new (module.exports.InjectedScript())(globalThis,'));
71
+ playwrightExpect(injections).toHaveLength(2);
72
+ });
73
+ });
74
+ test.describe('Page.reload()', () => {
75
+ test('calls session.reload', async () => {
76
+ let reloaded = false;
77
+ const { session } = sessionWithUrl('https://example.com');
78
+ session.reload = async () => { reloaded = true; };
79
+ const page = await Page.attach(session);
80
+ await page.reload();
81
+ playwrightExpect(reloaded).toBe(true);
82
+ });
83
+ });
84
+ test.describe('Page.evaluate()', () => {
85
+ test('passes a string expression to the session', async () => {
86
+ // One leading placeholder: Page.attach() runs a single evaluate() injection
87
+ // (the engine bootstrap) before the real call.
88
+ const { session, evaluateCalls } = sessionWithResponses(undefined, 42);
89
+ const page = await Page.attach(session);
90
+ const result = await page.evaluate('1 + 1');
91
+ playwrightExpect(result).toBe(42);
92
+ playwrightExpect(evaluateCalls).toContain('1 + 1');
93
+ });
94
+ test('serialises a function to a string before evaluating', async () => {
95
+ const { session, evaluateCalls } = sessionWithResponses(undefined, 'hello');
96
+ const page = await Page.attach(session);
97
+ await page.evaluate(() => 'hello');
98
+ const functionCall = evaluateCalls.find(c => c.includes('hello'));
99
+ playwrightExpect(functionCall).toBeDefined();
100
+ });
101
+ });
102
+ test.describe('Page.content()', () => {
103
+ test('evaluates document.documentElement.outerHTML', async () => {
104
+ const html = '<html><body>hello</body></html>';
105
+ // One leading placeholder for Page.attach()'s single evaluate() injection.
106
+ const { session, evaluateCalls } = sessionWithResponses(undefined, html);
107
+ const page = await Page.attach(session);
108
+ const content = await page.content();
109
+ playwrightExpect(content).toBe(html);
110
+ playwrightExpect(evaluateCalls.some(c => c.includes('outerHTML'))).toBe(true);
111
+ });
112
+ });
113
+ test.describe('Page.waitForLoadState()', () => {
114
+ test('delegates to session.waitForLoadState', async () => {
115
+ let calledWith;
116
+ const { session } = sessionWithUrl('https://example.com');
117
+ session.waitForLoadState = async (state) => { calledWith = state; };
118
+ const page = await Page.attach(session);
119
+ await page.waitForLoadState('domcontentloaded');
120
+ playwrightExpect(calledWith).toBe('domcontentloaded');
121
+ });
122
+ });
123
+ test.describe('Page.close()', () => {
124
+ test('calls session.close', async () => {
125
+ let closed = false;
126
+ const { session } = sessionWithUrl('https://example.com');
127
+ session.close = async () => { closed = true; };
128
+ const page = await Page.attach(session);
129
+ await page.close();
130
+ playwrightExpect(closed).toBe(true);
131
+ });
132
+ });
133
+ test.describe('Page.waitForURL()', () => {
134
+ test('resolves when URL matches a string', async () => {
135
+ const { session } = sessionWithUrl('https://example.com/dashboard');
136
+ const page = await Page.attach(session);
137
+ await page.waitForURL('https://example.com/dashboard', { timeout: 1000 });
138
+ });
139
+ test('resolves when URL matches a regex', async () => {
140
+ const { session } = sessionWithUrl('https://example.com/dashboard');
141
+ const page = await Page.attach(session);
142
+ await page.waitForURL(/dashboard/, { timeout: 1000 });
143
+ });
144
+ test('rejects when URL never matches within timeout', async () => {
145
+ const { session } = sessionWithUrl('https://example.com/home');
146
+ const page = await Page.attach(session);
147
+ await playwrightExpect(page.waitForURL('https://example.com/other', { timeout: 200 })).rejects.toThrow();
148
+ });
149
+ test('resets a stateful (global) regex so a leftover lastIndex does not cause a miss', async () => {
150
+ const { session } = sessionWithUrl('https://example.com/dashboard');
151
+ const page = await Page.attach(session);
152
+ // A /g regex keeps lastIndex between .test() calls. Simulate leftover state
153
+ // pointing past where "dashboard" appears (index 20).
154
+ const staleGlobalRegex = /dashboard/g;
155
+ staleGlobalRegex.lastIndex = 25;
156
+ // timeout 0 → the predicate runs exactly once, so waitForURL must reset
157
+ // lastIndex itself; otherwise the search starts at 25 and misses the match.
158
+ await page.waitForURL(staleGlobalRegex, { timeout: 0 });
159
+ });
160
+ });
161
+ // ─── Page locator factories ───────────────────────────────────
162
+ test.describe('Page locator factories', () => {
163
+ test('locator() returns a WebLocator with css strategy', async () => {
164
+ const { session } = sessionWithUrl('https://example.com');
165
+ const page = await Page.attach(session);
166
+ const loc = page.locator('.my-button');
167
+ playwrightExpect(loc instanceof WebLocator).toBe(true);
168
+ });
169
+ test('getByRole() returns a WebLocator with role strategy', async () => {
170
+ const { session } = sessionWithUrl('https://example.com');
171
+ const page = await Page.attach(session);
172
+ const loc = page.getByRole('button', { name: 'Sign In' });
173
+ playwrightExpect(loc instanceof WebLocator).toBe(true);
174
+ });
175
+ test('getByTestId() returns a WebLocator with testId strategy', async () => {
176
+ const { session } = sessionWithUrl('https://example.com');
177
+ const page = await Page.attach(session);
178
+ const loc = page.getByTestId('submit-btn');
179
+ playwrightExpect(loc instanceof WebLocator).toBe(true);
180
+ });
181
+ });
182
+ // ─── expect(page) assertions ─────────────────────────────────
183
+ test.describe('expect(page).toHaveURL()', () => {
184
+ test('passes when URL matches string', async () => {
185
+ const { session } = sessionWithUrl('https://example.com/dashboard');
186
+ const page = await Page.attach(session);
187
+ await expect(page).toHaveURL('https://example.com/dashboard');
188
+ });
189
+ test('passes when URL matches regex', async () => {
190
+ const { session } = sessionWithUrl('https://example.com/dashboard');
191
+ const page = await Page.attach(session);
192
+ await expect(page).toHaveURL(/dashboard/);
193
+ });
194
+ test('fails when URL does not match', async () => {
195
+ const { session } = sessionWithUrl('https://example.com/home');
196
+ const page = await Page.attach(session);
197
+ await playwrightExpect(expect(page).toHaveURL('https://example.com/other', { timeout: 200 })).rejects.toThrow();
198
+ });
199
+ test('not.toHaveURL passes when URL does not match', async () => {
200
+ const { session } = sessionWithUrl('https://example.com/home');
201
+ const page = await Page.attach(session);
202
+ await expect(page).not.toHaveURL('https://example.com/other');
203
+ });
204
+ });
205
+ test.describe('expect(page).toHaveTitle()', () => {
206
+ test('passes when title matches string', async () => {
207
+ const { session } = sessionWithUrl('https://example.com');
208
+ session.title = async () => 'Dashboard';
209
+ const page = await Page.attach(session);
210
+ await expect(page).toHaveTitle('Dashboard');
211
+ });
212
+ test('passes when title matches regex', async () => {
213
+ const { session } = sessionWithUrl('https://example.com');
214
+ session.title = async () => 'My Dashboard';
215
+ const page = await Page.attach(session);
216
+ await expect(page).toHaveTitle(/Dashboard/);
217
+ });
218
+ });
219
+ // ─── Step instrumentation ────────────────────────────────────
220
+ test.describe('Page step instrumentation', () => {
221
+ test('navigation actions emit named steps', async () => {
222
+ const { session } = sessionWithResponses();
223
+ const { stepFn, titles } = recordingStepFn();
224
+ const page = await Page.attach(session);
225
+ page._stepFn = stepFn;
226
+ await page.goto('https://example.com/login');
227
+ await page.reload();
228
+ await page.goBack();
229
+ await page.goForward();
230
+ await page.waitForLoadState('domcontentloaded');
231
+ playwrightExpect(titles).toEqual([
232
+ 'page.goto("https://example.com/login")',
233
+ 'page.reload()',
234
+ 'page.goBack()',
235
+ 'page.goForward()',
236
+ 'page.waitForLoadState(domcontentloaded)',
237
+ ]);
238
+ });
239
+ test('locator factories propagate the step function to web locators', async () => {
240
+ const { session } = sessionWithResponses();
241
+ const { stepFn } = recordingStepFn();
242
+ const page = await Page.attach(session);
243
+ page._stepFn = stepFn;
244
+ playwrightExpect(page.locator('.btn')._stepFn).toBe(stepFn);
245
+ playwrightExpect(page.getByRole('button')._stepFn).toBe(stepFn);
246
+ playwrightExpect(page.getByTestId('submit')._stepFn).toBe(stepFn);
247
+ });
248
+ test('page assertions emit expect steps', async () => {
249
+ const { session } = sessionWithUrl('https://example.com/dashboard');
250
+ const { stepFn, titles } = recordingStepFn();
251
+ const page = await Page.attach(session);
252
+ page._stepFn = stepFn;
253
+ await expect(page).toHaveURL('https://example.com/dashboard');
254
+ playwrightExpect(titles).toContain('expect.toHaveURL()');
255
+ });
256
+ test('actions run normally when no step function is set', async () => {
257
+ const { session, gotoCalls } = sessionWithResponses();
258
+ const page = await Page.attach(session);
259
+ await page.goto('https://example.com/login');
260
+ playwrightExpect(gotoCalls).toEqual(['https://example.com/login']);
261
+ });
262
+ });
263
+ //# sourceMappingURL=page.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.test.js","sourceRoot":"","sources":["../src/page.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { WebViewSession } from '@mobilewright/protocol';
2
+ type GetByRoleSelector = (role: string, options?: {
3
+ name?: string | RegExp;
4
+ exact?: boolean;
5
+ }) => string;
6
+ type TextBuilder = (value: string | RegExp, options?: {
7
+ exact?: boolean;
8
+ }) => string;
9
+ export declare const INJECTED_SOURCE: string;
10
+ export declare const TEST_ID_ATTR = "data-testid";
11
+ export declare const getByRoleSelector: GetByRoleSelector;
12
+ export declare const getByTextSelector: TextBuilder;
13
+ export declare const getByLabelSelector: TextBuilder;
14
+ export declare const getByPlaceholderSelector: TextBuilder;
15
+ export declare const getByAltTextSelector: TextBuilder;
16
+ export declare const getByTitleSelector: TextBuilder;
17
+ export declare const getByTestIdSelector: (attrName: string, value: string | RegExp) => string;
18
+ export declare function detectBrowserName(userAgent: string): 'webkit' | 'chromium';
19
+ export declare function bootstrapScript(): string;
20
+ export declare function isEngineMissing(e: unknown): boolean;
21
+ export declare function evaluateWithEngine<T = unknown>(session: WebViewSession, expr: string): Promise<T>;
22
+ export {};
23
+ //# sourceMappingURL=playwright-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-engine.d.ts","sourceRoot":"","sources":["../src/playwright-engine.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,KAAK,iBAAiB,GAAG,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAClD,MAAM,CAAC;AAKZ,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAAK,MAAM,CAAC;AAarF,eAAO,MAAM,eAAe,EAAE,MAAwB,CAAC;AACvD,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAC1C,eAAO,MAAM,iBAAiB,EAAE,iBAAkD,CAAC;AACnF,eAAO,MAAM,iBAAiB,EAAE,WAA4C,CAAC;AAC7E,eAAO,MAAM,kBAAkB,EAAE,WAA6C,CAAC;AAC/E,eAAO,MAAM,wBAAwB,EAAE,WAAmD,CAAC;AAC3F,eAAO,MAAM,oBAAoB,EAAE,WAA+C,CAAC;AACnF,eAAO,MAAM,kBAAkB,EAAE,WAA6C,CAAC;AAC/E,eAAO,MAAM,mBAAmB,aAXE,MAAM,SAAS,MAAM,GAAG,MAAM,KAAK,MAWF,CAAC;AAKpE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAE1E;AAiBD,wBAAgB,eAAe,IAAI,MAAM,CAQxC;AAQD,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CASnD;AAMD,wBAAsB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAClD,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,CAAC,CAUZ"}
@@ -0,0 +1,79 @@
1
+ // Sole module that reaches into playwright-core internals. Playwright's package
2
+ // `exports` map blocks these subpaths, so we resolve the package root and
3
+ // require the files by absolute path (an absolute require bypasses `exports`).
4
+ // Pinned to playwright-core@1.58.2 — if a future bump moves these paths, only
5
+ // this file breaks. Playwright is Apache-2.0 (see NOTICE).
6
+ import { createRequire } from 'node:module';
7
+ import { dirname, join } from 'node:path';
8
+ const require = createRequire(import.meta.url);
9
+ const pkgRoot = dirname(require.resolve('playwright-core/package.json'));
10
+ const injected = require(join(pkgRoot, 'lib/generated/injectedScriptSource.js'));
11
+ const locatorUtils = require(join(pkgRoot, 'lib/utils/isomorphic/locatorUtils.js'));
12
+ export const INJECTED_SOURCE = injected.source;
13
+ export const TEST_ID_ATTR = 'data-testid';
14
+ export const getByRoleSelector = locatorUtils.getByRoleSelector;
15
+ export const getByTextSelector = locatorUtils.getByTextSelector;
16
+ export const getByLabelSelector = locatorUtils.getByLabelSelector;
17
+ export const getByPlaceholderSelector = locatorUtils.getByPlaceholderSelector;
18
+ export const getByAltTextSelector = locatorUtils.getByAltTextSelector;
19
+ export const getByTitleSelector = locatorUtils.getByTitleSelector;
20
+ export const getByTestIdSelector = locatorUtils.getByTestIdSelector;
21
+ // WKWebView's UA contains "AppleWebKit" without "Chrome/"; Android System
22
+ // WebView / Chromium contains "Chrome/". Pinning browserName makes Playwright's
23
+ // engine-specific branches behave correctly per webview engine.
24
+ export function detectBrowserName(userAgent) {
25
+ return /AppleWebKit/.test(userAgent) && !/Chrome\//.test(userAgent) ? 'webkit' : 'chromium';
26
+ }
27
+ // Options mirror what playwright-core passes when instantiating the engine.
28
+ // browserName is resolved in-page (see bootstrapScript) from the live UA.
29
+ const BOOTSTRAP_OPTIONS_BASE = {
30
+ isUnderTest: false,
31
+ sdkLanguage: 'javascript',
32
+ testIdAttributeName: TEST_ID_ATTR,
33
+ stableRafCount: 1,
34
+ isUtilityWorld: false,
35
+ customEngines: [],
36
+ };
37
+ // A self-contained IIFE evaluated once per page (at Page.attach). It defines the
38
+ // injected module and stashes a live InjectedScript instance on window so every
39
+ // later evaluate() can reference it without needing a JSHandle. browserName is
40
+ // detected in-page so WKWebView is configured as webkit (not chromium).
41
+ export function bootstrapScript() {
42
+ return `(() => {
43
+ const module = {};
44
+ ${INJECTED_SOURCE}
45
+ const detectBrowserName = ${detectBrowserName.toString()};
46
+ const options = Object.assign(${JSON.stringify(BOOTSTRAP_OPTIONS_BASE)}, { browserName: detectBrowserName(navigator.userAgent) });
47
+ window.__mwInjected = new (module.exports.InjectedScript())(globalThis, options);
48
+ })()`;
49
+ }
50
+ // A page can replace its own document after we injected the engine (a
51
+ // client-side redirect or reload that mobilewright didn't initiate), which drops
52
+ // window.__mwInjected. The next engine call then throws "... of undefined
53
+ // (reading 'querySelector...')". Detect that so we can re-inject and retry.
54
+ const ENGINE_METHODS = '(querySelector|querySelectorAll|parseSelector|expect|elementState|checkElementStates)';
55
+ export function isEngineMissing(e) {
56
+ const message = e instanceof Error ? e.message : String(e);
57
+ return (message.includes('__mwInjected') ||
58
+ // Chromium: "Cannot read properties of undefined (reading 'querySelectorAll')"
59
+ new RegExp(`undefined \\(reading '${ENGINE_METHODS}'\\)`).test(message) ||
60
+ // WebKit: "undefined is not an object (evaluating 'is.querySelectorAll')"
61
+ new RegExp(`undefined is not an object \\(evaluating '[^']*${ENGINE_METHODS}`).test(message));
62
+ }
63
+ // Evaluate an expression that depends on the injected engine, re-injecting the
64
+ // engine and retrying once if it has gone missing. Keeps engine-dependent calls
65
+ // resilient to page-initiated navigations without paying the re-inject cost
66
+ // unless the engine is actually gone.
67
+ export async function evaluateWithEngine(session, expr) {
68
+ try {
69
+ return await session.evaluate(expr);
70
+ }
71
+ catch (e) {
72
+ if (!isEngineMissing(e)) {
73
+ throw e;
74
+ }
75
+ await session.evaluate(bootstrapScript());
76
+ return session.evaluate(expr);
77
+ }
78
+ }
79
+ //# sourceMappingURL=playwright-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-engine.js","sourceRoot":"","sources":["../src/playwright-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=playwright-engine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-engine.test.d.ts","sourceRoot":"","sources":["../src/playwright-engine.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { test, expect as playwrightExpect } from '@playwright/test';
2
+ import { bootstrapScript, detectBrowserName, getByRoleSelector, getByTextSelector, getByLabelSelector, getByPlaceholderSelector, getByAltTextSelector, getByTitleSelector, getByTestIdSelector, TEST_ID_ATTR, INJECTED_SOURCE, } from './playwright-engine.js';
3
+ test.describe('playwright-engine adapter', () => {
4
+ test('re-exports getByRoleSelector producing the exact Playwright role selector', () => {
5
+ // If Playwright ever changes its selector format, this assertion breaks —
6
+ // which is the point: our selectors must stay byte-identical to Playwright's.
7
+ playwrightExpect(getByRoleSelector('button', { name: 'Sign in' }))
8
+ .toBe('internal:role=button[name="Sign in"i]');
9
+ playwrightExpect(getByRoleSelector('button', { name: 'Sign in', exact: true }))
10
+ .toBe('internal:role=button[name="Sign in"s]');
11
+ playwrightExpect(getByRoleSelector('button')).toBe('internal:role=button');
12
+ });
13
+ test('INJECTED_SOURCE is the non-trivial Playwright injected bundle', () => {
14
+ playwrightExpect(INJECTED_SOURCE.length).toBeGreaterThan(100_000);
15
+ playwrightExpect(INJECTED_SOURCE).toContain('InjectedScript');
16
+ });
17
+ test('re-exports the other selector builders with exact Playwright output', () => {
18
+ playwrightExpect(getByTextSelector('Hello')).toBe('internal:text="Hello"i');
19
+ playwrightExpect(getByTextSelector('Hello', { exact: true })).toBe('internal:text="Hello"s');
20
+ playwrightExpect(getByLabelSelector('Email')).toBe('internal:label="Email"i');
21
+ playwrightExpect(getByPlaceholderSelector('Search')).toBe('internal:attr=[placeholder="Search"i]');
22
+ playwrightExpect(getByAltTextSelector('logo')).toBe('internal:attr=[alt="logo"i]');
23
+ playwrightExpect(getByTitleSelector('Close')).toBe('internal:attr=[title="Close"i]');
24
+ playwrightExpect(getByTestIdSelector(TEST_ID_ATTR, 'submit')).toBe('internal:testid=[data-testid="submit"s]');
25
+ });
26
+ test('detectBrowserName returns webkit for WKWebView UA and chromium for Chrome UA', () => {
27
+ const wkUA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148';
28
+ const androidUA = 'Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.0.0 Mobile Safari/537.36';
29
+ playwrightExpect(detectBrowserName(wkUA)).toBe('webkit');
30
+ playwrightExpect(detectBrowserName(androidUA)).toBe('chromium');
31
+ });
32
+ test('bootstrapScript inlines the browser detection and passes options', () => {
33
+ const script = bootstrapScript();
34
+ playwrightExpect(script).toContain('navigator.userAgent');
35
+ playwrightExpect(script).toContain('"testIdAttributeName":"data-testid"');
36
+ playwrightExpect(script).toContain('window.__mwInjected = new (module.exports.InjectedScript())(globalThis,');
37
+ });
38
+ test('bootstrapScript instantiates InjectedScript onto window.__mwInjected', () => {
39
+ const script = bootstrapScript();
40
+ playwrightExpect(script).toContain(INJECTED_SOURCE);
41
+ playwrightExpect(script).toContain('window.__mwInjected = new (module.exports.InjectedScript())(globalThis,');
42
+ playwrightExpect(script).toContain('"testIdAttributeName":"data-testid"');
43
+ });
44
+ });
45
+ //# sourceMappingURL=playwright-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-engine.test.js","sourceRoot":"","sources":["../src/playwright-engine.test.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,9 @@ export type LocatorStrategy = {
23
23
  kind: 'placeholder';
24
24
  value: string;
25
25
  exact?: boolean;
26
+ } | {
27
+ kind: 'webview';
28
+ testId?: string;
26
29
  } | {
27
30
  kind: 'chain';
28
31
  parent: LocatorStrategy;
@@ -37,4 +40,5 @@ export type LocatorStrategy = {
37
40
  * Returns matching nodes in document order.
38
41
  */
39
42
  export declare function queryAll(roots: ViewNode[], strategy: LocatorStrategy): ViewNode[];
43
+ export declare const WEBVIEW_TYPES: Set<string>;
40
44
  //# sourceMappingURL=query-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-engine.d.ts","sourceRoot":"","sources":["../src/query-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,eAAe,GACxB,QAAQ,EAAE,CAsCZ"}
1
+ {"version":3,"file":"query-engine.d.ts","sourceRoot":"","sources":["../src/query-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,eAAe,GACxB,QAAQ,EAAE,CAsCZ;AAYD,eAAO,MAAM,aAAa,aAMxB,CAAC"}
@@ -43,6 +43,13 @@ function walkTree(nodes, visitor) {
43
43
  walkTree(node.children, visitor);
44
44
  }
45
45
  }
46
+ export const WEBVIEW_TYPES = new Set([
47
+ 'WKWebView',
48
+ 'XCUIElementTypeWebView',
49
+ 'android.webkit.WebView',
50
+ 'RCTWebView',
51
+ 'RNCWebView',
52
+ ]);
46
53
  function matchesStrategy(node, strategy) {
47
54
  switch (strategy.kind) {
48
55
  case 'root':
@@ -87,6 +94,14 @@ function matchesStrategy(node, strategy) {
87
94
  return strategy.exact === false
88
95
  ? node.placeholder.toLowerCase().includes(strategy.value.toLowerCase())
89
96
  : node.placeholder === strategy.value;
97
+ case 'webview':
98
+ if (!WEBVIEW_TYPES.has(node.type)) {
99
+ return false;
100
+ }
101
+ if (strategy.testId !== undefined) {
102
+ return node.identifier === strategy.testId || node.resourceId === strategy.testId;
103
+ }
104
+ return true;
90
105
  case 'chain':
91
106
  // Handled above in queryAll
92
107
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"query-engine.js","sourceRoot":"","sources":["../src/query-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-engine.js","sourceRoot":"","sources":["../src/query-engine.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { test, expect } from '@playwright/test';
2
- import { queryAll } from './query-engine.js';
2
+ import { queryAll, WEBVIEW_TYPES } from './query-engine.js';
3
3
  function node(overrides) {
4
4
  return {
5
5
  isVisible: true,
@@ -316,6 +316,69 @@ test.describe('placeholder strategy', () => {
316
316
  expect(results).toHaveLength(0);
317
317
  });
318
318
  });
319
+ test.describe('webview strategy', () => {
320
+ function webviewNode(type, identifier) {
321
+ return node({ type, identifier, bounds: { x: 0, y: 100, width: 390, height: 600 } });
322
+ }
323
+ const treeWithWebViews = [
324
+ node({ type: 'Application', children: [
325
+ node({ type: 'Window', children: [
326
+ node({ type: 'Button', label: 'Open', identifier: 'openBtn' }),
327
+ webviewNode('WKWebView', 'webview1'),
328
+ webviewNode('WKWebView', 'webview2'),
329
+ ] }),
330
+ ] }),
331
+ ];
332
+ test('finds WKWebView by webview strategy', () => {
333
+ const results = queryAll(treeWithWebViews, { kind: 'webview' });
334
+ expect(results).toHaveLength(2);
335
+ expect(results[0].identifier).toBe('webview1');
336
+ expect(results[1].identifier).toBe('webview2');
337
+ });
338
+ test('finds XCUIElementTypeWebView', () => {
339
+ const results = queryAll([webviewNode('XCUIElementTypeWebView', 'wv')], { kind: 'webview' });
340
+ expect(results).toHaveLength(1);
341
+ });
342
+ test('finds android.webkit.WebView', () => {
343
+ const results = queryAll([webviewNode('android.webkit.WebView', 'wv')], { kind: 'webview' });
344
+ expect(results).toHaveLength(1);
345
+ });
346
+ test('finds RCTWebView', () => {
347
+ const results = queryAll([webviewNode('RCTWebView', 'wv')], { kind: 'webview' });
348
+ expect(results).toHaveLength(1);
349
+ });
350
+ test('finds RNCWebView', () => {
351
+ const results = queryAll([webviewNode('RNCWebView', 'wv')], { kind: 'webview' });
352
+ expect(results).toHaveLength(1);
353
+ });
354
+ test('does not match non-webview types', () => {
355
+ const results = queryAll(treeWithWebViews, { kind: 'webview' });
356
+ const types = results.map((n) => n.type);
357
+ expect(types.every((t) => WEBVIEW_TYPES.has(t))).toBe(true);
358
+ });
359
+ test('chained parent getByWebView finds webview inside a container', () => {
360
+ const tree = [
361
+ node({ type: 'View', identifier: 'tab1', bounds: { x: 0, y: 0, width: 390, height: 800 }, children: [
362
+ webviewNode('WKWebView', 'wv-in-tab1'),
363
+ ] }),
364
+ node({ type: 'View', identifier: 'tab2', bounds: { x: 390, y: 0, width: 390, height: 800 }, children: [
365
+ webviewNode('WKWebView', 'wv-in-tab2'),
366
+ ] }),
367
+ ];
368
+ const strategy = {
369
+ kind: 'chain',
370
+ parent: { kind: 'testId', value: 'tab2' },
371
+ child: { kind: 'webview' },
372
+ };
373
+ const results = queryAll(tree, strategy);
374
+ expect(results).toHaveLength(1);
375
+ expect(results[0].identifier).toBe('wv-in-tab2');
376
+ });
377
+ test('returns empty when no webviews in tree', () => {
378
+ const results = queryAll(sampleTree, { kind: 'webview' });
379
+ expect(results).toHaveLength(0);
380
+ });
381
+ });
319
382
  test.describe('testId with resourceId', () => {
320
383
  const tree = [
321
384
  node({