chrome-e2e-sdk 0.0.0-stage → 1.0.1

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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +739 -2
  3. package/dist/assertion/Assertion.d.ts +87 -0
  4. package/dist/assertion/Assertion.d.ts.map +1 -0
  5. package/dist/assertion/Assertion.js +459 -0
  6. package/dist/assertion/Assertion.js.map +1 -0
  7. package/dist/assertion/recorder.d.ts +41 -0
  8. package/dist/assertion/recorder.d.ts.map +1 -0
  9. package/dist/assertion/recorder.js +37 -0
  10. package/dist/assertion/recorder.js.map +1 -0
  11. package/dist/browser/Browser.d.ts +44 -0
  12. package/dist/browser/Browser.d.ts.map +1 -0
  13. package/dist/browser/Browser.js +167 -0
  14. package/dist/browser/Browser.js.map +1 -0
  15. package/dist/browser/Locator.d.ts +94 -0
  16. package/dist/browser/Locator.d.ts.map +1 -0
  17. package/dist/browser/Locator.js +533 -0
  18. package/dist/browser/Locator.js.map +1 -0
  19. package/dist/browser/Page.d.ts +272 -0
  20. package/dist/browser/Page.d.ts.map +1 -0
  21. package/dist/browser/Page.js +979 -0
  22. package/dist/browser/Page.js.map +1 -0
  23. package/dist/client/MCPClient.d.ts +72 -0
  24. package/dist/client/MCPClient.d.ts.map +1 -0
  25. package/dist/client/MCPClient.js +302 -0
  26. package/dist/client/MCPClient.js.map +1 -0
  27. package/dist/client/MCPCommand.d.ts +51 -0
  28. package/dist/client/MCPCommand.d.ts.map +1 -0
  29. package/dist/client/MCPCommand.js +74 -0
  30. package/dist/client/MCPCommand.js.map +1 -0
  31. package/dist/env/loadEnv.d.ts +8 -0
  32. package/dist/env/loadEnv.d.ts.map +1 -0
  33. package/dist/env/loadEnv.js +19 -0
  34. package/dist/env/loadEnv.js.map +1 -0
  35. package/dist/errors/E2EError.d.ts +50 -0
  36. package/dist/errors/E2EError.d.ts.map +1 -0
  37. package/dist/errors/E2EError.js +90 -0
  38. package/dist/errors/E2EError.js.map +1 -0
  39. package/dist/index.d.ts +32 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +37 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/logger.d.ts +12 -0
  44. package/dist/logger.d.ts.map +1 -0
  45. package/dist/logger.js +57 -0
  46. package/dist/logger.js.map +1 -0
  47. package/dist/network/Network.d.ts +72 -0
  48. package/dist/network/Network.d.ts.map +1 -0
  49. package/dist/network/Network.js +236 -0
  50. package/dist/network/Network.js.map +1 -0
  51. package/dist/test/HtmlReport.d.ts +26 -0
  52. package/dist/test/HtmlReport.d.ts.map +1 -0
  53. package/dist/test/HtmlReport.js +653 -0
  54. package/dist/test/HtmlReport.js.map +1 -0
  55. package/dist/test/Runner.d.ts +146 -0
  56. package/dist/test/Runner.d.ts.map +1 -0
  57. package/dist/test/Runner.js +390 -0
  58. package/dist/test/Runner.js.map +1 -0
  59. package/dist/test/index.d.ts +4 -0
  60. package/dist/test/index.d.ts.map +1 -0
  61. package/dist/test/index.js +3 -0
  62. package/dist/test/index.js.map +1 -0
  63. package/dist/version.d.ts +2 -0
  64. package/dist/version.d.ts.map +1 -0
  65. package/dist/version.js +4 -0
  66. package/dist/version.js.map +1 -0
  67. package/package.json +63 -4
@@ -0,0 +1,533 @@
1
+ import { Page } from './Page.js';
2
+ import {} from '../errors/E2EError.js';
3
+ import { DEFAULT_TIMEOUT_MS } from '../client/MCPCommand.js';
4
+ import { E2EError, E2EErrorCode } from '../errors/E2EError.js';
5
+ export class Locator {
6
+ page;
7
+ selector;
8
+ logger;
9
+ constructor(page, selector) {
10
+ this.page = page;
11
+ this.selector = selector;
12
+ this.logger = this.createLogger();
13
+ }
14
+ /**
15
+ * The selector this locator was built from. Read-only copy for diagnostics.
16
+ */
17
+ getSelector() {
18
+ return { ...this.selector };
19
+ }
20
+ get spec() {
21
+ return this.selector ?? {};
22
+ }
23
+ /**
24
+ * Human readable selector description, used in error messages.
25
+ */
26
+ describe() {
27
+ const spec = this.spec;
28
+ if (spec.role)
29
+ return `role=${spec.role}${spec.name ? ` name="${spec.name}"` : ''}`;
30
+ if (spec.text)
31
+ return `text="${spec.text}"`;
32
+ if (spec.label)
33
+ return `label="${spec.label}"`;
34
+ if (spec.css)
35
+ return `css="${spec.css}"`;
36
+ return 'unknown';
37
+ }
38
+ /**
39
+ * Timeout is read from the owning page on every call so that
40
+ * `browser.setDefaultTimeout()` reaches locators that were created earlier.
41
+ */
42
+ get defaultTimeout() {
43
+ return this.page?.getDefaultTimeout() ?? DEFAULT_TIMEOUT_MS;
44
+ }
45
+ createLogger() {
46
+ return (level, message) => {
47
+ if (process.env['DEBUG']?.includes('chrome-e2e')) {
48
+ console.error(`[ChromeE2E:Locator] ${level.toUpperCase()}: ${message}`);
49
+ }
50
+ };
51
+ }
52
+ // Click element
53
+ async click(options = {}) {
54
+ const timeout = options.timeout ?? this.defaultTimeout;
55
+ this.logger('debug', `Clicking element: ${this.describe()}`);
56
+ if (this.selector.css) {
57
+ await this.runCssAction(`
58
+ element.click();
59
+ return true;
60
+ `, 'Click', timeout);
61
+ return;
62
+ }
63
+ if (this.selector.label) {
64
+ await this.runLabelAction(`
65
+ element.click();
66
+ return true;
67
+ `, 'Click', timeout);
68
+ return;
69
+ }
70
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Click: ${this.describe()}`);
71
+ await this.page.callTool('click', {
72
+ pageId: this.page.getPageId(),
73
+ uid: element.uid
74
+ });
75
+ }
76
+ // Fill input element
77
+ async fill(value, options = {}) {
78
+ const timeout = options.timeout ?? this.defaultTimeout;
79
+ this.logger('debug', `Filling element: ${this.describe()} with: ${value}`);
80
+ if (this.selector.css) {
81
+ await this.runCssAction(`
82
+ element.focus();
83
+ element.value = ${JSON.stringify(value)};
84
+ element.dispatchEvent(new Event('input', { bubbles: true }));
85
+ element.dispatchEvent(new Event('change', { bubbles: true }));
86
+ return true;
87
+ `, 'Fill', timeout);
88
+ return;
89
+ }
90
+ if (this.selector.label) {
91
+ await this.runLabelAction(`
92
+ element.focus();
93
+ if ('value' in element) {
94
+ element.value = ${JSON.stringify(value)};
95
+ } else {
96
+ element.textContent = ${JSON.stringify(value)};
97
+ }
98
+ element.dispatchEvent(new Event('input', { bubbles: true }));
99
+ element.dispatchEvent(new Event('change', { bubbles: true }));
100
+ return true;
101
+ `, 'Fill', timeout);
102
+ return;
103
+ }
104
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Fill: ${this.describe()}`);
105
+ await this.page.callTool('fill', {
106
+ pageId: this.page.getPageId(),
107
+ uid: element.uid,
108
+ value
109
+ });
110
+ }
111
+ // Type text into the element. `delay` inserts a pause between characters.
112
+ async type(text, options = {}) {
113
+ const timeout = options.timeout ?? this.defaultTimeout;
114
+ const delay = options.delay ?? 0;
115
+ this.logger('debug', `Typing into element: ${this.describe()}`);
116
+ if (this.selector.css) {
117
+ await this.runCssAction(`
118
+ element.focus();
119
+ return true;
120
+ `, 'Type', timeout);
121
+ }
122
+ else if (this.selector.label) {
123
+ await this.runLabelAction(`
124
+ element.focus();
125
+ return true;
126
+ `, 'Type', timeout);
127
+ }
128
+ else {
129
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Type: ${this.describe()}`);
130
+ await this.page.callTool('click', {
131
+ pageId: this.page.getPageId(),
132
+ uid: element.uid
133
+ });
134
+ }
135
+ if (delay > 0) {
136
+ for (const char of text) {
137
+ await this.page.callTool('type_text', {
138
+ pageId: this.page.getPageId(),
139
+ text: char
140
+ });
141
+ await new Promise((resolve) => setTimeout(resolve, delay));
142
+ }
143
+ return;
144
+ }
145
+ await this.page.callTool('type_text', {
146
+ pageId: this.page.getPageId(),
147
+ text
148
+ });
149
+ }
150
+ // Press key
151
+ async press(key, options = {}) {
152
+ const timeout = options.timeout ?? this.defaultTimeout;
153
+ this.logger('debug', `Pressing key: ${key} on element: ${this.describe()}`);
154
+ if (this.selector.css) {
155
+ await this.runCssAction(`
156
+ element.focus();
157
+ return true;
158
+ `, 'Press', timeout);
159
+ await this.page.callTool('press_key', {
160
+ pageId: this.page.getPageId(),
161
+ key
162
+ });
163
+ return;
164
+ }
165
+ if (this.selector.label) {
166
+ await this.runLabelAction(`
167
+ element.focus();
168
+ return true;
169
+ `, 'Press', timeout);
170
+ await this.page.callTool('press_key', {
171
+ pageId: this.page.getPageId(),
172
+ key
173
+ });
174
+ return;
175
+ }
176
+ await this.withTimeout(this.page.resolve(this.selector), timeout, `Press: ${this.describe()}`);
177
+ await this.page.callTool('press_key', {
178
+ pageId: this.page.getPageId(),
179
+ key
180
+ });
181
+ }
182
+ // Hover element
183
+ async hover(options = {}) {
184
+ const timeout = options.timeout ?? this.defaultTimeout;
185
+ this.logger('debug', `Hovering element: ${this.describe()}`);
186
+ if (this.selector.css) {
187
+ await this.runCssAction(`
188
+ element.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
189
+ element.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true }));
190
+ return true;
191
+ `, 'Hover', timeout);
192
+ return;
193
+ }
194
+ if (this.selector.label) {
195
+ await this.runLabelAction(`
196
+ element.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
197
+ element.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true }));
198
+ return true;
199
+ `, 'Hover', timeout);
200
+ return;
201
+ }
202
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Hover: ${this.describe()}`);
203
+ await this.page.callTool('hover', {
204
+ pageId: this.page.getPageId(),
205
+ uid: element.uid
206
+ });
207
+ }
208
+ // Drag element onto another element
209
+ async dragTo(target, options = {}) {
210
+ const timeout = options.timeout ?? this.defaultTimeout;
211
+ this.logger('debug', `Dragging element: ${this.describe()} to target`);
212
+ const sourceElement = await this.withTimeout(this.page.resolve(this.selector), timeout, `Drag source: ${this.describe()}`);
213
+ const targetElement = await this.withTimeout(this.page.resolve(target.getSelector()), timeout, `Drag target: ${target.describe()}`);
214
+ await this.page.callTool('drag', {
215
+ pageId: this.page.getPageId(),
216
+ from_uid: sourceElement.uid,
217
+ to_uid: targetElement.uid
218
+ });
219
+ }
220
+ // Upload file
221
+ async setInputFiles(files, options = {}) {
222
+ const timeout = options.timeout ?? this.defaultTimeout;
223
+ const fileList = Array.isArray(files) ? files : [files];
224
+ this.logger('debug', `Uploading files to: ${this.describe()}`);
225
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Upload: ${this.describe()}`);
226
+ await this.page.callTool('upload_file', {
227
+ pageId: this.page.getPageId(),
228
+ uid: element.uid,
229
+ filePaths: fileList
230
+ });
231
+ }
232
+ // Handle a native dialog opened by the page
233
+ async handleDialog(action, promptText, options = {}) {
234
+ const timeout = options.timeout ?? this.defaultTimeout;
235
+ this.logger('debug', `Handling dialog: ${action}`);
236
+ await this.withTimeout(this.page.callTool('handle_dialog', {
237
+ pageId: this.page.getPageId(),
238
+ action,
239
+ promptText
240
+ }), timeout, `Handle dialog: ${action}`);
241
+ }
242
+ // Get element text content
243
+ async textContent(options = {}) {
244
+ const timeout = options.timeout ?? this.defaultTimeout;
245
+ this.logger('debug', `Getting text content: ${this.describe()}`);
246
+ if (this.selector.css) {
247
+ return this.runCssAction('return element.textContent ?? "";', 'Text content', timeout);
248
+ }
249
+ if (this.selector.label) {
250
+ return this.runLabelAction('return element.textContent ?? element.value ?? "";', 'Text content', timeout);
251
+ }
252
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Text content: ${this.describe()}`);
253
+ const result = await this.page.callTool('evaluate_script', {
254
+ pageId: this.page.getPageId(),
255
+ function: '(el) => el.textContent ?? ""',
256
+ args: [element.uid]
257
+ });
258
+ return result;
259
+ }
260
+ // Get element attribute
261
+ /**
262
+ * `value` is read as a DOM property, every other name as an attribute.
263
+ *
264
+ * The attribute only ever holds what the markup shipped with. Typing into a
265
+ * field changes the property, so `getAttribute('value')` returns null for
266
+ * anything the user entered, and `toHaveValue()` then fails on a field that
267
+ * visibly contains the right text. The label path already special-cased this;
268
+ * the css and role/text paths did not, so the same locator behaved
269
+ * differently depending on how it was written.
270
+ */
271
+ static readAttributeScript(name, elementRef) {
272
+ return `
273
+ if (${JSON.stringify(name)} === 'value' && ${elementRef} && 'value' in ${elementRef}) {
274
+ return ${elementRef}.value;
275
+ }
276
+ return ${elementRef}.getAttribute(${JSON.stringify(name)});
277
+ `;
278
+ }
279
+ async getAttribute(name, options = {}) {
280
+ const timeout = options.timeout ?? this.defaultTimeout;
281
+ this.logger('debug', `Getting attribute ${name}: ${this.describe()}`);
282
+ if (this.selector.css) {
283
+ return this.runCssAction(Locator.readAttributeScript(name, 'element'), 'Get attribute', timeout);
284
+ }
285
+ if (this.selector.label) {
286
+ return this.runLabelAction(Locator.readAttributeScript(name, 'element'), 'Get attribute', timeout);
287
+ }
288
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Get attribute: ${this.describe()}`);
289
+ const result = await this.page.callTool('evaluate_script', {
290
+ pageId: this.page.getPageId(),
291
+ function: `(el) => {${Locator.readAttributeScript(name, 'el')}}`,
292
+ args: [element.uid]
293
+ });
294
+ return result;
295
+ }
296
+ // Check if element is visible
297
+ async isVisible(options = {}) {
298
+ const timeout = options.timeout ?? this.defaultTimeout;
299
+ try {
300
+ if (this.selector.css) {
301
+ return await this.runCssAction(`
302
+ const style = window.getComputedStyle(element);
303
+ const rect = element.getBoundingClientRect();
304
+ return style.visibility !== 'hidden' && style.display !== 'none' && rect.width > 0 && rect.height > 0;
305
+ `, 'Visibility check', timeout);
306
+ }
307
+ if (this.selector.label) {
308
+ return await this.runLabelAction(`
309
+ const style = window.getComputedStyle(element);
310
+ const rect = element.getBoundingClientRect();
311
+ return style.visibility !== 'hidden' && style.display !== 'none' && rect.width > 0 && rect.height > 0;
312
+ `, 'Visibility check', timeout);
313
+ }
314
+ await this.withTimeout(this.page.resolve(this.selector), timeout, `Visibility check: ${this.describe()}`);
315
+ return true;
316
+ }
317
+ catch (error) {
318
+ this.rethrowIfFatal(error, 'Visibility check');
319
+ return false;
320
+ }
321
+ }
322
+ // Check if element is enabled
323
+ async isEnabled(options = {}) {
324
+ const timeout = options.timeout ?? this.defaultTimeout;
325
+ try {
326
+ if (this.selector.css) {
327
+ return await this.runCssAction('return !element.disabled;', 'Enabled check', timeout);
328
+ }
329
+ if (this.selector.label) {
330
+ return await this.runLabelAction('return !element.disabled;', 'Enabled check', timeout);
331
+ }
332
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Enabled check: ${this.describe()}`);
333
+ const result = await this.page.callTool('evaluate_script', {
334
+ pageId: this.page.getPageId(),
335
+ function: '(el) => !el.disabled',
336
+ args: [element.uid]
337
+ });
338
+ return result;
339
+ }
340
+ catch (error) {
341
+ this.rethrowIfFatal(error, 'Enabled check');
342
+ return false;
343
+ }
344
+ }
345
+ // Check if element is checked
346
+ async isChecked(options = {}) {
347
+ const timeout = options.timeout ?? this.defaultTimeout;
348
+ try {
349
+ if (this.selector.css) {
350
+ return await this.runCssAction('return Boolean(element.checked);', 'Checked check', timeout);
351
+ }
352
+ if (this.selector.label) {
353
+ return await this.runLabelAction('return Boolean(element.checked);', 'Checked check', timeout);
354
+ }
355
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Checked check: ${this.describe()}`);
356
+ const result = await this.page.callTool('evaluate_script', {
357
+ pageId: this.page.getPageId(),
358
+ function: '(el) => Boolean(el.checked)',
359
+ args: [element.uid]
360
+ });
361
+ return result;
362
+ }
363
+ catch (error) {
364
+ this.rethrowIfFatal(error, 'Checked check');
365
+ return false;
366
+ }
367
+ }
368
+ // Wait for element to be visible
369
+ async waitForVisible(options = {}) {
370
+ const timeout = options.timeout ?? this.defaultTimeout;
371
+ const startTime = Date.now();
372
+ this.logger('debug', `Waiting for visible: ${this.describe()}`);
373
+ while (true) {
374
+ if (await this.isVisible({ timeout: 0 })) {
375
+ return;
376
+ }
377
+ if (Date.now() - startTime >= timeout) {
378
+ break;
379
+ }
380
+ await new Promise((resolve) => setTimeout(resolve, 100));
381
+ }
382
+ throw E2EError.timeout(`Wait for visible: ${this.describe()}`, timeout);
383
+ }
384
+ // Wait for element to be hidden
385
+ async waitForHidden(options = {}) {
386
+ const timeout = options.timeout ?? this.defaultTimeout;
387
+ const startTime = Date.now();
388
+ this.logger('debug', `Waiting for hidden: ${this.describe()}`);
389
+ while (true) {
390
+ if (!(await this.isVisible({ timeout: 0 }))) {
391
+ return;
392
+ }
393
+ if (Date.now() - startTime >= timeout) {
394
+ break;
395
+ }
396
+ await new Promise((resolve) => setTimeout(resolve, 100));
397
+ }
398
+ throw E2EError.timeout(`Wait for hidden: ${this.describe()}`, timeout);
399
+ }
400
+ // Get bounding box
401
+ async boundingBox(options = {}) {
402
+ const timeout = options.timeout ?? this.defaultTimeout;
403
+ try {
404
+ if (this.selector.css) {
405
+ return await this.runCssAction('const rect = element.getBoundingClientRect(); return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };', 'Bounding box', timeout);
406
+ }
407
+ if (this.selector.label) {
408
+ return await this.runLabelAction('const rect = element.getBoundingClientRect(); return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };', 'Bounding box', timeout);
409
+ }
410
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Bounding box: ${this.describe()}`);
411
+ const result = await this.page.callTool('evaluate_script', {
412
+ pageId: this.page.getPageId(),
413
+ function: '(el) => { const rect = el.getBoundingClientRect(); return { x: rect.x, y: rect.y, width: rect.width, height: rect.height }; }',
414
+ args: [element.uid]
415
+ });
416
+ return result;
417
+ }
418
+ catch (error) {
419
+ this.rethrowIfFatal(error, 'Bounding box');
420
+ return null;
421
+ }
422
+ }
423
+ // Screenshot of element
424
+ async screenshot(options = {}) {
425
+ const timeout = options.timeout ?? this.defaultTimeout;
426
+ this.logger('debug', `Element screenshot: ${this.describe()}`);
427
+ const element = await this.withTimeout(this.page.resolve(this.selector), timeout, `Element screenshot: ${this.describe()}`);
428
+ return this.page.screenshotElement(element.uid, options);
429
+ }
430
+ /**
431
+ * Resolve this locator to a Chrome node uid.
432
+ *
433
+ * @internal
434
+ */
435
+ async resolve() {
436
+ return this.page.resolve(this.selector);
437
+ }
438
+ // Chaining: create new locator relative to this one
439
+ getByText(text, options) {
440
+ return new Locator(this.page, { ...this.selector, text, exact: options?.exact });
441
+ }
442
+ getByRole(role, options) {
443
+ return new Locator(this.page, { ...this.selector, role, name: options?.name, exact: options?.exact });
444
+ }
445
+ getByLabel(label, options) {
446
+ return new Locator(this.page, { ...this.selector, label, exact: options?.exact });
447
+ }
448
+ locator(selector) {
449
+ const css = this.selector.css ? `${this.selector.css} ${selector}` : selector;
450
+ return new Locator(this.page, { ...this.selector, css });
451
+ }
452
+ first() {
453
+ return this.nth(0);
454
+ }
455
+ nth(index) {
456
+ if (!Number.isInteger(index) || index < 0) {
457
+ throw E2EError.invalidArgument('index', 'non-negative integer', index);
458
+ }
459
+ return new Locator(this.page, { ...this.selector, index });
460
+ }
461
+ async count(options = {}) {
462
+ const timeout = options.timeout ?? this.defaultTimeout;
463
+ if (this.selector.css) {
464
+ return this.withTimeout(this.page.callTool('evaluate_script', {
465
+ pageId: this.page.getPageId(),
466
+ function: `() => document.querySelectorAll(${JSON.stringify(this.selector.css)}).length`,
467
+ waitForStableDom: false
468
+ }), timeout, `Count: ${this.describe()}`);
469
+ }
470
+ const snapshot = await this.withTimeout(this.page.snapshot(), timeout, `Count: ${this.describe()}`);
471
+ return this.countSnapshotMatches(snapshot);
472
+ }
473
+ async runCssAction(body, operation, timeout) {
474
+ if (!this.selector.css) {
475
+ throw E2EError.invalidArgument('selector', 'CSS selector', this.selector);
476
+ }
477
+ return this.page.evaluateLocator(this.selector, body, `${operation}: ${this.describe()}`, { timeout });
478
+ }
479
+ async runLabelAction(body, operation, timeout) {
480
+ if (!this.selector.label) {
481
+ throw E2EError.invalidArgument('selector', 'label selector', this.selector);
482
+ }
483
+ return this.page.evaluateLocator(this.selector, body, `${operation}: ${this.describe()}`, { timeout });
484
+ }
485
+ countSnapshotMatches(snapshot) {
486
+ return snapshot.nodes.filter((node) => {
487
+ if (this.selector.role && node.role === this.selector.role) {
488
+ return !this.selector.name || this.matchesText(node.name, this.selector.name);
489
+ }
490
+ if (this.selector.text && node.text) {
491
+ return this.matchesText(node.text, this.selector.text);
492
+ }
493
+ if (this.selector.label && node.attributes) {
494
+ const ariaLabel = node.attributes['aria-label'] || node.attributes['aria-labelledby'];
495
+ return this.matchesText(ariaLabel, this.selector.label);
496
+ }
497
+ return false;
498
+ }).length;
499
+ }
500
+ matchesText(actual, expected) {
501
+ if (!actual)
502
+ return false;
503
+ return this.selector.exact ? actual === expected : actual.includes(expected);
504
+ }
505
+ /**
506
+ * State checks such as `isVisible()` return `false` when the element cannot be
507
+ * reached, but genuine failures (MCP errors, closed pages) must not be masked.
508
+ */
509
+ rethrowIfFatal(error, operation) {
510
+ if (error instanceof E2EError) {
511
+ if (error.code === E2EErrorCode.ELEMENT_NOT_FOUND || error.code === E2EErrorCode.TIMEOUT) {
512
+ return;
513
+ }
514
+ throw error;
515
+ }
516
+ if (error instanceof Error) {
517
+ throw E2EError.mcpError(`${operation} failed: ${error.message}`, error);
518
+ }
519
+ }
520
+ async withTimeout(promise, ms, operation) {
521
+ let timeoutId;
522
+ const timeoutPromise = new Promise((_, reject) => {
523
+ timeoutId = setTimeout(() => reject(E2EError.timeout(operation, ms)), ms);
524
+ });
525
+ try {
526
+ return await Promise.race([promise, timeoutPromise]);
527
+ }
528
+ finally {
529
+ clearTimeout(timeoutId);
530
+ }
531
+ }
532
+ }
533
+ //# sourceMappingURL=Locator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Locator.js","sourceRoot":"","sources":["../../src/browser/Locator.ts"],"names":[],"mappings":"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"}