@mobilewright/core 0.0.41 → 0.0.43
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 +7 -1
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +17 -2
- package/dist/device.js.map +1 -1
- package/dist/device.test.d.ts +2 -0
- package/dist/device.test.d.ts.map +1 -0
- package/dist/device.test.js +39 -0
- package/dist/device.test.js.map +1 -0
- 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 +26 -5
- package/dist/locator.d.ts.map +1 -1
- package/dist/locator.js +31 -10
- package/dist/locator.js.map +1 -1
- package/dist/locator.test.js +213 -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 +19 -0
- package/dist/query-engine.d.ts.map +1 -1
- package/dist/query-engine.js +80 -0
- package/dist/query-engine.js.map +1 -1
- package/dist/query-engine.test.js +187 -1
- package/dist/query-engine.test.js.map +1 -1
- package/dist/screen.d.ts +11 -1
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +16 -0
- package/dist/screen.js.map +1 -1
- package/dist/screen.test.d.ts +2 -0
- package/dist/screen.test.d.ts.map +1 -0
- package/dist/screen.test.js +69 -0
- package/dist/screen.test.js.map +1 -0
- 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,424 @@
|
|
|
1
|
+
import { test, expect as playwrightExpect } from '@playwright/test';
|
|
2
|
+
import { WebLocator } from './web-locator.js';
|
|
3
|
+
import { Page } from './page.js';
|
|
4
|
+
import { getByRoleSelector, getByLabelSelector, getByPlaceholderSelector, getByAltTextSelector, getByTitleSelector, getByTestIdSelector, getByTextSelector, TEST_ID_ATTR, } from './playwright-engine.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
|
+
// A session whose evaluate() returns the given values in call order.
|
|
17
|
+
function sessionReturning(...evaluateResponses) {
|
|
18
|
+
return fakeWebViewSession({ evaluateResponses });
|
|
19
|
+
}
|
|
20
|
+
// A session whose evaluate() always returns the same value, no matter how many times called.
|
|
21
|
+
function sessionAlwaysReturning(value) {
|
|
22
|
+
return fakeWebViewSession({ evaluateAlways: value, url: '', title: '' });
|
|
23
|
+
}
|
|
24
|
+
// ─── Selector resolution via the injected engine ─────────────
|
|
25
|
+
test.describe('selector resolution via the injected engine', () => {
|
|
26
|
+
test('count() resolves the selector through window.__mwInjected.querySelectorAll', async () => {
|
|
27
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
28
|
+
const loc = new WebLocator(session, '.my-btn');
|
|
29
|
+
await loc.count();
|
|
30
|
+
playwrightExpect(evaluateCalls[0]).toContain('window.__mwInjected.querySelectorAll');
|
|
31
|
+
playwrightExpect(evaluateCalls[0]).toContain('parseSelector(".my-btn")');
|
|
32
|
+
});
|
|
33
|
+
test('getByRole builds the exact Playwright role selector', async () => {
|
|
34
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
35
|
+
const loc = new WebLocator(session, getByRoleSelector('button', { name: 'Sign In' }));
|
|
36
|
+
await loc.count();
|
|
37
|
+
playwrightExpect(evaluateCalls[0]).toContain(`parseSelector(${JSON.stringify(getByRoleSelector('button', { name: 'Sign In' }))})`);
|
|
38
|
+
});
|
|
39
|
+
test('getByTestId builds the exact Playwright testid selector', async () => {
|
|
40
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
41
|
+
const loc = new WebLocator(session, getByTestIdSelector(TEST_ID_ATTR, 'submit'));
|
|
42
|
+
await loc.count();
|
|
43
|
+
playwrightExpect(evaluateCalls[0]).toContain(`parseSelector(${JSON.stringify(getByTestIdSelector(TEST_ID_ATTR, 'submit'))})`);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
// ─── Collection methods ───────────────────────────────────────
|
|
47
|
+
test.describe('WebLocator.count()', () => {
|
|
48
|
+
test('returns 0 when evaluate returns 0', async () => {
|
|
49
|
+
const { session } = sessionReturning(0);
|
|
50
|
+
const loc = new WebLocator(session, '.btn');
|
|
51
|
+
playwrightExpect(await loc.count()).toBe(0);
|
|
52
|
+
});
|
|
53
|
+
test('returns the element count from evaluate', async () => {
|
|
54
|
+
const { session } = sessionReturning(3);
|
|
55
|
+
const loc = new WebLocator(session, '.btn');
|
|
56
|
+
playwrightExpect(await loc.count()).toBe(3);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
test.describe('WebLocator.all()', () => {
|
|
60
|
+
test('returns an array of WebLocators matching the count', async () => {
|
|
61
|
+
const { session } = sessionReturning(3);
|
|
62
|
+
const loc = new WebLocator(session, '.item');
|
|
63
|
+
const all = await loc.all();
|
|
64
|
+
playwrightExpect(all).toHaveLength(3);
|
|
65
|
+
playwrightExpect(all[0] instanceof WebLocator).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
test('returns empty array when count is 0', async () => {
|
|
68
|
+
const { session } = sessionReturning(0);
|
|
69
|
+
const loc = new WebLocator(session, '.item');
|
|
70
|
+
playwrightExpect(await loc.all()).toHaveLength(0);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
test.describe('WebLocator.first() / last() / nth()', () => {
|
|
74
|
+
test('first() returns a WebLocator', async () => {
|
|
75
|
+
const { session } = sessionAlwaysReturning(0);
|
|
76
|
+
const loc = new WebLocator(session, '.btn');
|
|
77
|
+
const first = loc.first();
|
|
78
|
+
playwrightExpect(first instanceof WebLocator).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
test('nth() composes an nth=index selector', async () => {
|
|
81
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
82
|
+
const loc = new WebLocator(session, '.btn');
|
|
83
|
+
await loc.nth(2).count();
|
|
84
|
+
playwrightExpect(evaluateCalls[0]).toContain('parseSelector(".btn >> nth=2")');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
// ─── Chaining getters ─────────────────────────────────────────
|
|
88
|
+
test.describe('WebLocator chaining getters', () => {
|
|
89
|
+
test('getByLabel composes a label selector within the parent', async () => {
|
|
90
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
91
|
+
const loc = new WebLocator(session, '.form');
|
|
92
|
+
await loc.getByLabel('Email').count();
|
|
93
|
+
playwrightExpect(evaluateCalls[0]).toContain(`parseSelector(${JSON.stringify('.form >> ' + getByLabelSelector('Email'))})`);
|
|
94
|
+
});
|
|
95
|
+
test('getByPlaceholder composes a placeholder selector within the parent', async () => {
|
|
96
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
97
|
+
const loc = new WebLocator(session, '.form');
|
|
98
|
+
await loc.getByPlaceholder('Enter email').count();
|
|
99
|
+
playwrightExpect(evaluateCalls[0]).toContain(`parseSelector(${JSON.stringify('.form >> ' + getByPlaceholderSelector('Enter email'))})`);
|
|
100
|
+
});
|
|
101
|
+
test('getByTestId composes a testid selector within the parent', async () => {
|
|
102
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
103
|
+
const loc = new WebLocator(session, '.form');
|
|
104
|
+
await loc.getByTestId('submit').count();
|
|
105
|
+
playwrightExpect(evaluateCalls[0]).toContain(`parseSelector(${JSON.stringify('.form >> ' + getByTestIdSelector(TEST_ID_ATTR, 'submit'))})`);
|
|
106
|
+
});
|
|
107
|
+
test('getByAltText composes an alt selector within the parent', async () => {
|
|
108
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
109
|
+
const loc = new WebLocator(session, '.gallery');
|
|
110
|
+
await loc.getByAltText('logo').count();
|
|
111
|
+
playwrightExpect(evaluateCalls[0]).toContain(`parseSelector(${JSON.stringify('.gallery >> ' + getByAltTextSelector('logo'))})`);
|
|
112
|
+
});
|
|
113
|
+
test('getByTitle composes a title selector within the parent', async () => {
|
|
114
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
115
|
+
const loc = new WebLocator(session, '.toolbar');
|
|
116
|
+
await loc.getByTitle('Close').count();
|
|
117
|
+
playwrightExpect(evaluateCalls[0]).toContain(`parseSelector(${JSON.stringify('.toolbar >> ' + getByTitleSelector('Close'))})`);
|
|
118
|
+
});
|
|
119
|
+
test('last() composes an nth=-1 selector', async () => {
|
|
120
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
121
|
+
const loc = new WebLocator(session, '.btn');
|
|
122
|
+
await loc.last().count();
|
|
123
|
+
playwrightExpect(evaluateCalls[0]).toContain('parseSelector(".btn >> nth=-1")');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
// ─── State queries ────────────────────────────────────────────
|
|
127
|
+
test.describe('WebLocator.isVisible()', () => {
|
|
128
|
+
test('returns true when element is visible', async () => {
|
|
129
|
+
const { session } = sessionReturning(true);
|
|
130
|
+
const loc = new WebLocator(session, '.btn');
|
|
131
|
+
playwrightExpect(await loc.isVisible({ timeout: 0 })).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
test('returns false when element is not found', async () => {
|
|
134
|
+
const { session } = sessionReturning(false);
|
|
135
|
+
const loc = new WebLocator(session, '.btn');
|
|
136
|
+
playwrightExpect(await loc.isVisible({ timeout: 0 })).toBe(false);
|
|
137
|
+
});
|
|
138
|
+
test('returns false without throwing when evaluate rejects', async () => {
|
|
139
|
+
const session = {
|
|
140
|
+
evaluate: async () => { throw new Error('evaluate failed'); },
|
|
141
|
+
goto: async () => { }, url: async () => '',
|
|
142
|
+
goBack: async () => { }, goForward: async () => { },
|
|
143
|
+
title: async () => '', reload: async () => { }, waitForLoadState: async () => { },
|
|
144
|
+
close: async () => { },
|
|
145
|
+
};
|
|
146
|
+
const loc = new WebLocator(session, '.btn');
|
|
147
|
+
playwrightExpect(await loc.isVisible({ timeout: 0 })).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
test('returns true when element is visible while polling with a non-zero timeout', async () => {
|
|
150
|
+
const { session } = sessionAlwaysReturning(true);
|
|
151
|
+
const loc = new WebLocator(session, '.btn');
|
|
152
|
+
playwrightExpect(await loc.isVisible({ timeout: 200 })).toBe(true);
|
|
153
|
+
});
|
|
154
|
+
test('returns false when the element stays invisible until the polling timeout elapses', async () => {
|
|
155
|
+
const { session } = sessionAlwaysReturning(false);
|
|
156
|
+
const loc = new WebLocator(session, '.btn');
|
|
157
|
+
playwrightExpect(await loc.isVisible({ timeout: 200 })).toBe(false);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
test.describe('WebLocator.isHidden()', () => {
|
|
161
|
+
test('returns true when element is not visible', async () => {
|
|
162
|
+
const { session } = sessionReturning(false);
|
|
163
|
+
const loc = new WebLocator(session, '.btn');
|
|
164
|
+
playwrightExpect(await loc.isHidden({ timeout: 0 })).toBe(true);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
test.describe('WebLocator.isEnabled()', () => {
|
|
168
|
+
test('returns true when element is enabled', async () => {
|
|
169
|
+
const { session } = sessionReturning(true);
|
|
170
|
+
const loc = new WebLocator(session, 'input');
|
|
171
|
+
playwrightExpect(await loc.isEnabled({ timeout: 0 })).toBe(true);
|
|
172
|
+
});
|
|
173
|
+
test('returns false when element is disabled', async () => {
|
|
174
|
+
const { session } = sessionReturning(false);
|
|
175
|
+
const loc = new WebLocator(session, 'input');
|
|
176
|
+
playwrightExpect(await loc.isEnabled({ timeout: 0 })).toBe(false);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
test.describe('WebLocator.isChecked()', () => {
|
|
180
|
+
test('returns true when element is checked', async () => {
|
|
181
|
+
const { session } = sessionReturning(true);
|
|
182
|
+
const loc = new WebLocator(session, 'input[type=checkbox]');
|
|
183
|
+
playwrightExpect(await loc.isChecked({ timeout: 0 })).toBe(true);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
test.describe('WebLocator.isDisabled()', () => {
|
|
187
|
+
test('returns true when the element is not enabled', async () => {
|
|
188
|
+
const { session } = sessionReturning(false);
|
|
189
|
+
const loc = new WebLocator(session, 'input');
|
|
190
|
+
playwrightExpect(await loc.isDisabled({ timeout: 0 })).toBe(true);
|
|
191
|
+
});
|
|
192
|
+
test('returns false when the element is enabled', async () => {
|
|
193
|
+
const { session } = sessionReturning(true);
|
|
194
|
+
const loc = new WebLocator(session, 'input');
|
|
195
|
+
playwrightExpect(await loc.isDisabled({ timeout: 0 })).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
// ─── State-query missing-element semantics ───────────────────
|
|
199
|
+
// Matches Playwright: isVisible → false on missing; isEnabled/isChecked throw.
|
|
200
|
+
test.describe('state-query missing-element semantics', () => {
|
|
201
|
+
test('isVisible returns false when the element is absent', async () => {
|
|
202
|
+
const { session } = sessionReturning(false);
|
|
203
|
+
const loc = new WebLocator(session, '.gone');
|
|
204
|
+
playwrightExpect(await loc.isVisible({ timeout: 0 })).toBe(false);
|
|
205
|
+
});
|
|
206
|
+
test('isEnabled rejects with "element not found" when the element is absent', async () => {
|
|
207
|
+
// null = injected querySelector found nothing.
|
|
208
|
+
const { session } = sessionReturning(null);
|
|
209
|
+
const loc = new WebLocator(session, '.gone');
|
|
210
|
+
await playwrightExpect(loc.isEnabled({ timeout: 0 })).rejects.toThrow(/element not found/);
|
|
211
|
+
});
|
|
212
|
+
test('isChecked rejects with "element not found" when the element is absent', async () => {
|
|
213
|
+
const { session } = sessionReturning(null);
|
|
214
|
+
const loc = new WebLocator(session, '.gone');
|
|
215
|
+
await playwrightExpect(loc.isChecked({ timeout: 0 })).rejects.toThrow(/element not found/);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
// ─── Value queries ────────────────────────────────────────────
|
|
219
|
+
test.describe('WebLocator.textContent()', () => {
|
|
220
|
+
test('returns text content after waiting for visibility', async () => {
|
|
221
|
+
// First call: isVisible check → true; second: textContent expression
|
|
222
|
+
const { session } = sessionReturning(true, 'Sign In');
|
|
223
|
+
const loc = new WebLocator(session, '.btn');
|
|
224
|
+
playwrightExpect(await loc.textContent()).toBe('Sign In');
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
test.describe('WebLocator.innerText()', () => {
|
|
228
|
+
test('returns the rendered inner text after waiting for visibility', async () => {
|
|
229
|
+
const { session } = sessionReturning(true, 'Sign In');
|
|
230
|
+
const loc = new WebLocator(session, '.btn');
|
|
231
|
+
playwrightExpect(await loc.innerText()).toBe('Sign In');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
test.describe('WebLocator.innerHTML()', () => {
|
|
235
|
+
test('returns the inner HTML after waiting for visibility', async () => {
|
|
236
|
+
const { session } = sessionReturning(true, '<span>Sign In</span>');
|
|
237
|
+
const loc = new WebLocator(session, '.btn');
|
|
238
|
+
playwrightExpect(await loc.innerHTML()).toBe('<span>Sign In</span>');
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
test.describe('WebLocator.inputValue()', () => {
|
|
242
|
+
test('returns the input value after waiting for visibility', async () => {
|
|
243
|
+
const { session } = sessionReturning(true, 'john@example.com');
|
|
244
|
+
const loc = new WebLocator(session, 'input');
|
|
245
|
+
playwrightExpect(await loc.inputValue()).toBe('john@example.com');
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
test.describe('WebLocator.boundingBox()', () => {
|
|
249
|
+
test('returns a Bounds object with x, y, width, and height', async () => {
|
|
250
|
+
// isVisible → true, then the getBoundingClientRect expression → a rect.
|
|
251
|
+
const { session } = sessionReturning(true, { x: 10, y: 20, width: 100, height: 40 });
|
|
252
|
+
const loc = new WebLocator(session, '.btn');
|
|
253
|
+
const box = await loc.boundingBox();
|
|
254
|
+
// The Bounds contract clients depend on: all four numeric fields present.
|
|
255
|
+
playwrightExpect(box).toEqual({ x: 10, y: 20, width: 100, height: 40 });
|
|
256
|
+
});
|
|
257
|
+
test('returns null when the element is absent', async () => {
|
|
258
|
+
const { session } = sessionReturning(true, null);
|
|
259
|
+
const loc = new WebLocator(session, '.missing');
|
|
260
|
+
playwrightExpect(await loc.boundingBox()).toBeNull();
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
test.describe('WebLocator.getAttribute()', () => {
|
|
264
|
+
test('returns the attribute value after waiting for visibility', async () => {
|
|
265
|
+
const { session } = sessionReturning(true, 'primary');
|
|
266
|
+
const loc = new WebLocator(session, '.btn');
|
|
267
|
+
playwrightExpect(await loc.getAttribute('class')).toBe('primary');
|
|
268
|
+
});
|
|
269
|
+
test('returns null when attribute is absent', async () => {
|
|
270
|
+
const { session } = sessionReturning(true, null);
|
|
271
|
+
const loc = new WebLocator(session, '.btn');
|
|
272
|
+
playwrightExpect(await loc.getAttribute('data-missing')).toBeNull();
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
test.describe('WebLocator.getAttribute() — evaluate contains correct attribute name', () => {
|
|
276
|
+
test('embeds the attribute name in the evaluate expression', async () => {
|
|
277
|
+
const { session, evaluateCalls } = sessionReturning(true, 'value');
|
|
278
|
+
const loc = new WebLocator(session, '.btn');
|
|
279
|
+
await loc.getAttribute('aria-label');
|
|
280
|
+
playwrightExpect(evaluateCalls.some(c => c.includes('aria-label'))).toBe(true);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
// ─── waitFor ─────────────────────────────────────────────────
|
|
284
|
+
test.describe('WebLocator.waitFor()', () => {
|
|
285
|
+
test('resolves immediately when element is already visible', async () => {
|
|
286
|
+
const { session } = sessionAlwaysReturning(true);
|
|
287
|
+
const loc = new WebLocator(session, '.btn');
|
|
288
|
+
await loc.waitFor({ state: 'visible', timeout: 1000 });
|
|
289
|
+
});
|
|
290
|
+
test('resolves when element becomes detached', async () => {
|
|
291
|
+
// count: 0 → attached check fails (detached = true)
|
|
292
|
+
const { session } = sessionAlwaysReturning(0);
|
|
293
|
+
const loc = new WebLocator(session, '.removed');
|
|
294
|
+
await loc.waitFor({ state: 'detached', timeout: 1000 });
|
|
295
|
+
});
|
|
296
|
+
test('rejects when element never becomes visible within timeout', async () => {
|
|
297
|
+
const { session } = sessionAlwaysReturning(false);
|
|
298
|
+
const loc = new WebLocator(session, '.missing');
|
|
299
|
+
await playwrightExpect(loc.waitFor({ state: 'visible', timeout: 200 })).rejects.toThrow();
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
// ─── Actions ─────────────────────────────────────────────────
|
|
303
|
+
test.describe('WebLocator.click()', () => {
|
|
304
|
+
test('evaluates a click expression after waiting for visibility', async () => {
|
|
305
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(true);
|
|
306
|
+
const loc = new WebLocator(session, '.btn');
|
|
307
|
+
await loc.click();
|
|
308
|
+
playwrightExpect(evaluateCalls.some(c => c.includes('.click()'))).toBe(true);
|
|
309
|
+
});
|
|
310
|
+
test('asserts the element exists, throwing in-page rather than silently no-op', async () => {
|
|
311
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(true);
|
|
312
|
+
const loc = new WebLocator(session, '.btn');
|
|
313
|
+
await loc.click();
|
|
314
|
+
const js = evaluateCalls.find(c => c.includes('.click()')) ?? '';
|
|
315
|
+
playwrightExpect(js).toContain('throw new Error');
|
|
316
|
+
playwrightExpect(js).toContain('element not found');
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
test.describe('WebLocator.fill()', () => {
|
|
320
|
+
test('evaluates a fill expression with the given text', async () => {
|
|
321
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(true);
|
|
322
|
+
const loc = new WebLocator(session, 'input');
|
|
323
|
+
await loc.fill('hello@example.com');
|
|
324
|
+
playwrightExpect(evaluateCalls.some(c => c.includes('hello@example.com'))).toBe(true);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
test.describe('getByRole().click() via the injected engine', () => {
|
|
328
|
+
test('resolves and clicks through window.__mwInjected using the exact Playwright selector', async () => {
|
|
329
|
+
// Every evaluate resolves true: the actionability poll passes on the first
|
|
330
|
+
// read, so click() proceeds to dispatch.
|
|
331
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(true);
|
|
332
|
+
const page = await Page.attach(session);
|
|
333
|
+
await page.getByRole('button', { name: 'Sign in' }).click();
|
|
334
|
+
const expectedSelector = getByRoleSelector('button', { name: 'Sign in' });
|
|
335
|
+
const usesInjectedSelector = evaluateCalls.some((c) => c.includes('window.__mwInjected') &&
|
|
336
|
+
c.includes(`parseSelector(${JSON.stringify(expectedSelector)})`));
|
|
337
|
+
const dispatchesClick = evaluateCalls.some((c) => c.includes('el.click()'));
|
|
338
|
+
playwrightExpect(usesInjectedSelector).toBe(true);
|
|
339
|
+
playwrightExpect(dispatchesClick).toBe(true);
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
test.describe('WebLocator.hover()', () => {
|
|
343
|
+
test('waits for the element to be visible before dispatching the hover events', async () => {
|
|
344
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(true);
|
|
345
|
+
const loc = new WebLocator(session, '.btn');
|
|
346
|
+
await loc.hover();
|
|
347
|
+
// Like click/fill/type, hover must first run the injected visibility check
|
|
348
|
+
// before acting — otherwise it acts on a stale match.
|
|
349
|
+
const visibilityCheckIndex = evaluateCalls.findIndex(c => c.includes('elementState(el,'));
|
|
350
|
+
const hoverIndex = evaluateCalls.findIndex(c => c.includes('mouseover'));
|
|
351
|
+
playwrightExpect(visibilityCheckIndex).toBeGreaterThanOrEqual(0);
|
|
352
|
+
playwrightExpect(hoverIndex).toBeGreaterThan(visibilityCheckIndex);
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
// ─── getText / getValue aliases ───────────────────────────────
|
|
356
|
+
test.describe('getText() and getValue() aliases', () => {
|
|
357
|
+
test('getText() delegates to textContent()', async () => {
|
|
358
|
+
const { session } = sessionReturning(true, 'Hello World');
|
|
359
|
+
const loc = new WebLocator(session, 'p');
|
|
360
|
+
playwrightExpect(await loc.getText()).toBe('Hello World');
|
|
361
|
+
});
|
|
362
|
+
test('getValue() delegates to inputValue()', async () => {
|
|
363
|
+
const { session } = sessionReturning(true, 'myvalue');
|
|
364
|
+
const loc = new WebLocator(session, 'input');
|
|
365
|
+
playwrightExpect(await loc.getValue()).toBe('myvalue');
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
// ─── Step instrumentation ────────────────────────────────────
|
|
369
|
+
test.describe('WebLocator step instrumentation', () => {
|
|
370
|
+
test('actions emit a named step matching the method call', async () => {
|
|
371
|
+
const { session } = sessionAlwaysReturning(true);
|
|
372
|
+
const { stepFn, titles } = recordingStepFn();
|
|
373
|
+
const loc = new WebLocator(session, '.btn');
|
|
374
|
+
loc._stepFn = stepFn;
|
|
375
|
+
await loc.click();
|
|
376
|
+
await loc.fill('hello');
|
|
377
|
+
await loc.type('world');
|
|
378
|
+
await loc.press('Enter');
|
|
379
|
+
await loc.focus();
|
|
380
|
+
await loc.hover();
|
|
381
|
+
await loc.scrollIntoViewIfNeeded();
|
|
382
|
+
playwrightExpect(titles).toEqual([
|
|
383
|
+
'locator.click()',
|
|
384
|
+
'locator.fill("hello")',
|
|
385
|
+
'locator.type("world")',
|
|
386
|
+
'locator.press("Enter")',
|
|
387
|
+
'locator.focus()',
|
|
388
|
+
'locator.hover()',
|
|
389
|
+
'locator.scrollIntoViewIfNeeded()',
|
|
390
|
+
]);
|
|
391
|
+
});
|
|
392
|
+
test('chaining composes the child selector within the parent', async () => {
|
|
393
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(0);
|
|
394
|
+
const loc = new WebLocator(session, '.form');
|
|
395
|
+
await loc.getByText('Submit').count();
|
|
396
|
+
// The child query is scoped to the parent via Playwright's `>>` combinator.
|
|
397
|
+
playwrightExpect(evaluateCalls[0]).toContain(`parseSelector(${JSON.stringify('.form >> ' + getByTextSelector('Submit'))})`);
|
|
398
|
+
});
|
|
399
|
+
test('chaining propagates the step function to descendants', async () => {
|
|
400
|
+
const { session } = sessionAlwaysReturning(true);
|
|
401
|
+
const { stepFn } = recordingStepFn();
|
|
402
|
+
const loc = new WebLocator(session, '.form');
|
|
403
|
+
loc._stepFn = stepFn;
|
|
404
|
+
playwrightExpect(loc.locator('.field')._stepFn).toBe(stepFn);
|
|
405
|
+
playwrightExpect(loc.getByRole('button')._stepFn).toBe(stepFn);
|
|
406
|
+
playwrightExpect(loc.nth(2)._stepFn).toBe(stepFn);
|
|
407
|
+
playwrightExpect(loc.first()._stepFn).toBe(stepFn);
|
|
408
|
+
});
|
|
409
|
+
test('actions run normally when no step function is set', async () => {
|
|
410
|
+
const { session, evaluateCalls } = sessionAlwaysReturning(true);
|
|
411
|
+
const loc = new WebLocator(session, '.btn');
|
|
412
|
+
await loc.click();
|
|
413
|
+
playwrightExpect(evaluateCalls.some(c => c.includes('.click()'))).toBe(true);
|
|
414
|
+
});
|
|
415
|
+
test('value queries are NOT wrapped as steps', async () => {
|
|
416
|
+
const { session } = sessionReturning(true, 'Sign In');
|
|
417
|
+
const { stepFn, titles } = recordingStepFn();
|
|
418
|
+
const loc = new WebLocator(session, '.btn');
|
|
419
|
+
loc._stepFn = stepFn;
|
|
420
|
+
await loc.textContent();
|
|
421
|
+
playwrightExpect(titles).toEqual([]);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
//# sourceMappingURL=web-locator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-locator.test.js","sourceRoot":"","sources":["../src/web-locator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type LocatorStrategy } from './query-engine.js';
|
|
2
|
+
import { Locator } from './locator.js';
|
|
3
|
+
import { Page } from './page.js';
|
|
4
|
+
export declare class WebViewLocator extends Locator {
|
|
5
|
+
private _page;
|
|
6
|
+
first(): WebViewLocator;
|
|
7
|
+
last(): WebViewLocator;
|
|
8
|
+
nth(index: number): WebViewLocator;
|
|
9
|
+
private nthWebView;
|
|
10
|
+
protected child(childStrategy: LocatorStrategy): Locator;
|
|
11
|
+
page(): Promise<Page>;
|
|
12
|
+
private _resolvePage;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=webview-locator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webview-locator.d.ts","sourceRoot":"","sources":["../src/webview-locator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,qBAAa,cAAe,SAAQ,OAAO;IACzC,OAAO,CAAC,KAAK,CAAqB;IAGzB,KAAK,IAAI,cAAc;IAIvB,IAAI,IAAI,cAAc;IAItB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc;IAI3C,OAAO,CAAC,UAAU;cAWC,KAAK,CAAC,aAAa,EAAE,eAAe,GAAG,OAAO;IAU3D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,YAAY;CAwE3B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { queryAll } from './query-engine.js';
|
|
2
|
+
import { Locator } from './locator.js';
|
|
3
|
+
import { Page } from './page.js';
|
|
4
|
+
export class WebViewLocator extends Locator {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this._page = null;
|
|
8
|
+
}
|
|
9
|
+
// first/last/nth stay within webview context so .page() remains available
|
|
10
|
+
first() {
|
|
11
|
+
return this.nthWebView(0);
|
|
12
|
+
}
|
|
13
|
+
last() {
|
|
14
|
+
return this.nthWebView(-1);
|
|
15
|
+
}
|
|
16
|
+
nth(index) {
|
|
17
|
+
return this.nthWebView(index);
|
|
18
|
+
}
|
|
19
|
+
nthWebView(index) {
|
|
20
|
+
const loc = new WebViewLocator(this.driver, { kind: 'nth', parent: this.strategy, index }, this.options);
|
|
21
|
+
loc._stepFn = this._stepFn;
|
|
22
|
+
return loc;
|
|
23
|
+
}
|
|
24
|
+
// Chaining into DOM locators returns a plain Locator, not WebViewLocator
|
|
25
|
+
child(childStrategy) {
|
|
26
|
+
const loc = new Locator(this.driver, { kind: 'chain', parent: this.strategy, child: childStrategy }, this.options);
|
|
27
|
+
loc._stepFn = this._stepFn;
|
|
28
|
+
return loc;
|
|
29
|
+
}
|
|
30
|
+
async page() {
|
|
31
|
+
return this._step('getByWebView().page()', () => this._resolvePage());
|
|
32
|
+
}
|
|
33
|
+
async _resolvePage() {
|
|
34
|
+
if (this._page) {
|
|
35
|
+
return this._page;
|
|
36
|
+
}
|
|
37
|
+
const bridge = this.driver.webViewBridge;
|
|
38
|
+
if (!bridge) {
|
|
39
|
+
throw new Error('getByWebView().page(): this driver does not have a webViewBridge');
|
|
40
|
+
}
|
|
41
|
+
const bridgeWebviews = await bridge.listWebViews();
|
|
42
|
+
if (bridgeWebviews.length === 0) {
|
|
43
|
+
throw new Error('getByWebView().page(): no webviews available on the device');
|
|
44
|
+
}
|
|
45
|
+
// Map this locator to a specific webview by its position among native
|
|
46
|
+
// webview nodes. Platforms like iOS flatten webview content into the
|
|
47
|
+
// accessibility tree without a dedicated webview node, so when the hierarchy
|
|
48
|
+
// exposes none we can only attach an unambiguous single webview.
|
|
49
|
+
const roots = await this.driver.getViewHierarchy();
|
|
50
|
+
const allNativeWebviews = queryAll(roots, { kind: 'webview' });
|
|
51
|
+
let index = 0;
|
|
52
|
+
if (allNativeWebviews.length > 0) {
|
|
53
|
+
const selected = queryAll(roots, this.strategy);
|
|
54
|
+
if (selected.length !== 1) {
|
|
55
|
+
throw new Error('getByWebView().page(): locator did not resolve to a single webview ' +
|
|
56
|
+
`(matched ${selected.length} of ${allNativeWebviews.length}); ` +
|
|
57
|
+
'use .first(), .last(), or .nth(i) to choose one. ' +
|
|
58
|
+
`Strategy: ${JSON.stringify(this.strategy)}`);
|
|
59
|
+
}
|
|
60
|
+
const matched = allNativeWebviews.indexOf(selected[0]);
|
|
61
|
+
if (matched === -1) {
|
|
62
|
+
throw new Error('getByWebView().page(): resolved node is not among the native webviews. ' +
|
|
63
|
+
`Strategy: ${JSON.stringify(this.strategy)}`);
|
|
64
|
+
}
|
|
65
|
+
index = matched;
|
|
66
|
+
}
|
|
67
|
+
else if (bridgeWebviews.length > 1) {
|
|
68
|
+
// No native webview nodes to position-match against, yet several webviews
|
|
69
|
+
// exist — attaching index 0 would silently ignore .last()/.nth(i), so fail.
|
|
70
|
+
throw new Error('getByWebView().page(): the platform exposes no native webview nodes to ' +
|
|
71
|
+
`select by position, but ${bridgeWebviews.length} webviews are available — ` +
|
|
72
|
+
'cannot disambiguate which to attach. ' +
|
|
73
|
+
`Strategy: ${JSON.stringify(this.strategy)}`);
|
|
74
|
+
}
|
|
75
|
+
if (index < 0 || index >= bridgeWebviews.length) {
|
|
76
|
+
throw new Error(`getByWebView().page(): webview index ${index} is out of range ` +
|
|
77
|
+
`(${bridgeWebviews.length} webview(s) available from the bridge). ` +
|
|
78
|
+
`Strategy: ${JSON.stringify(this.strategy)}`);
|
|
79
|
+
}
|
|
80
|
+
const target = bridgeWebviews[index];
|
|
81
|
+
const session = await bridge.attachWebView(target.id);
|
|
82
|
+
try {
|
|
83
|
+
this._page = await Page.attach(session);
|
|
84
|
+
this._page._stepFn = this._stepFn;
|
|
85
|
+
return this._page;
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
// Engine injection failed — release the session we just opened rather than
|
|
89
|
+
// leaking it. Swallow close errors so the original failure propagates.
|
|
90
|
+
await session.close().catch(() => { });
|
|
91
|
+
throw err;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=webview-locator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webview-locator.js","sourceRoot":"","sources":["../src/webview-locator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,OAAO,cAAe,SAAQ,OAAO;IAA3C;;QACU,UAAK,GAAgB,IAAI,CAAC;IAgHpC,CAAC;IA9GC,0EAA0E;IACjE,KAAK;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAEQ,IAAI;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAEQ,GAAG,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,MAAM,GAAG,GAAG,IAAI,cAAc,CAC5B,IAAI,CAAC,MAAM,EACX,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,EAC7C,IAAI,CAAC,OAAO,CACb,CAAC;QACF,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,yEAAyE;IACtD,KAAK,CAAC,aAA8B;QACrD,MAAM,GAAG,GAAG,IAAI,OAAO,CACrB,IAAI,CAAC,MAAM,EACX,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,EAC9D,IAAI,CAAC,OAAO,CACb,CAAC;QACF,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACxE,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC,KAAK,CAAC;QAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QACnD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QAED,sEAAsE;QACtE,qEAAqE;QACrE,6EAA6E;QAC7E,iEAAiE;QACjE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACb,qEAAqE;oBACnE,YAAY,QAAQ,CAAC,MAAM,OAAO,iBAAiB,CAAC,MAAM,KAAK;oBAC/D,mDAAmD;oBACnD,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAC/C,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,yEAAyE;oBACvE,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAC/C,CAAC;YACJ,CAAC;YACD,KAAK,GAAG,OAAO,CAAC;QAClB,CAAC;aAAM,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,0EAA0E;YAC1E,4EAA4E;YAC5E,MAAM,IAAI,KAAK,CACb,yEAAyE;gBACvE,2BAA2B,cAAc,CAAC,MAAM,4BAA4B;gBAC5E,uCAAuC;gBACvC,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAC/C,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,mBAAmB;gBAC9D,IAAI,cAAc,CAAC,MAAM,0CAA0C;gBACnE,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAC/C,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAClC,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2EAA2E;YAC3E,uEAAuE;YACvE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webview-locator.test.d.ts","sourceRoot":"","sources":["../src/webview-locator.test.ts"],"names":[],"mappings":""}
|