@olib-ai/owl-browser-sdk 2.0.5 → 2.0.7
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/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 +217 -0
- package/dist/playwright/context.d.ts.map +1 -0
- package/dist/playwright/context.js +518 -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 +667 -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 +267 -0
- package/dist/playwright/page-helpers.d.ts.map +1 -0
- package/dist/playwright/page-helpers.js +449 -0
- package/dist/playwright/page-helpers.js.map +1 -0
- package/dist/playwright/page.d.ts +605 -0
- package/dist/playwright/page.d.ts.map +1 -0
- package/dist/playwright/page.js +1698 -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 +327 -35
- package/package.json +10 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/playwright/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright-compatible BrowserContext class for Owl Browser.
|
|
3
|
+
*
|
|
4
|
+
* A BrowserContext maps to an Owl Browser context (created via browser_create_context).
|
|
5
|
+
* It provides isolated cookie/storage/session management, page (tab) creation,
|
|
6
|
+
* network interception, storage state, proxy configuration, and more.
|
|
7
|
+
*/
|
|
8
|
+
import { Page } from './page.js';
|
|
9
|
+
import { Route } from './page-helpers.js';
|
|
10
|
+
/**
|
|
11
|
+
* BrowserContext provides an isolated browser session.
|
|
12
|
+
*
|
|
13
|
+
* Each context has independent cookies, local storage, and session storage.
|
|
14
|
+
* Pages created within a context share these storage mechanisms.
|
|
15
|
+
* Supports network interception, storage state persistence, proxy configuration,
|
|
16
|
+
* geolocation override, and extra HTTP headers.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const context = await browser.newContext({
|
|
21
|
+
* viewport: { width: 1280, height: 720 },
|
|
22
|
+
* locale: 'en-US',
|
|
23
|
+
* timezoneId: 'America/New_York',
|
|
24
|
+
* });
|
|
25
|
+
* const page = await context.newPage();
|
|
26
|
+
* await page.goto('https://example.com');
|
|
27
|
+
* await context.close();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class BrowserContext {
|
|
31
|
+
_client;
|
|
32
|
+
_contextId;
|
|
33
|
+
_pages = [];
|
|
34
|
+
_browser;
|
|
35
|
+
_routes = [];
|
|
36
|
+
_closed = false;
|
|
37
|
+
_firstPageCreated = false;
|
|
38
|
+
constructor(client, contextId, browser) {
|
|
39
|
+
this._client = client;
|
|
40
|
+
this._contextId = contextId;
|
|
41
|
+
this._browser = browser;
|
|
42
|
+
}
|
|
43
|
+
/** The parent Browser instance. */
|
|
44
|
+
get browser() {
|
|
45
|
+
return this._browser;
|
|
46
|
+
}
|
|
47
|
+
/** The underlying Owl Browser context ID. */
|
|
48
|
+
get contextId() {
|
|
49
|
+
return this._contextId;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a new page (tab) in this context.
|
|
53
|
+
*
|
|
54
|
+
* The first call returns a Page wrapping the default tab that was
|
|
55
|
+
* created with the context. Subsequent calls create new tabs via
|
|
56
|
+
* browser_new_tab.
|
|
57
|
+
*
|
|
58
|
+
* @returns A new Page instance
|
|
59
|
+
*/
|
|
60
|
+
async newPage() {
|
|
61
|
+
if (!this._firstPageCreated) {
|
|
62
|
+
this._firstPageCreated = true;
|
|
63
|
+
const page = new Page(this._client, this._contextId);
|
|
64
|
+
this._pages.push(page);
|
|
65
|
+
return page;
|
|
66
|
+
}
|
|
67
|
+
// Create a new tab
|
|
68
|
+
const result = await this._client.execute('browser_new_tab', {
|
|
69
|
+
context_id: this._contextId,
|
|
70
|
+
});
|
|
71
|
+
const res = result;
|
|
72
|
+
const tabId = String(res['tab_id'] ?? res['id'] ?? '');
|
|
73
|
+
const page = new Page(this._client, this._contextId, tabId);
|
|
74
|
+
this._pages.push(page);
|
|
75
|
+
return page;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get all pages (tabs) in this context.
|
|
79
|
+
*
|
|
80
|
+
* @returns Array of Page instances created in this context
|
|
81
|
+
*/
|
|
82
|
+
pages() {
|
|
83
|
+
return [...this._pages];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Close the context and all its pages.
|
|
87
|
+
*
|
|
88
|
+
* Releases all resources associated with the context, including
|
|
89
|
+
* cookies, storage, network connections, and route handlers.
|
|
90
|
+
*/
|
|
91
|
+
async close() {
|
|
92
|
+
if (this._closed)
|
|
93
|
+
return;
|
|
94
|
+
this._closed = true;
|
|
95
|
+
// Clean up routes
|
|
96
|
+
for (const entry of this._routes) {
|
|
97
|
+
try {
|
|
98
|
+
await this._client.execute('browser_remove_network_rule', {
|
|
99
|
+
context_id: this._contextId,
|
|
100
|
+
rule_id: entry.ruleId,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Ignore cleanup errors
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
this._routes.length = 0;
|
|
108
|
+
await this._client.execute('browser_close_context', {
|
|
109
|
+
context_id: this._contextId,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// ==================== Cookies ====================
|
|
113
|
+
/**
|
|
114
|
+
* Get cookies for the context.
|
|
115
|
+
*
|
|
116
|
+
* @param urls - Optional URL(s) to filter cookies by
|
|
117
|
+
* @returns Array of cookies
|
|
118
|
+
*/
|
|
119
|
+
async cookies(urls) {
|
|
120
|
+
const params = {
|
|
121
|
+
context_id: this._contextId,
|
|
122
|
+
};
|
|
123
|
+
if (typeof urls === 'string') {
|
|
124
|
+
params['url'] = urls;
|
|
125
|
+
}
|
|
126
|
+
else if (Array.isArray(urls) && urls.length > 0) {
|
|
127
|
+
params['url'] = urls[0];
|
|
128
|
+
}
|
|
129
|
+
const result = await this._client.execute('browser_get_cookies', params);
|
|
130
|
+
// Result is a flat array of cookie objects (not wrapped in { cookies: [...] })
|
|
131
|
+
if (Array.isArray(result)) {
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
// Fallback: check if wrapped in an object
|
|
135
|
+
const res = result;
|
|
136
|
+
const cookies = res['cookies'];
|
|
137
|
+
if (Array.isArray(cookies)) {
|
|
138
|
+
return cookies;
|
|
139
|
+
}
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Add cookies to the context.
|
|
144
|
+
*
|
|
145
|
+
* @param cookies - Array of cookie objects to add
|
|
146
|
+
*/
|
|
147
|
+
async addCookies(cookies) {
|
|
148
|
+
for (const cookie of cookies) {
|
|
149
|
+
// Strip leading dot from domain for URL construction
|
|
150
|
+
const domain = (cookie.domain ?? 'localhost').replace(/^\./, '');
|
|
151
|
+
// Use https by default, http if secure is explicitly false
|
|
152
|
+
const proto = cookie.secure === false ? 'http' : 'https';
|
|
153
|
+
const params = {
|
|
154
|
+
context_id: this._contextId,
|
|
155
|
+
url: `${proto}://${domain}${cookie.path ?? '/'}`,
|
|
156
|
+
name: cookie.name,
|
|
157
|
+
value: cookie.value,
|
|
158
|
+
};
|
|
159
|
+
if (cookie.domain !== undefined)
|
|
160
|
+
params['domain'] = cookie.domain;
|
|
161
|
+
if (cookie.path !== undefined)
|
|
162
|
+
params['path'] = cookie.path;
|
|
163
|
+
if (cookie.expires !== undefined)
|
|
164
|
+
params['expires'] = String(cookie.expires);
|
|
165
|
+
if (cookie.httpOnly !== undefined)
|
|
166
|
+
params['httpOnly'] = cookie.httpOnly;
|
|
167
|
+
if (cookie.secure !== undefined)
|
|
168
|
+
params['secure'] = cookie.secure;
|
|
169
|
+
if (cookie.sameSite !== undefined)
|
|
170
|
+
params['sameSite'] = cookie.sameSite.toLowerCase();
|
|
171
|
+
await this._client.execute('browser_set_cookie', params);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Clear all cookies from the context.
|
|
176
|
+
*/
|
|
177
|
+
async clearCookies() {
|
|
178
|
+
await this._client.execute('browser_delete_cookies', {
|
|
179
|
+
context_id: this._contextId,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// ==================== Storage State ====================
|
|
183
|
+
/**
|
|
184
|
+
* Get the storage state (cookies and local storage origins).
|
|
185
|
+
*
|
|
186
|
+
* Use this to persist session state between runs.
|
|
187
|
+
*
|
|
188
|
+
* @param options - Optional path to save the state to
|
|
189
|
+
* @returns StorageState object
|
|
190
|
+
*/
|
|
191
|
+
async storageState(options) {
|
|
192
|
+
const cookies = await this.cookies();
|
|
193
|
+
// Try to get full profile state including fingerprint settings
|
|
194
|
+
let owlProfile;
|
|
195
|
+
try {
|
|
196
|
+
const profileResult = await this._client.execute('browser_get_profile', {
|
|
197
|
+
context_id: this._contextId,
|
|
198
|
+
});
|
|
199
|
+
if (profileResult && typeof profileResult === 'object') {
|
|
200
|
+
owlProfile = profileResult;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Profile retrieval not supported; continue with cookies only
|
|
205
|
+
}
|
|
206
|
+
const state = {
|
|
207
|
+
cookies,
|
|
208
|
+
origins: [],
|
|
209
|
+
};
|
|
210
|
+
// Store profile data under extension key for restore
|
|
211
|
+
if (owlProfile) {
|
|
212
|
+
state['_owlProfile'] = owlProfile;
|
|
213
|
+
}
|
|
214
|
+
if (options?.path) {
|
|
215
|
+
const { writeFile: fsWriteFile } = await import('node:fs/promises');
|
|
216
|
+
await fsWriteFile(options.path, JSON.stringify(state, null, 2));
|
|
217
|
+
}
|
|
218
|
+
return state;
|
|
219
|
+
}
|
|
220
|
+
// ==================== Network Interception ====================
|
|
221
|
+
/**
|
|
222
|
+
* Intercept network requests matching a URL pattern at the context level.
|
|
223
|
+
*
|
|
224
|
+
* @param url - URL pattern (glob) or RegExp to match
|
|
225
|
+
* @param handler - Handler function to process intercepted requests
|
|
226
|
+
* @param options - Route options (e.g., times)
|
|
227
|
+
*/
|
|
228
|
+
async route(url, handler, options) {
|
|
229
|
+
const urlPattern = url instanceof RegExp ? url.source : url;
|
|
230
|
+
await this._client.execute('browser_enable_network_interception', {
|
|
231
|
+
context_id: this._contextId,
|
|
232
|
+
enable: true,
|
|
233
|
+
});
|
|
234
|
+
const result = await this._client.execute('browser_add_network_rule', {
|
|
235
|
+
context_id: this._contextId,
|
|
236
|
+
url_pattern: urlPattern,
|
|
237
|
+
action: 'block',
|
|
238
|
+
is_regex: url instanceof RegExp,
|
|
239
|
+
});
|
|
240
|
+
const res = result;
|
|
241
|
+
const ruleId = String(res['rule_id'] ?? '');
|
|
242
|
+
this._routes.push({
|
|
243
|
+
urlPattern,
|
|
244
|
+
ruleId,
|
|
245
|
+
handler,
|
|
246
|
+
remaining: options?.times ?? null,
|
|
247
|
+
});
|
|
248
|
+
const route = new Route(this._client, this._contextId, ruleId, urlPattern);
|
|
249
|
+
await handler(route);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Remove a previously registered context-level route handler.
|
|
253
|
+
*
|
|
254
|
+
* @param url - URL pattern that was registered
|
|
255
|
+
* @param handler - Optional specific handler to remove
|
|
256
|
+
*/
|
|
257
|
+
async unroute(url, handler) {
|
|
258
|
+
const urlPattern = url instanceof RegExp ? url.source : url;
|
|
259
|
+
for (let i = this._routes.length - 1; i >= 0; i--) {
|
|
260
|
+
const entry = this._routes[i];
|
|
261
|
+
if (entry && entry.urlPattern === urlPattern) {
|
|
262
|
+
if (handler === undefined || entry.handler === handler) {
|
|
263
|
+
try {
|
|
264
|
+
await this._client.execute('browser_remove_network_rule', {
|
|
265
|
+
context_id: this._contextId,
|
|
266
|
+
rule_id: entry.ruleId,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Ignore
|
|
271
|
+
}
|
|
272
|
+
this._routes.splice(i, 1);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Remove all route handlers.
|
|
279
|
+
*/
|
|
280
|
+
async unrouteAll() {
|
|
281
|
+
for (const entry of this._routes) {
|
|
282
|
+
try {
|
|
283
|
+
await this._client.execute('browser_remove_network_rule', {
|
|
284
|
+
context_id: this._contextId,
|
|
285
|
+
rule_id: entry.ruleId,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// Ignore
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
this._routes.length = 0;
|
|
293
|
+
}
|
|
294
|
+
// ==================== Extra HTTP Headers ====================
|
|
295
|
+
/**
|
|
296
|
+
* Set extra HTTP headers for all requests in this context.
|
|
297
|
+
*
|
|
298
|
+
* No-op: Owl Browser does not support runtime header injection.
|
|
299
|
+
* Custom headers should be configured at context creation via VM profiles.
|
|
300
|
+
*
|
|
301
|
+
* @param headers - Object with header name/value pairs
|
|
302
|
+
*/
|
|
303
|
+
async setExtraHTTPHeaders(headers) {
|
|
304
|
+
void headers;
|
|
305
|
+
// Not supported — requires VM profile configuration at context creation
|
|
306
|
+
}
|
|
307
|
+
// ==================== Geolocation ====================
|
|
308
|
+
/**
|
|
309
|
+
* Set the geolocation for the context.
|
|
310
|
+
*
|
|
311
|
+
* No-op: Geolocation is configured at context creation via VM profiles
|
|
312
|
+
* in Owl Browser. Runtime geolocation changes are not supported.
|
|
313
|
+
*
|
|
314
|
+
* @param geolocation - Geolocation coordinates or null to clear
|
|
315
|
+
*/
|
|
316
|
+
async setGeolocation(geolocation) {
|
|
317
|
+
void geolocation;
|
|
318
|
+
// Not supported — requires VM profile configuration at context creation
|
|
319
|
+
}
|
|
320
|
+
// ==================== Permissions ====================
|
|
321
|
+
/**
|
|
322
|
+
* Grant permissions to the context.
|
|
323
|
+
*
|
|
324
|
+
* Stub: Browser permissions are managed at the profile level in Owl Browser.
|
|
325
|
+
*
|
|
326
|
+
* @param permissions - Array of permission names
|
|
327
|
+
* @param options - Optional origin filter
|
|
328
|
+
*/
|
|
329
|
+
async grantPermissions(permissions, options) {
|
|
330
|
+
void permissions;
|
|
331
|
+
void options;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Clear granted permissions.
|
|
335
|
+
*/
|
|
336
|
+
async clearPermissions() {
|
|
337
|
+
// Not directly supported in Owl Browser
|
|
338
|
+
}
|
|
339
|
+
// ==================== Offline ====================
|
|
340
|
+
/**
|
|
341
|
+
* Set the context to offline/online mode.
|
|
342
|
+
*
|
|
343
|
+
* @param offline - true to emulate offline, false for online
|
|
344
|
+
*/
|
|
345
|
+
async setOffline(offline) {
|
|
346
|
+
if (offline) {
|
|
347
|
+
// Block all network traffic by adding a catch-all block rule
|
|
348
|
+
await this._client.execute('browser_enable_network_interception', {
|
|
349
|
+
context_id: this._contextId,
|
|
350
|
+
enable: true,
|
|
351
|
+
});
|
|
352
|
+
await this._client.execute('browser_add_network_rule', {
|
|
353
|
+
context_id: this._contextId,
|
|
354
|
+
url_pattern: '*',
|
|
355
|
+
action: 'block',
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
// Remove the catch-all block rule
|
|
360
|
+
await this._client.execute('browser_enable_network_interception', {
|
|
361
|
+
context_id: this._contextId,
|
|
362
|
+
enable: false,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// ==================== Proxy ====================
|
|
367
|
+
/**
|
|
368
|
+
* Configure proxy settings for this context.
|
|
369
|
+
*
|
|
370
|
+
* @param proxy - Proxy configuration
|
|
371
|
+
*/
|
|
372
|
+
async setProxy(proxy) {
|
|
373
|
+
try {
|
|
374
|
+
const proxyUrl = new URL(proxy.server);
|
|
375
|
+
const params = {
|
|
376
|
+
context_id: this._contextId,
|
|
377
|
+
type: proxyUrl.protocol.replace(':', ''),
|
|
378
|
+
host: proxyUrl.hostname,
|
|
379
|
+
port: proxyUrl.port,
|
|
380
|
+
};
|
|
381
|
+
if (proxy.username)
|
|
382
|
+
params['username'] = proxy.username;
|
|
383
|
+
if (proxy.password)
|
|
384
|
+
params['password'] = proxy.password;
|
|
385
|
+
await this._client.execute('browser_set_proxy', params);
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
// Invalid URL, pass host directly
|
|
389
|
+
await this._client.execute('browser_set_proxy', {
|
|
390
|
+
context_id: this._contextId,
|
|
391
|
+
host: proxy.server,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// ==================== Init Scripts ====================
|
|
396
|
+
/**
|
|
397
|
+
* Add a script that runs in every page before any other script.
|
|
398
|
+
*
|
|
399
|
+
* @param script - JavaScript code or script path
|
|
400
|
+
* @param arg - Optional argument
|
|
401
|
+
*/
|
|
402
|
+
async addInitScript(script, arg) {
|
|
403
|
+
void arg;
|
|
404
|
+
const code = typeof script === 'string' ? script : '';
|
|
405
|
+
if (code) {
|
|
406
|
+
// Execute in the current page; subsequent pages will need re-injection
|
|
407
|
+
await this._client.execute('browser_evaluate', {
|
|
408
|
+
context_id: this._contextId,
|
|
409
|
+
script: code,
|
|
410
|
+
return_value: false,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Expose a function to all pages in this context.
|
|
416
|
+
*
|
|
417
|
+
* @param name - Global function name
|
|
418
|
+
* @param callback - Function implementation
|
|
419
|
+
*/
|
|
420
|
+
async exposeFunction(name, callback) {
|
|
421
|
+
void callback;
|
|
422
|
+
await this._client.execute('browser_evaluate', {
|
|
423
|
+
context_id: this._contextId,
|
|
424
|
+
script: `window['${name}'] = function() { console.log('${name} called', ...arguments); }`,
|
|
425
|
+
return_value: false,
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
// ==================== Events ====================
|
|
429
|
+
/**
|
|
430
|
+
* Register a context-level event handler.
|
|
431
|
+
*
|
|
432
|
+
* @param event - Event name ('page', 'close', etc.)
|
|
433
|
+
* @param handler - Event handler function
|
|
434
|
+
*/
|
|
435
|
+
on(event, handler) {
|
|
436
|
+
void event;
|
|
437
|
+
void handler;
|
|
438
|
+
// Context-level events require WebSocket push notifications
|
|
439
|
+
// which Owl Browser handles via polling
|
|
440
|
+
return this;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Register a one-time context-level event handler.
|
|
444
|
+
*
|
|
445
|
+
* @param event - Event name
|
|
446
|
+
* @param handler - Event handler function
|
|
447
|
+
*/
|
|
448
|
+
once(event, handler) {
|
|
449
|
+
void event;
|
|
450
|
+
void handler;
|
|
451
|
+
return this;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Wait for a context-level event.
|
|
455
|
+
*
|
|
456
|
+
* @param event - Event name (e.g., 'page')
|
|
457
|
+
* @param options - Wait options
|
|
458
|
+
* @returns Event data
|
|
459
|
+
*/
|
|
460
|
+
async waitForEvent(event, options) {
|
|
461
|
+
const timeout = options?.timeout ?? 30000;
|
|
462
|
+
if (event === 'page') {
|
|
463
|
+
// Set popup policy to new_tab so popups create tabs
|
|
464
|
+
try {
|
|
465
|
+
await this._client.execute('browser_set_popup_policy', {
|
|
466
|
+
context_id: this._contextId,
|
|
467
|
+
policy: 'new_tab',
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
// May not be supported; continue
|
|
472
|
+
}
|
|
473
|
+
// Snapshot current tabs
|
|
474
|
+
const beforeResult = await this._client.execute('browser_get_tabs', {
|
|
475
|
+
context_id: this._contextId,
|
|
476
|
+
});
|
|
477
|
+
const beforeRes = beforeResult;
|
|
478
|
+
const beforeTabs = (beforeRes['tabs'] ?? []);
|
|
479
|
+
const beforeIds = new Set(beforeTabs.map((t) => String(t['tab_id'] ?? t['id'] ?? '')));
|
|
480
|
+
// Poll for new tab
|
|
481
|
+
const start = Date.now();
|
|
482
|
+
while (Date.now() - start < timeout) {
|
|
483
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
484
|
+
const afterResult = await this._client.execute('browser_get_tabs', {
|
|
485
|
+
context_id: this._contextId,
|
|
486
|
+
});
|
|
487
|
+
const afterRes = afterResult;
|
|
488
|
+
const afterTabs = (afterRes['tabs'] ?? []);
|
|
489
|
+
for (const tab of afterTabs) {
|
|
490
|
+
const tabId = String(tab['tab_id'] ?? tab['id'] ?? '');
|
|
491
|
+
if (tabId && !beforeIds.has(tabId)) {
|
|
492
|
+
const page = new Page(this._client, this._contextId, tabId);
|
|
493
|
+
this._pages.push(page);
|
|
494
|
+
return page;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
throw new Error(`Timeout waiting for new page (${timeout}ms)`);
|
|
499
|
+
}
|
|
500
|
+
// Generic wait fallback
|
|
501
|
+
await new Promise((r) => setTimeout(r, Math.min(timeout, 1000)));
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
// ==================== Tracing ====================
|
|
505
|
+
/**
|
|
506
|
+
* Tracing interface stub.
|
|
507
|
+
*
|
|
508
|
+
* Owl Browser does not support Playwright tracing, but provides
|
|
509
|
+
* a compatible API surface to prevent errors in migrated code.
|
|
510
|
+
*/
|
|
511
|
+
get tracing() {
|
|
512
|
+
return {
|
|
513
|
+
start: async (_options) => { },
|
|
514
|
+
stop: async (_options) => { },
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/playwright/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-driven HTML data extraction using cheerio.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions for extracting structured data from HTML strings using
|
|
5
|
+
* a declarative field schema. No side effects, no browser interaction.
|
|
6
|
+
*
|
|
7
|
+
* String field syntax (backward compatible):
|
|
8
|
+
* "selector" -> textContent of the matched element
|
|
9
|
+
* "selector@attr" -> attribute value of the matched element
|
|
10
|
+
* "@attr" -> attribute value of the container itself
|
|
11
|
+
*
|
|
12
|
+
* Object field specs add: type coercion, regex, transforms, nested
|
|
13
|
+
* extraction, multi-value collection, and defaults.
|
|
14
|
+
*/
|
|
15
|
+
/** Built-in transform names. */
|
|
16
|
+
export type Transform = 'trim' | 'lowercase' | 'uppercase' | 'number' | 'clean' | 'slug';
|
|
17
|
+
/** Object-based field spec for advanced extraction. */
|
|
18
|
+
export interface ObjectFieldSpec {
|
|
19
|
+
/** CSS selector (default: container itself). */
|
|
20
|
+
selector?: string;
|
|
21
|
+
/** Attribute to extract (default: textContent). */
|
|
22
|
+
attribute?: string;
|
|
23
|
+
/** Return string[] of ALL matches, not just first. */
|
|
24
|
+
all?: boolean;
|
|
25
|
+
/** Type coercion: 'text' (default), 'number', 'html', 'innerHtml'. */
|
|
26
|
+
type?: 'text' | 'number' | 'html' | 'innerHtml';
|
|
27
|
+
/** Regex pattern to apply on extracted text. */
|
|
28
|
+
pattern?: string;
|
|
29
|
+
/** Capture group index (default: 0 = full match). */
|
|
30
|
+
group?: number;
|
|
31
|
+
/** Transform pipeline applied after extraction. */
|
|
32
|
+
transform?: Transform | Transform[];
|
|
33
|
+
/** Fallback value when extraction returns null. */
|
|
34
|
+
default?: string | number | null;
|
|
35
|
+
/** Nested extraction: extract sub-items within each container. */
|
|
36
|
+
nested?: {
|
|
37
|
+
selector: string;
|
|
38
|
+
fields: Record<string, FieldSpec>;
|
|
39
|
+
limit?: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** A field spec is either a string shorthand or an object spec. */
|
|
43
|
+
export type FieldSpec = string | ObjectFieldSpec;
|
|
44
|
+
/** Extracted record — values can be string, number, null, string[], or nested records. */
|
|
45
|
+
export type ExtractedRecord = Record<string, unknown>;
|
|
46
|
+
/** Meta tag extraction result. */
|
|
47
|
+
export interface MetaData {
|
|
48
|
+
title: string | null;
|
|
49
|
+
description: string | null;
|
|
50
|
+
canonical: string | null;
|
|
51
|
+
og: Record<string, string>;
|
|
52
|
+
twitter: Record<string, string>;
|
|
53
|
+
other: Record<string, string>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Extract structured data from all elements matching containerSelector.
|
|
57
|
+
*
|
|
58
|
+
* @param html - Raw HTML string to parse
|
|
59
|
+
* @param containerSelector - CSS selector for repeating container elements
|
|
60
|
+
* @param fields - Mapping of output field names to extraction specs
|
|
61
|
+
* @returns Array of objects, one per matched container
|
|
62
|
+
*/
|
|
63
|
+
export declare function queryAll(html: string, containerSelector: string, fields: Record<string, FieldSpec>): ExtractedRecord[];
|
|
64
|
+
/**
|
|
65
|
+
* Extract structured data from the first element matching containerSelector.
|
|
66
|
+
*
|
|
67
|
+
* @param html - Raw HTML string to parse
|
|
68
|
+
* @param containerSelector - CSS selector for the container element
|
|
69
|
+
* @param fields - Mapping of output field names to extraction specs
|
|
70
|
+
* @returns Single record or null if no match
|
|
71
|
+
*/
|
|
72
|
+
export declare function queryFirst(html: string, containerSelector: string, fields: Record<string, FieldSpec>): ExtractedRecord | null;
|
|
73
|
+
/**
|
|
74
|
+
* Extract a <table> as an array of records.
|
|
75
|
+
*
|
|
76
|
+
* Auto-detects headers from <th> or the first row. Handles colspan/rowspan.
|
|
77
|
+
*
|
|
78
|
+
* @param html - Raw HTML string
|
|
79
|
+
* @param selector - CSS selector for the table (default: 'table')
|
|
80
|
+
* @param options - Optional headers override
|
|
81
|
+
* @returns Array of records with header keys
|
|
82
|
+
*/
|
|
83
|
+
export declare function extractTable(html: string, selector?: string, options?: {
|
|
84
|
+
headers?: string[];
|
|
85
|
+
}): ExtractedRecord[];
|
|
86
|
+
/**
|
|
87
|
+
* Extract meta tags from HTML.
|
|
88
|
+
*
|
|
89
|
+
* @param html - Raw HTML string
|
|
90
|
+
* @returns MetaData with title, description, canonical, og, twitter, and other meta tags
|
|
91
|
+
*/
|
|
92
|
+
export declare function extractMeta(html: string): MetaData;
|
|
93
|
+
/**
|
|
94
|
+
* Extract JSON-LD structured data from HTML.
|
|
95
|
+
*
|
|
96
|
+
* @param html - Raw HTML string
|
|
97
|
+
* @returns Array of parsed JSON-LD objects
|
|
98
|
+
*/
|
|
99
|
+
export declare function extractStructuredData(html: string): object[];
|
|
100
|
+
/**
|
|
101
|
+
* Count elements matching a CSS selector.
|
|
102
|
+
*
|
|
103
|
+
* @param html - Raw HTML string
|
|
104
|
+
* @param selector - CSS selector
|
|
105
|
+
* @returns Number of matching elements
|
|
106
|
+
*/
|
|
107
|
+
export declare function countElements(html: string, selector: string): number;
|
|
108
|
+
//# sourceMappingURL=extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/playwright/extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,gCAAgC;AAChC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzF,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAChD,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;IACpC,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,kEAAkE;IAClE,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,mEAAmE;AACnE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,eAAe,CAAC;AAEjD,0FAA0F;AAC1F,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,kCAAkC;AAClC,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAID;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAChC,eAAe,EAAE,CASnB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAChC,eAAe,GAAG,IAAI,CAKxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAgB,EAC1B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/B,eAAe,EAAE,CA6EnB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CA2ClD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB5D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpE"}
|