@olib-ai/owl-browser-sdk 2.0.4 → 2.0.6
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/README.md +107 -0
- package/dist/extraction/content-cleaner.d.ts +40 -0
- package/dist/extraction/content-cleaner.d.ts.map +1 -0
- package/dist/extraction/content-cleaner.js +393 -0
- package/dist/extraction/content-cleaner.js.map +1 -0
- package/dist/extraction/extractor.d.ts +139 -0
- package/dist/extraction/extractor.d.ts.map +1 -0
- package/dist/extraction/extractor.js +212 -0
- package/dist/extraction/extractor.js.map +1 -0
- package/dist/extraction/html-processor.d.ts +75 -0
- package/dist/extraction/html-processor.d.ts.map +1 -0
- package/dist/extraction/html-processor.js +192 -0
- package/dist/extraction/html-processor.js.map +1 -0
- package/dist/extraction/index.d.ts +14 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +19 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/list-extractor.d.ts +24 -0
- package/dist/extraction/list-extractor.d.ts.map +1 -0
- package/dist/extraction/list-extractor.js +303 -0
- package/dist/extraction/list-extractor.js.map +1 -0
- package/dist/extraction/meta-extractor.d.ts +40 -0
- package/dist/extraction/meta-extractor.d.ts.map +1 -0
- package/dist/extraction/meta-extractor.js +216 -0
- package/dist/extraction/meta-extractor.js.map +1 -0
- package/dist/extraction/pagination.d.ts +29 -0
- package/dist/extraction/pagination.d.ts.map +1 -0
- package/dist/extraction/pagination.js +323 -0
- package/dist/extraction/pagination.js.map +1 -0
- package/dist/extraction/pattern-detector.d.ts +16 -0
- package/dist/extraction/pattern-detector.d.ts.map +1 -0
- package/dist/extraction/pattern-detector.js +390 -0
- package/dist/extraction/pattern-detector.js.map +1 -0
- package/dist/extraction/scrape-session.d.ts +23 -0
- package/dist/extraction/scrape-session.d.ts.map +1 -0
- package/dist/extraction/scrape-session.js +192 -0
- package/dist/extraction/scrape-session.js.map +1 -0
- package/dist/extraction/selector-engine.d.ts +23 -0
- package/dist/extraction/selector-engine.d.ts.map +1 -0
- package/dist/extraction/selector-engine.js +127 -0
- package/dist/extraction/selector-engine.js.map +1 -0
- package/dist/extraction/table-extractor.d.ts +29 -0
- package/dist/extraction/table-extractor.d.ts.map +1 -0
- package/dist/extraction/table-extractor.js +282 -0
- package/dist/extraction/table-extractor.js.map +1 -0
- package/dist/extraction/transforms.d.ts +47 -0
- package/dist/extraction/transforms.d.ts.map +1 -0
- package/dist/extraction/transforms.js +277 -0
- package/dist/extraction/transforms.js.map +1 -0
- package/dist/extraction/types.d.ts +199 -0
- package/dist/extraction/types.d.ts.map +1 -0
- package/dist/extraction/types.js +5 -0
- package/dist/extraction/types.js.map +1 -0
- package/dist/flow/executor.js +1 -1
- package/dist/flow/executor.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/playwright/browser-type.d.ts +101 -0
- package/dist/playwright/browser-type.d.ts.map +1 -0
- package/dist/playwright/browser-type.js +134 -0
- package/dist/playwright/browser-type.js.map +1 -0
- package/dist/playwright/browser.d.ts +98 -0
- package/dist/playwright/browser.d.ts.map +1 -0
- package/dist/playwright/browser.js +229 -0
- package/dist/playwright/browser.js.map +1 -0
- package/dist/playwright/context.d.ts +211 -0
- package/dist/playwright/context.d.ts.map +1 -0
- package/dist/playwright/context.js +466 -0
- package/dist/playwright/context.js.map +1 -0
- package/dist/playwright/extractor.d.ts +108 -0
- package/dist/playwright/extractor.d.ts.map +1 -0
- package/dist/playwright/extractor.js +404 -0
- package/dist/playwright/extractor.js.map +1 -0
- package/dist/playwright/frame.d.ts +147 -0
- package/dist/playwright/frame.d.ts.map +1 -0
- package/dist/playwright/frame.js +492 -0
- package/dist/playwright/frame.js.map +1 -0
- package/dist/playwright/index.d.ts +163 -0
- package/dist/playwright/index.d.ts.map +1 -0
- package/dist/playwright/index.js +313 -0
- package/dist/playwright/index.js.map +1 -0
- package/dist/playwright/keyboard.d.ts +74 -0
- package/dist/playwright/keyboard.d.ts.map +1 -0
- package/dist/playwright/keyboard.js +187 -0
- package/dist/playwright/keyboard.js.map +1 -0
- package/dist/playwright/locator.d.ts +237 -0
- package/dist/playwright/locator.d.ts.map +1 -0
- package/dist/playwright/locator.js +646 -0
- package/dist/playwright/locator.js.map +1 -0
- package/dist/playwright/mouse.d.ts +82 -0
- package/dist/playwright/mouse.d.ts.map +1 -0
- package/dist/playwright/mouse.js +137 -0
- package/dist/playwright/mouse.js.map +1 -0
- package/dist/playwright/page-helpers.d.ts +261 -0
- package/dist/playwright/page-helpers.d.ts.map +1 -0
- package/dist/playwright/page-helpers.js +423 -0
- package/dist/playwright/page-helpers.js.map +1 -0
- package/dist/playwright/page.d.ts +566 -0
- package/dist/playwright/page.d.ts.map +1 -0
- package/dist/playwright/page.js +1476 -0
- package/dist/playwright/page.js.map +1 -0
- package/dist/playwright/response.d.ts +100 -0
- package/dist/playwright/response.d.ts.map +1 -0
- package/dist/playwright/response.js +194 -0
- package/dist/playwright/response.js.map +1 -0
- package/dist/playwright/types.d.ts +354 -0
- package/dist/playwright/types.d.ts.map +1 -0
- package/dist/playwright/types.js +8 -0
- package/dist/playwright/types.js.map +1 -0
- package/openapi.json +343 -36
- package/package.json +10 -1
|
@@ -0,0 +1,646 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright-compatible Locator class for Owl Browser.
|
|
3
|
+
*
|
|
4
|
+
* Locators are lazy element references that resolve at action time.
|
|
5
|
+
* They store a selector and delegate all operations to the parent Page,
|
|
6
|
+
* enabling the same retry and auto-waiting semantics as Playwright.
|
|
7
|
+
*
|
|
8
|
+
* Supports Playwright selector engine formats: text=, css=, xpath=,
|
|
9
|
+
* role=, data-testid=, placeholder=, alt=, title=, label=.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Convert a Playwright selector to a CSS/XPath selector that Owl understands.
|
|
13
|
+
*
|
|
14
|
+
* Playwright supports prefixed selectors like text=, css=, xpath=, role=, etc.
|
|
15
|
+
* This function converts those to standard CSS selectors or passes them as
|
|
16
|
+
* natural language descriptions to Owl's semantic matching.
|
|
17
|
+
*
|
|
18
|
+
* @param selector - Playwright-format selector
|
|
19
|
+
* @returns Transformed selector for Owl Browser
|
|
20
|
+
*/
|
|
21
|
+
export function convertSelector(selector) {
|
|
22
|
+
// text= prefix: find by text content (use as natural language description)
|
|
23
|
+
if (selector.startsWith('text=')) {
|
|
24
|
+
return selector.slice(5).replace(/^["']|["']$/g, '');
|
|
25
|
+
}
|
|
26
|
+
// css= prefix: standard CSS selector
|
|
27
|
+
if (selector.startsWith('css=')) {
|
|
28
|
+
return selector.slice(4);
|
|
29
|
+
}
|
|
30
|
+
// xpath= prefix: pass through for Owl's XPath support
|
|
31
|
+
if (selector.startsWith('xpath=')) {
|
|
32
|
+
return selector.slice(6);
|
|
33
|
+
}
|
|
34
|
+
// id= prefix: convert to CSS ID selector
|
|
35
|
+
if (selector.startsWith('id=')) {
|
|
36
|
+
return `#${selector.slice(3)}`;
|
|
37
|
+
}
|
|
38
|
+
// data-testid= prefix: convert to attribute selector
|
|
39
|
+
if (selector.startsWith('data-testid=')) {
|
|
40
|
+
const value = selector.slice(12).replace(/^["']|["']$/g, '');
|
|
41
|
+
return `[data-testid="${value}"]`;
|
|
42
|
+
}
|
|
43
|
+
// placeholder= prefix: convert to attribute selector
|
|
44
|
+
if (selector.startsWith('placeholder=')) {
|
|
45
|
+
const value = selector.slice(12).replace(/^["']|["']$/g, '');
|
|
46
|
+
return `[placeholder="${value}"]`;
|
|
47
|
+
}
|
|
48
|
+
// alt= prefix: convert to attribute selector
|
|
49
|
+
if (selector.startsWith('alt=')) {
|
|
50
|
+
const value = selector.slice(4).replace(/^["']|["']$/g, '');
|
|
51
|
+
return `[alt="${value}"]`;
|
|
52
|
+
}
|
|
53
|
+
// title= prefix: convert to attribute selector
|
|
54
|
+
if (selector.startsWith('title=')) {
|
|
55
|
+
const value = selector.slice(6).replace(/^["']|["']$/g, '');
|
|
56
|
+
return `[title="${value}"]`;
|
|
57
|
+
}
|
|
58
|
+
// label= prefix: use as natural language description
|
|
59
|
+
if (selector.startsWith('label=')) {
|
|
60
|
+
return selector.slice(6).replace(/^["']|["']$/g, '');
|
|
61
|
+
}
|
|
62
|
+
// role= prefix: convert to attribute selector with role name
|
|
63
|
+
// Playwright syntax: role=button[name="Save"]
|
|
64
|
+
if (selector.startsWith('role=')) {
|
|
65
|
+
const roleStr = selector.slice(5);
|
|
66
|
+
const bracketIdx = roleStr.indexOf('[');
|
|
67
|
+
if (bracketIdx === -1) {
|
|
68
|
+
return `[role="${roleStr}"]`;
|
|
69
|
+
}
|
|
70
|
+
const role = roleStr.slice(0, bracketIdx);
|
|
71
|
+
const attrs = roleStr.slice(bracketIdx);
|
|
72
|
+
// Extract name from [name="..."]
|
|
73
|
+
const nameMatch = attrs.match(/name=["']([^"']+)["']/);
|
|
74
|
+
if (nameMatch?.[1]) {
|
|
75
|
+
// Use role + name as natural language: "Save button"
|
|
76
|
+
return `${nameMatch[1]} ${role}`;
|
|
77
|
+
}
|
|
78
|
+
return `[role="${role}"]`;
|
|
79
|
+
}
|
|
80
|
+
// No prefix: return as-is (CSS selector or natural language)
|
|
81
|
+
return selector;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Locator represents a lazy reference to one or more DOM elements.
|
|
85
|
+
*
|
|
86
|
+
* All operations on a Locator are automatically retried until the element
|
|
87
|
+
* is available or the timeout expires. Locators can be chained to narrow
|
|
88
|
+
* the selection scope.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const button = page.locator('button.submit');
|
|
93
|
+
* await button.click();
|
|
94
|
+
*
|
|
95
|
+
* const text = await page.locator('.result').textContent();
|
|
96
|
+
* await page.locator('text=Sign In').click();
|
|
97
|
+
* await page.locator('[data-testid="submit"]').fill('hello');
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export class Locator {
|
|
101
|
+
/** @internal */
|
|
102
|
+
_page;
|
|
103
|
+
/** @internal */
|
|
104
|
+
_selector;
|
|
105
|
+
constructor(page, selector) {
|
|
106
|
+
this._page = page;
|
|
107
|
+
this._selector = convertSelector(selector);
|
|
108
|
+
}
|
|
109
|
+
// ==================== Actions ====================
|
|
110
|
+
/** Click the element. */
|
|
111
|
+
async click(options) {
|
|
112
|
+
await this._page.click(this._selector, options);
|
|
113
|
+
}
|
|
114
|
+
/** Double-click the element. */
|
|
115
|
+
async dblclick(options) {
|
|
116
|
+
await this._page.dblclick(this._selector, options);
|
|
117
|
+
}
|
|
118
|
+
/** Fill the element with text (clears existing content first). */
|
|
119
|
+
async fill(value, options) {
|
|
120
|
+
await this._page.fill(this._selector, value, options);
|
|
121
|
+
}
|
|
122
|
+
/** Type text into the element (does NOT clear existing content). */
|
|
123
|
+
async type(text, options) {
|
|
124
|
+
await this._page.type(this._selector, text, options);
|
|
125
|
+
}
|
|
126
|
+
/** Focus the element and press a key. */
|
|
127
|
+
async press(key, options) {
|
|
128
|
+
await this._page.press(this._selector, key, options);
|
|
129
|
+
}
|
|
130
|
+
/** Hover over the element. */
|
|
131
|
+
async hover(options) {
|
|
132
|
+
await this._page.hover(this._selector, options);
|
|
133
|
+
}
|
|
134
|
+
/** Focus the element. */
|
|
135
|
+
async focus(options) {
|
|
136
|
+
void options;
|
|
137
|
+
await this._page.focus(this._selector);
|
|
138
|
+
}
|
|
139
|
+
/** Check a checkbox (no-op if already checked). */
|
|
140
|
+
async check(options) {
|
|
141
|
+
await this._page.check(this._selector, options);
|
|
142
|
+
}
|
|
143
|
+
/** Uncheck a checkbox (no-op if already unchecked). */
|
|
144
|
+
async uncheck(options) {
|
|
145
|
+
await this._page.uncheck(this._selector, options);
|
|
146
|
+
}
|
|
147
|
+
/** Select an option from a dropdown. */
|
|
148
|
+
async selectOption(values, options) {
|
|
149
|
+
return this._page.selectOption(this._selector, values, options);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Upload files to a file input element.
|
|
153
|
+
*
|
|
154
|
+
* @param files - File path(s) to upload
|
|
155
|
+
* @param options - Upload options
|
|
156
|
+
*/
|
|
157
|
+
async setInputFiles(files, options) {
|
|
158
|
+
void options;
|
|
159
|
+
await this._page.setInputFiles(this._selector, files);
|
|
160
|
+
}
|
|
161
|
+
/** Select all text within the element. */
|
|
162
|
+
async selectText() {
|
|
163
|
+
await this._page._execute('browser_select_all', {
|
|
164
|
+
selector: this._selector,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Dispatch a DOM event on the element.
|
|
169
|
+
*
|
|
170
|
+
* @param type - Event type (e.g., 'click', 'input', 'change')
|
|
171
|
+
* @param eventInit - Event initialization properties
|
|
172
|
+
*/
|
|
173
|
+
async dispatchEvent(type, eventInit) {
|
|
174
|
+
await this._page._execute('browser_dispatch_event', {
|
|
175
|
+
selector: this._selector,
|
|
176
|
+
event_type: type,
|
|
177
|
+
bubbles: eventInit?.['bubbles'] !== false,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Scroll the element into view if not already visible.
|
|
182
|
+
*/
|
|
183
|
+
async scrollIntoViewIfNeeded() {
|
|
184
|
+
await this._page._execute('browser_scroll_to_element', {
|
|
185
|
+
selector: this._selector,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Highlight the element with a colored border for debugging.
|
|
190
|
+
*/
|
|
191
|
+
async highlight() {
|
|
192
|
+
await this._page._execute('browser_highlight', {
|
|
193
|
+
selector: this._selector,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// ==================== Queries ====================
|
|
197
|
+
/** Get the text content of the element. */
|
|
198
|
+
async textContent() {
|
|
199
|
+
return this._page.textContent(this._selector);
|
|
200
|
+
}
|
|
201
|
+
/** Get the inner HTML of the element. */
|
|
202
|
+
async innerHTML() {
|
|
203
|
+
return this._page.innerHTML(this._selector);
|
|
204
|
+
}
|
|
205
|
+
/** Get the inner text of the element (visible text only). */
|
|
206
|
+
async innerText() {
|
|
207
|
+
const text = await this._page.textContent(this._selector);
|
|
208
|
+
return text ?? '';
|
|
209
|
+
}
|
|
210
|
+
/** Get the value of an attribute. */
|
|
211
|
+
async getAttribute(name) {
|
|
212
|
+
return this._page.getAttribute(this._selector, name);
|
|
213
|
+
}
|
|
214
|
+
/** Get the input value. */
|
|
215
|
+
async inputValue() {
|
|
216
|
+
const result = await this._page._execute('browser_get_attribute', {
|
|
217
|
+
selector: this._selector,
|
|
218
|
+
attribute: 'value',
|
|
219
|
+
});
|
|
220
|
+
if (typeof result === 'string')
|
|
221
|
+
return result;
|
|
222
|
+
const res = result;
|
|
223
|
+
return String(res?.['value'] ?? '');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get the bounding box of the element.
|
|
227
|
+
*
|
|
228
|
+
* @returns Bounding box {x, y, width, height} or null if not visible
|
|
229
|
+
*/
|
|
230
|
+
async boundingBox() {
|
|
231
|
+
try {
|
|
232
|
+
const result = await this._page._execute('browser_get_bounding_box', {
|
|
233
|
+
selector: this._selector,
|
|
234
|
+
});
|
|
235
|
+
const res = result;
|
|
236
|
+
return {
|
|
237
|
+
x: Number(res['x'] ?? 0),
|
|
238
|
+
y: Number(res['y'] ?? 0),
|
|
239
|
+
width: Number(res['width'] ?? 0),
|
|
240
|
+
height: Number(res['height'] ?? 0),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get the count of elements matching this locator.
|
|
249
|
+
*
|
|
250
|
+
* Uses browser_count_elements for native element counting.
|
|
251
|
+
*
|
|
252
|
+
* @returns Number of matching elements
|
|
253
|
+
*/
|
|
254
|
+
async count() {
|
|
255
|
+
try {
|
|
256
|
+
const result = await this._page._execute('browser_count_elements', {
|
|
257
|
+
selector: this._selector,
|
|
258
|
+
});
|
|
259
|
+
if (typeof result === 'number')
|
|
260
|
+
return result;
|
|
261
|
+
if (result !== null && typeof result === 'object') {
|
|
262
|
+
const res = result;
|
|
263
|
+
// Browser returns count in error_code field as a string, or in count/total
|
|
264
|
+
const raw = res['error_code'] ?? res['count'] ?? res['total'];
|
|
265
|
+
if (raw !== undefined && raw !== null) {
|
|
266
|
+
const n = Number(raw);
|
|
267
|
+
if (!Number.isNaN(n))
|
|
268
|
+
return n;
|
|
269
|
+
}
|
|
270
|
+
// Fallback: extract from message "N element(s) matching ..."
|
|
271
|
+
const msg = String(res['message'] ?? '');
|
|
272
|
+
const match = msg.match(/^(\d+)\s+element/);
|
|
273
|
+
if (match?.[1])
|
|
274
|
+
return Number(match[1]);
|
|
275
|
+
}
|
|
276
|
+
const n = Number(result);
|
|
277
|
+
return Number.isNaN(n) ? 0 : n;
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return 0;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Resolve all matching elements to an array of locators.
|
|
285
|
+
*
|
|
286
|
+
* @returns Array of Locators, one per matching element
|
|
287
|
+
*/
|
|
288
|
+
async all() {
|
|
289
|
+
const n = await this.count();
|
|
290
|
+
const locators = [];
|
|
291
|
+
for (let i = 0; i < n; i++) {
|
|
292
|
+
locators.push(this.nth(i));
|
|
293
|
+
}
|
|
294
|
+
return locators;
|
|
295
|
+
}
|
|
296
|
+
// ==================== State ====================
|
|
297
|
+
/** Whether the element is visible. */
|
|
298
|
+
async isVisible() {
|
|
299
|
+
return this._page.isVisible(this._selector);
|
|
300
|
+
}
|
|
301
|
+
/** Whether the element is enabled. */
|
|
302
|
+
async isEnabled() {
|
|
303
|
+
return this._page.isEnabled(this._selector);
|
|
304
|
+
}
|
|
305
|
+
/** Whether the element (checkbox/radio) is checked. */
|
|
306
|
+
async isChecked() {
|
|
307
|
+
return this._page.isChecked(this._selector);
|
|
308
|
+
}
|
|
309
|
+
/** Whether the element is hidden. */
|
|
310
|
+
async isHidden() {
|
|
311
|
+
return !(await this._page.isVisible(this._selector));
|
|
312
|
+
}
|
|
313
|
+
/** Whether the element is disabled. */
|
|
314
|
+
async isDisabled() {
|
|
315
|
+
return !(await this._page.isEnabled(this._selector));
|
|
316
|
+
}
|
|
317
|
+
/** Whether the element is editable. */
|
|
318
|
+
async isEditable() {
|
|
319
|
+
const result = await this._page._execute('browser_is_editable', {
|
|
320
|
+
selector: this._selector,
|
|
321
|
+
});
|
|
322
|
+
const res = result;
|
|
323
|
+
return res['error_code'] === 'editable';
|
|
324
|
+
}
|
|
325
|
+
// ==================== Waiting ====================
|
|
326
|
+
/** Wait for the element to satisfy a condition. */
|
|
327
|
+
async waitFor(options) {
|
|
328
|
+
await this._page.waitForSelector(this._selector, {
|
|
329
|
+
state: options?.state,
|
|
330
|
+
timeout: options?.timeout,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
// ==================== Screenshots ====================
|
|
334
|
+
/** Take a screenshot of the element. */
|
|
335
|
+
async screenshot(options) {
|
|
336
|
+
return this._page.screenshot({
|
|
337
|
+
...options,
|
|
338
|
+
// Use element mode if available
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
// ==================== Evaluate ====================
|
|
342
|
+
/** Evaluate a function in the context of the matched element. */
|
|
343
|
+
async evaluate(pageFunction, arg) {
|
|
344
|
+
const escapedSelector = this._selector.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
345
|
+
const script = typeof pageFunction === 'function'
|
|
346
|
+
? `(() => { const el = document.querySelector('${escapedSelector}'); return (${pageFunction.toString()})(el${arg !== undefined ? `, ${JSON.stringify(arg)}` : ''}); })()`
|
|
347
|
+
: pageFunction;
|
|
348
|
+
return this._page.evaluate(script);
|
|
349
|
+
}
|
|
350
|
+
// ==================== Filtering & Chaining ====================
|
|
351
|
+
/**
|
|
352
|
+
* Filter this locator to only include elements matching additional criteria.
|
|
353
|
+
*
|
|
354
|
+
* @param options - Filter criteria (hasText, hasNotText)
|
|
355
|
+
* @returns A new filtered Locator
|
|
356
|
+
*/
|
|
357
|
+
filter(options) {
|
|
358
|
+
if (options?.hasText) {
|
|
359
|
+
const text = options.hasText instanceof RegExp
|
|
360
|
+
? options.hasText.source
|
|
361
|
+
: options.hasText;
|
|
362
|
+
// Use :has-text pseudo-class concept; fall back to combined selector
|
|
363
|
+
return new Locator(this._page, `${this._selector}:has-text("${text}")`);
|
|
364
|
+
}
|
|
365
|
+
return new Locator(this._page, this._selector);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Create a locator matching elements that match either this or the given locator.
|
|
369
|
+
*
|
|
370
|
+
* @param locator - Another locator to OR with
|
|
371
|
+
* @returns A new combined Locator
|
|
372
|
+
*/
|
|
373
|
+
or(locator) {
|
|
374
|
+
return new Locator(this._page, `${this._selector}, ${locator._selector}`);
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Create a locator matching elements that match both this AND the given locator.
|
|
378
|
+
*
|
|
379
|
+
* @param locator - Another locator to AND with
|
|
380
|
+
* @returns A new combined Locator
|
|
381
|
+
*/
|
|
382
|
+
and(locator) {
|
|
383
|
+
return new Locator(this._page, `${this._selector}${locator._selector}`);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Create a child locator by combining selectors.
|
|
387
|
+
*
|
|
388
|
+
* The resulting selector targets elements matching `selector`
|
|
389
|
+
* that are descendants of this locator's element.
|
|
390
|
+
*/
|
|
391
|
+
locator(selector) {
|
|
392
|
+
const converted = convertSelector(selector);
|
|
393
|
+
const combined = `${this._selector} ${converted}`;
|
|
394
|
+
return new Locator(this._page, combined);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Return a locator for the first matching element.
|
|
398
|
+
*
|
|
399
|
+
* Uses :first-of-type when the selector is a simple tag, otherwise
|
|
400
|
+
* appends :nth-of-type(1) as a best-effort CSS approximation.
|
|
401
|
+
* For evaluate-dependent lookups, uses nth(0) semantics.
|
|
402
|
+
*/
|
|
403
|
+
get first() {
|
|
404
|
+
// Construct an evaluate-based NthLocator wrapping the base selector
|
|
405
|
+
return new NthLocator(this._page, this._selector, 0);
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Return a locator for the last matching element.
|
|
409
|
+
*/
|
|
410
|
+
get last() {
|
|
411
|
+
return new NthLocator(this._page, this._selector, -1);
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Return a locator for the nth matching element (0-indexed).
|
|
415
|
+
*
|
|
416
|
+
* @param index - Zero-based index
|
|
417
|
+
*/
|
|
418
|
+
nth(index) {
|
|
419
|
+
return new NthLocator(this._page, this._selector, index);
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Get a locator for elements matching text content.
|
|
423
|
+
*
|
|
424
|
+
* @param text - Text to search for
|
|
425
|
+
* @returns A new Locator targeting elements with matching text
|
|
426
|
+
*/
|
|
427
|
+
getByText(text) {
|
|
428
|
+
const textStr = text instanceof RegExp ? text.source : text;
|
|
429
|
+
return new Locator(this._page, textStr);
|
|
430
|
+
}
|
|
431
|
+
/** Return the selector string this locator targets. */
|
|
432
|
+
toString() {
|
|
433
|
+
return `Locator(${this._selector})`;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* NthLocator wraps a base selector and an index.
|
|
438
|
+
*
|
|
439
|
+
* Uses the native `index` parameter supported by Owl Browser tools
|
|
440
|
+
* to target the Nth matching element without JavaScript evaluate hacks.
|
|
441
|
+
* When `index >= 0`, targets that specific match. When `index === -1`,
|
|
442
|
+
* targets the last match.
|
|
443
|
+
*/
|
|
444
|
+
export class NthLocator extends Locator {
|
|
445
|
+
_baseSelector;
|
|
446
|
+
_index; // -1 means "last"
|
|
447
|
+
constructor(page, baseSelector, index) {
|
|
448
|
+
super(page, baseSelector);
|
|
449
|
+
this._baseSelector = baseSelector;
|
|
450
|
+
this._index = index;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Execute a tool with the base selector and index parameter.
|
|
454
|
+
* @internal
|
|
455
|
+
*/
|
|
456
|
+
_nthExecute(toolName, params = {}) {
|
|
457
|
+
return this._page._execute(toolName, {
|
|
458
|
+
selector: this._baseSelector,
|
|
459
|
+
index: this._index,
|
|
460
|
+
...params,
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
async click(options) {
|
|
464
|
+
if (options?.button === 'right') {
|
|
465
|
+
await this._nthExecute('browser_right_click');
|
|
466
|
+
}
|
|
467
|
+
else if (options?.clickCount === 2) {
|
|
468
|
+
await this._nthExecute('browser_double_click');
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
await this._nthExecute('browser_click');
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
async dblclick(options) {
|
|
475
|
+
void options;
|
|
476
|
+
await this._nthExecute('browser_double_click');
|
|
477
|
+
}
|
|
478
|
+
async fill(value, options) {
|
|
479
|
+
void options;
|
|
480
|
+
await this._nthExecute('browser_clear_input');
|
|
481
|
+
await this._nthExecute('browser_type', { text: value });
|
|
482
|
+
}
|
|
483
|
+
async type(text, options) {
|
|
484
|
+
void options;
|
|
485
|
+
await this._nthExecute('browser_type', { text });
|
|
486
|
+
}
|
|
487
|
+
async press(key, options) {
|
|
488
|
+
void options;
|
|
489
|
+
await this._nthExecute('browser_focus');
|
|
490
|
+
await this._page.keyboard.press(key);
|
|
491
|
+
}
|
|
492
|
+
async hover(options) {
|
|
493
|
+
void options;
|
|
494
|
+
await this._nthExecute('browser_hover');
|
|
495
|
+
}
|
|
496
|
+
async focus(options) {
|
|
497
|
+
void options;
|
|
498
|
+
await this._nthExecute('browser_focus');
|
|
499
|
+
}
|
|
500
|
+
async check(options) {
|
|
501
|
+
void options;
|
|
502
|
+
const checked = await this.isChecked();
|
|
503
|
+
if (!checked) {
|
|
504
|
+
await this._nthExecute('browser_click');
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
async uncheck(options) {
|
|
508
|
+
void options;
|
|
509
|
+
const checked = await this.isChecked();
|
|
510
|
+
if (checked) {
|
|
511
|
+
await this._nthExecute('browser_click');
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
async textContent() {
|
|
515
|
+
const result = await this._nthExecute('browser_extract_text');
|
|
516
|
+
if (result === null || result === undefined)
|
|
517
|
+
return null;
|
|
518
|
+
if (typeof result === 'string')
|
|
519
|
+
return result;
|
|
520
|
+
const res = result;
|
|
521
|
+
return res['text'] ?? String(res['result'] ?? '');
|
|
522
|
+
}
|
|
523
|
+
async innerHTML() {
|
|
524
|
+
const result = await this._nthExecute('browser_get_html');
|
|
525
|
+
if (typeof result === 'string')
|
|
526
|
+
return result;
|
|
527
|
+
const res = result;
|
|
528
|
+
return String(res['html'] ?? res['result'] ?? '');
|
|
529
|
+
}
|
|
530
|
+
async innerText() {
|
|
531
|
+
const text = await this.textContent();
|
|
532
|
+
return text ?? '';
|
|
533
|
+
}
|
|
534
|
+
async inputValue() {
|
|
535
|
+
const result = await this._nthExecute('browser_get_attribute', {
|
|
536
|
+
attribute: 'value',
|
|
537
|
+
});
|
|
538
|
+
if (typeof result === 'string')
|
|
539
|
+
return result;
|
|
540
|
+
const res = result;
|
|
541
|
+
return String(res?.['value'] ?? '');
|
|
542
|
+
}
|
|
543
|
+
async isVisible() {
|
|
544
|
+
try {
|
|
545
|
+
const result = await this._nthExecute('browser_is_visible');
|
|
546
|
+
const res = result;
|
|
547
|
+
if (res['error_code'] === 'visible' || res['visible'] === true)
|
|
548
|
+
return true;
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
551
|
+
catch {
|
|
552
|
+
return false;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
async isChecked() {
|
|
556
|
+
try {
|
|
557
|
+
const result = await this._nthExecute('browser_is_checked');
|
|
558
|
+
const res = result;
|
|
559
|
+
if (res['error_code'] === 'checked' || res['checked'] === true)
|
|
560
|
+
return true;
|
|
561
|
+
return false;
|
|
562
|
+
}
|
|
563
|
+
catch {
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
async isEnabled() {
|
|
568
|
+
try {
|
|
569
|
+
const result = await this._nthExecute('browser_is_enabled');
|
|
570
|
+
const res = result;
|
|
571
|
+
if (res['error_code'] === 'enabled' || res['enabled'] === true)
|
|
572
|
+
return true;
|
|
573
|
+
return false;
|
|
574
|
+
}
|
|
575
|
+
catch {
|
|
576
|
+
return false;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
async isEditable() {
|
|
580
|
+
try {
|
|
581
|
+
const result = await this._nthExecute('browser_is_editable');
|
|
582
|
+
const res = result;
|
|
583
|
+
return res['error_code'] === 'editable';
|
|
584
|
+
}
|
|
585
|
+
catch {
|
|
586
|
+
return false;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
async getAttribute(name) {
|
|
590
|
+
const result = await this._nthExecute('browser_get_attribute', {
|
|
591
|
+
attribute: name,
|
|
592
|
+
});
|
|
593
|
+
if (result === null || result === undefined)
|
|
594
|
+
return null;
|
|
595
|
+
if (typeof result === 'string')
|
|
596
|
+
return result.length > 0 ? result : null;
|
|
597
|
+
const res = result;
|
|
598
|
+
const val = res['value'] ?? res['result'];
|
|
599
|
+
if (val === undefined || val === null)
|
|
600
|
+
return null;
|
|
601
|
+
return String(val);
|
|
602
|
+
}
|
|
603
|
+
async dispatchEvent(type, eventInit) {
|
|
604
|
+
await this._nthExecute('browser_dispatch_event', {
|
|
605
|
+
event_type: type,
|
|
606
|
+
bubbles: eventInit?.['bubbles'] !== false,
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
async boundingBox() {
|
|
610
|
+
try {
|
|
611
|
+
const result = await this._nthExecute('browser_get_bounding_box');
|
|
612
|
+
const res = result;
|
|
613
|
+
return {
|
|
614
|
+
x: Number(res['x'] ?? 0),
|
|
615
|
+
y: Number(res['y'] ?? 0),
|
|
616
|
+
width: Number(res['width'] ?? 0),
|
|
617
|
+
height: Number(res['height'] ?? 0),
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
catch {
|
|
621
|
+
return null;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
async scrollIntoViewIfNeeded() {
|
|
625
|
+
await this._nthExecute('browser_scroll_to_element');
|
|
626
|
+
}
|
|
627
|
+
async selectText() {
|
|
628
|
+
await this._nthExecute('browser_select_all');
|
|
629
|
+
}
|
|
630
|
+
async count() {
|
|
631
|
+
// Count uses the base selector (index is irrelevant for counting)
|
|
632
|
+
try {
|
|
633
|
+
const result = await this._page._execute('browser_count_elements', {
|
|
634
|
+
selector: this._baseSelector,
|
|
635
|
+
});
|
|
636
|
+
return typeof result === 'number' ? result : Number(result ?? 0);
|
|
637
|
+
}
|
|
638
|
+
catch {
|
|
639
|
+
return 0;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
toString() {
|
|
643
|
+
return `NthLocator(${this._baseSelector}[${this._index}])`;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
//# sourceMappingURL=locator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locator.js","sourceRoot":"","sources":["../../src/playwright/locator.ts"],"names":[],"mappings":"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"}
|