@framers/agentos-ext-stealth-browser 1.0.0 → 1.1.0
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/LICENSE +96 -21
- package/dist/StealthBrowserService.d.ts +101 -0
- package/dist/StealthBrowserService.d.ts.map +1 -0
- package/dist/StealthBrowserService.js +558 -0
- package/dist/StealthBrowserService.js.map +1 -0
- package/dist/index.d.ts +115 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +139 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/click.d.ts +39 -0
- package/dist/tools/click.d.ts.map +1 -0
- package/dist/tools/click.js +72 -0
- package/dist/tools/click.js.map +1 -0
- package/dist/tools/navigate.d.ts +43 -0
- package/dist/tools/navigate.d.ts.map +1 -0
- package/dist/tools/navigate.js +142 -0
- package/dist/tools/navigate.js.map +1 -0
- package/dist/tools/scrape.d.ts +40 -0
- package/dist/tools/scrape.d.ts.map +1 -0
- package/dist/tools/scrape.js +88 -0
- package/dist/tools/scrape.js.map +1 -0
- package/dist/tools/screenshot.d.ts +41 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +85 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/snapshot.d.ts +39 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/snapshot.js +68 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/type.d.ts +41 -0
- package/dist/tools/type.d.ts.map +1 -0
- package/dist/tools/type.js +88 -0
- package/dist/tools/type.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/manifest.json +3 -3
- package/package.json +10 -6
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* Stealth Browser Service
|
|
4
|
+
*
|
|
5
|
+
* Manages browser lifecycle using puppeteer-extra with the stealth plugin
|
|
6
|
+
* to bypass anti-bot detection on protected sites (Amazon, eBay, LinkedIn, etc.).
|
|
7
|
+
*
|
|
8
|
+
* The stealth plugin handles:
|
|
9
|
+
* - navigator.webdriver removal
|
|
10
|
+
* - chrome.runtime injection
|
|
11
|
+
* - iframe contentWindow proxy
|
|
12
|
+
* - media codecs spoofing
|
|
13
|
+
* - navigator.plugins injection
|
|
14
|
+
* - WebGL vendor spoofing
|
|
15
|
+
* - navigator.languages injection
|
|
16
|
+
* - window.chrome injection
|
|
17
|
+
* - Permission API spoofing
|
|
18
|
+
*
|
|
19
|
+
* @module @framers/agentos-ext-stealth-browser
|
|
20
|
+
*/
|
|
21
|
+
// Dynamic imports for puppeteer-extra and plugins
|
|
22
|
+
let puppeteerExtra = null;
|
|
23
|
+
let StealthPlugin = null;
|
|
24
|
+
let cheerio = null;
|
|
25
|
+
/**
|
|
26
|
+
* Lazy load puppeteer-extra
|
|
27
|
+
*/
|
|
28
|
+
async function getPuppeteerExtra() {
|
|
29
|
+
if (!puppeteerExtra) {
|
|
30
|
+
puppeteerExtra = (await import('puppeteer-extra')).default;
|
|
31
|
+
}
|
|
32
|
+
return puppeteerExtra;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Lazy load stealth plugin
|
|
36
|
+
*/
|
|
37
|
+
async function getStealthPlugin() {
|
|
38
|
+
if (!StealthPlugin) {
|
|
39
|
+
const mod = await import('puppeteer-extra-plugin-stealth');
|
|
40
|
+
StealthPlugin = mod.default || mod;
|
|
41
|
+
}
|
|
42
|
+
return StealthPlugin;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Lazy load cheerio for HTML parsing
|
|
46
|
+
*/
|
|
47
|
+
async function getCheerio() {
|
|
48
|
+
if (!cheerio) {
|
|
49
|
+
cheerio = await import('cheerio');
|
|
50
|
+
}
|
|
51
|
+
return cheerio;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Realistic user agents for rotation.
|
|
55
|
+
* Chrome 120+ on macOS and Windows to match common browser fingerprints.
|
|
56
|
+
*/
|
|
57
|
+
const USER_AGENTS = [
|
|
58
|
+
// Chrome 120 on macOS Sonoma
|
|
59
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
60
|
+
// Chrome 121 on macOS Sonoma
|
|
61
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
|
|
62
|
+
// Chrome 122 on macOS Sonoma
|
|
63
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
|
|
64
|
+
// Chrome 120 on Windows 11
|
|
65
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
66
|
+
// Chrome 121 on Windows 11
|
|
67
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
|
|
68
|
+
// Chrome 122 on Windows 11
|
|
69
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
|
|
70
|
+
// Chrome 123 on macOS
|
|
71
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
|
|
72
|
+
// Chrome 123 on Windows
|
|
73
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
|
|
74
|
+
];
|
|
75
|
+
/**
|
|
76
|
+
* Select a random user agent from the pool
|
|
77
|
+
*/
|
|
78
|
+
function getRandomUserAgent() {
|
|
79
|
+
return USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Stealth browser service for managing anti-detection browser automation.
|
|
83
|
+
*
|
|
84
|
+
* Uses puppeteer-extra with the stealth plugin for comprehensive
|
|
85
|
+
* anti-fingerprinting and bot-detection bypass.
|
|
86
|
+
*/
|
|
87
|
+
export class StealthBrowserService {
|
|
88
|
+
browser = null;
|
|
89
|
+
page = null;
|
|
90
|
+
config;
|
|
91
|
+
consoleMessages = [];
|
|
92
|
+
stealthInitialized = false;
|
|
93
|
+
constructor(config = {}) {
|
|
94
|
+
this.config = {
|
|
95
|
+
headless: true,
|
|
96
|
+
timeout: 30000,
|
|
97
|
+
viewport: { width: 1920, height: 1080 },
|
|
98
|
+
enableEvasions: true,
|
|
99
|
+
...config,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Initialize stealth browser instance.
|
|
104
|
+
*
|
|
105
|
+
* Applies the stealth plugin to puppeteer-extra, then launches with
|
|
106
|
+
* extra anti-detection Chromium flags and a realistic user agent.
|
|
107
|
+
*/
|
|
108
|
+
async initialize() {
|
|
109
|
+
if (this.browser)
|
|
110
|
+
return;
|
|
111
|
+
const pptr = await getPuppeteerExtra();
|
|
112
|
+
const StealthPluginFactory = await getStealthPlugin();
|
|
113
|
+
// Apply stealth plugin once
|
|
114
|
+
if (!this.stealthInitialized && this.config.enableEvasions !== false) {
|
|
115
|
+
pptr.use(StealthPluginFactory());
|
|
116
|
+
this.stealthInitialized = true;
|
|
117
|
+
}
|
|
118
|
+
// Find Chrome/Chromium executable
|
|
119
|
+
const executablePath = this.config.executablePath || this.findChromePath();
|
|
120
|
+
// Select user agent (custom or random from pool)
|
|
121
|
+
const userAgent = this.config.userAgent || getRandomUserAgent();
|
|
122
|
+
this.browser = await pptr.launch({
|
|
123
|
+
headless: this.config.headless ? 'new' : false,
|
|
124
|
+
executablePath,
|
|
125
|
+
args: [
|
|
126
|
+
// Sandbox / stability
|
|
127
|
+
'--no-sandbox',
|
|
128
|
+
'--disable-setuid-sandbox',
|
|
129
|
+
'--disable-dev-shm-usage',
|
|
130
|
+
// Anti-detection flags
|
|
131
|
+
'--disable-blink-features=AutomationControlled',
|
|
132
|
+
'--disable-infobars',
|
|
133
|
+
// Realistic window size
|
|
134
|
+
'--window-size=1920,1080',
|
|
135
|
+
// Reduce fingerprint surface
|
|
136
|
+
'--disable-features=IsolateOrigins,site-per-process',
|
|
137
|
+
'--disable-web-security',
|
|
138
|
+
'--allow-running-insecure-content',
|
|
139
|
+
// GPU / rendering
|
|
140
|
+
'--disable-gpu',
|
|
141
|
+
'--disable-software-rasterizer',
|
|
142
|
+
],
|
|
143
|
+
ignoreDefaultArgs: ['--enable-automation'],
|
|
144
|
+
});
|
|
145
|
+
this.page = await this.browser.newPage();
|
|
146
|
+
// Set viewport
|
|
147
|
+
if (this.config.viewport) {
|
|
148
|
+
await this.page.setViewport(this.config.viewport);
|
|
149
|
+
}
|
|
150
|
+
// Set realistic user agent
|
|
151
|
+
await this.page.setUserAgent(userAgent);
|
|
152
|
+
// Remove webdriver property via page evaluate
|
|
153
|
+
await this.page.evaluateOnNewDocument(() => {
|
|
154
|
+
// Override navigator.webdriver
|
|
155
|
+
Object.defineProperty(navigator, 'webdriver', {
|
|
156
|
+
get: () => undefined,
|
|
157
|
+
});
|
|
158
|
+
// Override navigator.plugins to report realistic plugins
|
|
159
|
+
Object.defineProperty(navigator, 'plugins', {
|
|
160
|
+
get: () => [
|
|
161
|
+
{ name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' },
|
|
162
|
+
{ name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai' },
|
|
163
|
+
{ name: 'Native Client', filename: 'internal-nacl-plugin' },
|
|
164
|
+
],
|
|
165
|
+
});
|
|
166
|
+
// Override navigator.languages
|
|
167
|
+
Object.defineProperty(navigator, 'languages', {
|
|
168
|
+
get: () => ['en-US', 'en'],
|
|
169
|
+
});
|
|
170
|
+
// Ensure chrome runtime exists (some detectors check for it)
|
|
171
|
+
if (!window.chrome) {
|
|
172
|
+
window.chrome = {
|
|
173
|
+
runtime: {
|
|
174
|
+
onMessage: { addListener: () => { }, removeListener: () => { } },
|
|
175
|
+
sendMessage: () => { },
|
|
176
|
+
connect: () => { },
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// Override permissions API to report realistic values
|
|
181
|
+
const originalQuery = window.navigator.permissions?.query;
|
|
182
|
+
if (originalQuery) {
|
|
183
|
+
window.navigator.permissions.query = (parameters) => {
|
|
184
|
+
if (parameters.name === 'notifications') {
|
|
185
|
+
return Promise.resolve({ state: Notification.permission });
|
|
186
|
+
}
|
|
187
|
+
return originalQuery(parameters);
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
// Set extra HTTP headers for stealth
|
|
192
|
+
await this.page.setExtraHTTPHeaders({
|
|
193
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
194
|
+
'Accept-Encoding': 'gzip, deflate, br',
|
|
195
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
|
|
196
|
+
'Sec-Fetch-Dest': 'document',
|
|
197
|
+
'Sec-Fetch-Mode': 'navigate',
|
|
198
|
+
'Sec-Fetch-Site': 'none',
|
|
199
|
+
'Sec-Fetch-User': '?1',
|
|
200
|
+
'Upgrade-Insecure-Requests': '1',
|
|
201
|
+
});
|
|
202
|
+
// Capture console messages
|
|
203
|
+
this.page.on('console', (msg) => {
|
|
204
|
+
this.consoleMessages.push(`[${msg.type()}] ${msg.text()}`);
|
|
205
|
+
// Keep only last 100 messages
|
|
206
|
+
if (this.consoleMessages.length > 100) {
|
|
207
|
+
this.consoleMessages.shift();
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Find Chrome executable path based on OS
|
|
213
|
+
*/
|
|
214
|
+
findChromePath() {
|
|
215
|
+
const platform = process.platform;
|
|
216
|
+
if (platform === 'win32') {
|
|
217
|
+
return 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe';
|
|
218
|
+
}
|
|
219
|
+
else if (platform === 'darwin') {
|
|
220
|
+
return '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome';
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// Linux
|
|
224
|
+
return '/usr/bin/google-chrome';
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Navigate to a URL with stealth protections active.
|
|
229
|
+
*/
|
|
230
|
+
async navigate(url, options) {
|
|
231
|
+
await this.initialize();
|
|
232
|
+
const startTime = Date.now();
|
|
233
|
+
this.consoleMessages = [];
|
|
234
|
+
try {
|
|
235
|
+
const response = await this.page.goto(url, {
|
|
236
|
+
waitUntil: options?.waitFor || 'networkidle2',
|
|
237
|
+
timeout: this.config.timeout,
|
|
238
|
+
});
|
|
239
|
+
const loadTime = Date.now() - startTime;
|
|
240
|
+
const [title, html, text] = await Promise.all([
|
|
241
|
+
this.page.title(),
|
|
242
|
+
this.page.content(),
|
|
243
|
+
this.page.evaluate(() => document.body?.innerText || ''),
|
|
244
|
+
]);
|
|
245
|
+
return {
|
|
246
|
+
url: this.page.url(),
|
|
247
|
+
status: response?.status() || 200,
|
|
248
|
+
title,
|
|
249
|
+
html,
|
|
250
|
+
text,
|
|
251
|
+
loadTime,
|
|
252
|
+
consoleMessages: [...this.consoleMessages],
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
const loadTime = Date.now() - startTime;
|
|
257
|
+
// Try to get whatever loaded before the timeout
|
|
258
|
+
let title = '';
|
|
259
|
+
let text = '';
|
|
260
|
+
try {
|
|
261
|
+
title = await this.page.title();
|
|
262
|
+
text = await this.page.evaluate(() => document.body?.innerText || '');
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
// Page may be in a broken state
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
url: this.page.url() || url,
|
|
269
|
+
status: 0,
|
|
270
|
+
title,
|
|
271
|
+
text,
|
|
272
|
+
loadTime,
|
|
273
|
+
consoleMessages: [
|
|
274
|
+
...this.consoleMessages,
|
|
275
|
+
`[error] Navigation failed: ${error.message}`,
|
|
276
|
+
],
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Scrape content using CSS selector
|
|
282
|
+
*/
|
|
283
|
+
async scrape(selector) {
|
|
284
|
+
await this.initialize();
|
|
285
|
+
try {
|
|
286
|
+
const $ = (await getCheerio()).load(await this.page.content());
|
|
287
|
+
const elements = [];
|
|
288
|
+
$(selector).each((_, el) => {
|
|
289
|
+
const $el = $(el);
|
|
290
|
+
const attributes = {};
|
|
291
|
+
const attribs = el.attribs || {};
|
|
292
|
+
for (const [key, value] of Object.entries(attribs)) {
|
|
293
|
+
attributes[key] = String(value);
|
|
294
|
+
}
|
|
295
|
+
elements.push({
|
|
296
|
+
tag: el.tagName || 'unknown',
|
|
297
|
+
text: $el.text().trim(),
|
|
298
|
+
html: $el.html() || '',
|
|
299
|
+
attributes,
|
|
300
|
+
href: $el.attr('href'),
|
|
301
|
+
src: $el.attr('src'),
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
return {
|
|
305
|
+
selector,
|
|
306
|
+
count: elements.length,
|
|
307
|
+
elements,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
return {
|
|
312
|
+
selector,
|
|
313
|
+
count: 0,
|
|
314
|
+
elements: [],
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Click on an element with optional human-like delay
|
|
320
|
+
*/
|
|
321
|
+
async click(selector, options) {
|
|
322
|
+
await this.initialize();
|
|
323
|
+
try {
|
|
324
|
+
// Wait for element to be visible before clicking
|
|
325
|
+
await this.page.waitForSelector(selector, {
|
|
326
|
+
visible: true,
|
|
327
|
+
timeout: this.config.timeout,
|
|
328
|
+
});
|
|
329
|
+
const beforeUrl = this.page.url();
|
|
330
|
+
if (options?.waitForNavigation) {
|
|
331
|
+
await Promise.all([
|
|
332
|
+
this.page.waitForNavigation({ timeout: this.config.timeout }),
|
|
333
|
+
this.page.click(selector),
|
|
334
|
+
]);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
await this.page.click(selector);
|
|
338
|
+
}
|
|
339
|
+
const afterUrl = this.page.url();
|
|
340
|
+
return {
|
|
341
|
+
success: true,
|
|
342
|
+
element: selector,
|
|
343
|
+
newUrl: beforeUrl !== afterUrl ? afterUrl : undefined,
|
|
344
|
+
contentChanged: beforeUrl !== afterUrl,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
return {
|
|
349
|
+
success: false,
|
|
350
|
+
element: selector,
|
|
351
|
+
contentChanged: false,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Type text into an input with optional human-like keystroke delay
|
|
357
|
+
*/
|
|
358
|
+
async type(selector, text, options) {
|
|
359
|
+
await this.initialize();
|
|
360
|
+
try {
|
|
361
|
+
// Wait for element to be visible
|
|
362
|
+
await this.page.waitForSelector(selector, {
|
|
363
|
+
visible: true,
|
|
364
|
+
timeout: this.config.timeout,
|
|
365
|
+
});
|
|
366
|
+
if (options?.clear) {
|
|
367
|
+
await this.page.click(selector, { clickCount: 3 }); // Select all
|
|
368
|
+
await this.page.keyboard.press('Backspace');
|
|
369
|
+
}
|
|
370
|
+
// Default to a small human-like delay between keystrokes if none specified
|
|
371
|
+
const delay = options?.delay ?? 50;
|
|
372
|
+
await this.page.type(selector, text, { delay });
|
|
373
|
+
return {
|
|
374
|
+
success: true,
|
|
375
|
+
element: selector,
|
|
376
|
+
text,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
catch (error) {
|
|
380
|
+
return {
|
|
381
|
+
success: false,
|
|
382
|
+
element: selector,
|
|
383
|
+
text,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Take a screenshot
|
|
389
|
+
*/
|
|
390
|
+
async screenshot(options) {
|
|
391
|
+
await this.initialize();
|
|
392
|
+
const format = options?.format || 'png';
|
|
393
|
+
const screenshotOptions = {
|
|
394
|
+
type: format,
|
|
395
|
+
encoding: 'base64',
|
|
396
|
+
fullPage: options?.fullPage || false,
|
|
397
|
+
};
|
|
398
|
+
if (format === 'jpeg' || format === 'webp') {
|
|
399
|
+
screenshotOptions.quality = options?.quality || 80;
|
|
400
|
+
}
|
|
401
|
+
let data;
|
|
402
|
+
if (options?.selector) {
|
|
403
|
+
const element = await this.page.$(options.selector);
|
|
404
|
+
if (!element) {
|
|
405
|
+
throw new Error(`Element not found: ${options.selector}`);
|
|
406
|
+
}
|
|
407
|
+
data = await element.screenshot(screenshotOptions);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
data = await this.page.screenshot(screenshotOptions);
|
|
411
|
+
}
|
|
412
|
+
const viewport = this.page.viewport();
|
|
413
|
+
return {
|
|
414
|
+
data,
|
|
415
|
+
format,
|
|
416
|
+
width: viewport?.width || 1920,
|
|
417
|
+
height: viewport?.height || 1080,
|
|
418
|
+
size: Math.ceil((data.length * 3) / 4),
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Get page snapshot with accessibility tree
|
|
423
|
+
*/
|
|
424
|
+
async getSnapshot() {
|
|
425
|
+
await this.initialize();
|
|
426
|
+
const [url, title, accessibilityTree] = await Promise.all([
|
|
427
|
+
this.page.url(),
|
|
428
|
+
this.page.title(),
|
|
429
|
+
this.page.evaluate(() => {
|
|
430
|
+
const elements = [];
|
|
431
|
+
const links = [];
|
|
432
|
+
const forms = [];
|
|
433
|
+
const interactable = [];
|
|
434
|
+
let refCounter = 0;
|
|
435
|
+
function generateRef() {
|
|
436
|
+
return `e${refCounter++}`;
|
|
437
|
+
}
|
|
438
|
+
// Get all interactive elements
|
|
439
|
+
const interactiveElements = document.querySelectorAll('a, button, input, select, textarea, [role="button"], [role="link"], [tabindex]');
|
|
440
|
+
interactiveElements.forEach((el) => {
|
|
441
|
+
const ref = generateRef();
|
|
442
|
+
const rect = el.getBoundingClientRect();
|
|
443
|
+
const visible = rect.width > 0 && rect.height > 0;
|
|
444
|
+
const label = el.innerText?.slice(0, 100) ||
|
|
445
|
+
el.getAttribute('aria-label') ||
|
|
446
|
+
el.getAttribute('title') ||
|
|
447
|
+
el.getAttribute('placeholder') ||
|
|
448
|
+
el.getAttribute('name') ||
|
|
449
|
+
'';
|
|
450
|
+
const element = {
|
|
451
|
+
ref,
|
|
452
|
+
type: el.tagName.toLowerCase(),
|
|
453
|
+
label: label.trim(),
|
|
454
|
+
role: el.getAttribute('role') || undefined,
|
|
455
|
+
visible,
|
|
456
|
+
};
|
|
457
|
+
if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {
|
|
458
|
+
element.value = el.value;
|
|
459
|
+
}
|
|
460
|
+
elements.push(element);
|
|
461
|
+
// Track links
|
|
462
|
+
if (el.tagName === 'A') {
|
|
463
|
+
links.push({
|
|
464
|
+
text: label.trim().slice(0, 100),
|
|
465
|
+
href: el.href,
|
|
466
|
+
ref,
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
// Track interactable
|
|
470
|
+
if (['BUTTON', 'A', 'INPUT', 'SELECT', 'TEXTAREA'].includes(el.tagName)) {
|
|
471
|
+
interactable.push({
|
|
472
|
+
ref,
|
|
473
|
+
type: el.tagName.toLowerCase(),
|
|
474
|
+
label: label.trim().slice(0, 50),
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
// Get forms
|
|
479
|
+
document.querySelectorAll('form').forEach((form) => {
|
|
480
|
+
const fields = [];
|
|
481
|
+
form.querySelectorAll('input, select, textarea').forEach((field) => {
|
|
482
|
+
fields.push(field.getAttribute('name') ||
|
|
483
|
+
field.getAttribute('id') ||
|
|
484
|
+
field.tagName.toLowerCase());
|
|
485
|
+
});
|
|
486
|
+
forms.push({
|
|
487
|
+
id: form.id || undefined,
|
|
488
|
+
action: form.action || undefined,
|
|
489
|
+
fields,
|
|
490
|
+
});
|
|
491
|
+
});
|
|
492
|
+
return { elements, links, forms, interactable };
|
|
493
|
+
}),
|
|
494
|
+
]);
|
|
495
|
+
return {
|
|
496
|
+
url,
|
|
497
|
+
title,
|
|
498
|
+
elements: accessibilityTree.elements,
|
|
499
|
+
links: accessibilityTree.links,
|
|
500
|
+
forms: accessibilityTree.forms,
|
|
501
|
+
interactable: accessibilityTree.interactable,
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Execute arbitrary JavaScript in page context
|
|
506
|
+
*/
|
|
507
|
+
async evaluate(fn) {
|
|
508
|
+
await this.initialize();
|
|
509
|
+
return this.page.evaluate(fn);
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Wait for selector to appear
|
|
513
|
+
*/
|
|
514
|
+
async waitForSelector(selector, timeout) {
|
|
515
|
+
await this.initialize();
|
|
516
|
+
try {
|
|
517
|
+
await this.page.waitForSelector(selector, {
|
|
518
|
+
timeout: timeout || this.config.timeout,
|
|
519
|
+
});
|
|
520
|
+
return true;
|
|
521
|
+
}
|
|
522
|
+
catch {
|
|
523
|
+
return false;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Get current URL
|
|
528
|
+
*/
|
|
529
|
+
async getCurrentUrl() {
|
|
530
|
+
await this.initialize();
|
|
531
|
+
return this.page.url();
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Go back in history
|
|
535
|
+
*/
|
|
536
|
+
async goBack() {
|
|
537
|
+
await this.initialize();
|
|
538
|
+
await this.page.goBack({ waitUntil: 'networkidle2' });
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Go forward in history
|
|
542
|
+
*/
|
|
543
|
+
async goForward() {
|
|
544
|
+
await this.initialize();
|
|
545
|
+
await this.page.goForward({ waitUntil: 'networkidle2' });
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Close browser and clean up resources
|
|
549
|
+
*/
|
|
550
|
+
async close() {
|
|
551
|
+
if (this.browser) {
|
|
552
|
+
await this.browser.close();
|
|
553
|
+
this.browser = null;
|
|
554
|
+
this.page = null;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=StealthBrowserService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StealthBrowserService.js","sourceRoot":"","sources":["../src/StealthBrowserService.ts"],"names":[],"mappings":"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"}
|