@cogitator-ai/browser 0.1.2
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 +329 -0
- package/dist/__tests__/browser-tools.test.d.ts +2 -0
- package/dist/__tests__/browser-tools.test.d.ts.map +1 -0
- package/dist/__tests__/browser-tools.test.js +120 -0
- package/dist/__tests__/browser-tools.test.js.map +1 -0
- package/dist/__tests__/extraction.test.d.ts +2 -0
- package/dist/__tests__/extraction.test.d.ts.map +1 -0
- package/dist/__tests__/extraction.test.js +267 -0
- package/dist/__tests__/extraction.test.js.map +1 -0
- package/dist/__tests__/interaction.test.d.ts +2 -0
- package/dist/__tests__/interaction.test.d.ts.map +1 -0
- package/dist/__tests__/interaction.test.js +376 -0
- package/dist/__tests__/interaction.test.js.map +1 -0
- package/dist/__tests__/navigation.test.d.ts +2 -0
- package/dist/__tests__/navigation.test.d.ts.map +1 -0
- package/dist/__tests__/navigation.test.js +235 -0
- package/dist/__tests__/navigation.test.js.map +1 -0
- package/dist/__tests__/network.test.d.ts +2 -0
- package/dist/__tests__/network.test.d.ts.map +1 -0
- package/dist/__tests__/network.test.js +508 -0
- package/dist/__tests__/network.test.js.map +1 -0
- package/dist/__tests__/page-helpers.test.d.ts +2 -0
- package/dist/__tests__/page-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/page-helpers.test.js +321 -0
- package/dist/__tests__/page-helpers.test.js.map +1 -0
- package/dist/__tests__/schemas.test.d.ts +2 -0
- package/dist/__tests__/schemas.test.d.ts.map +1 -0
- package/dist/__tests__/schemas.test.js +518 -0
- package/dist/__tests__/schemas.test.js.map +1 -0
- package/dist/__tests__/selectors.test.d.ts +2 -0
- package/dist/__tests__/selectors.test.d.ts.map +1 -0
- package/dist/__tests__/selectors.test.js +157 -0
- package/dist/__tests__/selectors.test.js.map +1 -0
- package/dist/__tests__/session.test.d.ts +2 -0
- package/dist/__tests__/session.test.d.ts.map +1 -0
- package/dist/__tests__/session.test.js +325 -0
- package/dist/__tests__/session.test.js.map +1 -0
- package/dist/__tests__/stealth.test.d.ts +2 -0
- package/dist/__tests__/stealth.test.d.ts.map +1 -0
- package/dist/__tests__/stealth.test.js +353 -0
- package/dist/__tests__/stealth.test.js.map +1 -0
- package/dist/__tests__/vision.test.d.ts +2 -0
- package/dist/__tests__/vision.test.d.ts.map +1 -0
- package/dist/__tests__/vision.test.js +226 -0
- package/dist/__tests__/vision.test.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/session.d.ts +29 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +190 -0
- package/dist/session.js.map +1 -0
- package/dist/stealth/evasions.d.ts +2 -0
- package/dist/stealth/evasions.d.ts.map +1 -0
- package/dist/stealth/evasions.js +83 -0
- package/dist/stealth/evasions.js.map +1 -0
- package/dist/stealth/human-like.d.ts +5 -0
- package/dist/stealth/human-like.d.ts.map +1 -0
- package/dist/stealth/human-like.js +52 -0
- package/dist/stealth/human-like.js.map +1 -0
- package/dist/stealth/index.d.ts +8 -0
- package/dist/stealth/index.d.ts.map +1 -0
- package/dist/stealth/index.js +24 -0
- package/dist/stealth/index.js.map +1 -0
- package/dist/stealth/user-agents.d.ts +3 -0
- package/dist/stealth/user-agents.d.ts.map +1 -0
- package/dist/stealth/user-agents.js +55 -0
- package/dist/stealth/user-agents.js.map +1 -0
- package/dist/tools/extraction.d.ts +96 -0
- package/dist/tools/extraction.d.ts.map +1 -0
- package/dist/tools/extraction.js +196 -0
- package/dist/tools/extraction.js.map +1 -0
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +40 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/interaction.d.ts +128 -0
- package/dist/tools/interaction.d.ts.map +1 -0
- package/dist/tools/interaction.js +229 -0
- package/dist/tools/interaction.js.map +1 -0
- package/dist/tools/navigation.d.ts +63 -0
- package/dist/tools/navigation.d.ts.map +1 -0
- package/dist/tools/navigation.js +140 -0
- package/dist/tools/navigation.js.map +1 -0
- package/dist/tools/network.d.ts +122 -0
- package/dist/tools/network.d.ts.map +1 -0
- package/dist/tools/network.js +223 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/vision.d.ts +83 -0
- package/dist/tools/vision.d.ts.map +1 -0
- package/dist/tools/vision.js +134 -0
- package/dist/tools/vision.js.map +1 -0
- package/dist/utils/page-helpers.d.ts +11 -0
- package/dist/utils/page-helpers.d.ts.map +1 -0
- package/dist/utils/page-helpers.js +73 -0
- package/dist/utils/page-helpers.js.map +1 -0
- package/dist/utils/schemas.d.ts +209 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +156 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/selectors.d.ts +4 -0
- package/dist/utils/selectors.d.ts.map +1 -0
- package/dist/utils/selectors.js +39 -0
- package/dist/utils/selectors.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
# @cogitator-ai/browser
|
|
2
|
+
|
|
3
|
+
Browser automation tools for Cogitator AI agents. Playwright-based with 32 tools across 5 modules, vision mode, stealth system, structured data extraction, and network control.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **32 Browser Tools** across 5 modules (navigation, interaction, extraction, vision, network)
|
|
8
|
+
- **BrowserSession** -- managed browser lifecycle with tabs, cookies, proxy
|
|
9
|
+
- **Stealth Mode** -- fingerprint evasion, human-like typing/mouse, UA rotation
|
|
10
|
+
- **Vision Mode** -- screenshot + accessibility tree for vision LLM navigation
|
|
11
|
+
- **Smart Extraction** -- tables, structured data, links, clean text
|
|
12
|
+
- **Network Control** -- request interception, HAR capture, resource blocking, API monitoring
|
|
13
|
+
- **Playwright-powered** -- Chromium, Firefox, WebKit support
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm add @cogitator-ai/browser playwright
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { BrowserSession, browserTools } from '@cogitator-ai/browser';
|
|
25
|
+
import { Agent, Cogitator } from '@cogitator-ai/core';
|
|
26
|
+
|
|
27
|
+
const session = new BrowserSession({ headless: true });
|
|
28
|
+
await session.start();
|
|
29
|
+
|
|
30
|
+
const agent = new Agent({
|
|
31
|
+
name: 'web-researcher',
|
|
32
|
+
model: 'gpt-4o',
|
|
33
|
+
instructions: 'You browse the web and extract information.',
|
|
34
|
+
tools: browserTools(session),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const cog = new Cogitator({ llm: { defaultProvider: 'openai' } });
|
|
38
|
+
const result = await cog.run(agent, {
|
|
39
|
+
input: 'Go to https://news.ycombinator.com and get the top 5 story titles',
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
console.log(result.output);
|
|
43
|
+
await session.close();
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Tool Modules
|
|
47
|
+
|
|
48
|
+
### Navigation (7 tools)
|
|
49
|
+
|
|
50
|
+
| Tool | Description |
|
|
51
|
+
| ----------------------------- | ------------------------------------------------------------ |
|
|
52
|
+
| `browser_navigate` | Navigate to a URL. Returns final URL, title, and HTTP status |
|
|
53
|
+
| `browser_go_back` | Go back in browser history |
|
|
54
|
+
| `browser_go_forward` | Go forward in browser history |
|
|
55
|
+
| `browser_reload` | Reload the current page |
|
|
56
|
+
| `browser_wait_for_navigation` | Wait for navigation to a URL matching a pattern |
|
|
57
|
+
| `browser_get_current_url` | Get current page URL and title |
|
|
58
|
+
| `browser_wait_for_selector` | Wait for a CSS selector to appear on the page |
|
|
59
|
+
|
|
60
|
+
### Interaction (9 tools)
|
|
61
|
+
|
|
62
|
+
| Tool | Description |
|
|
63
|
+
| ----------------------- | --------------------------------------------------------------------------------- |
|
|
64
|
+
| `browser_click` | Click an element by CSS selector. Supports button, clickCount, position |
|
|
65
|
+
| `browser_type` | Type text into an input. Stealth mode adds human-like keystroke delays |
|
|
66
|
+
| `browser_select_option` | Select from a `<select>` element by value, label, or index |
|
|
67
|
+
| `browser_hover` | Hover over an element |
|
|
68
|
+
| `browser_scroll` | Scroll the page or a specific element in any direction |
|
|
69
|
+
| `browser_press_key` | Press a keyboard key with optional modifier keys |
|
|
70
|
+
| `browser_drag_and_drop` | Drag an element onto another element |
|
|
71
|
+
| `browser_fill_form` | Smart form filler -- finds inputs by name, placeholder, aria-label, or label text |
|
|
72
|
+
| `browser_upload_file` | Upload files to a file input element |
|
|
73
|
+
|
|
74
|
+
### Extraction (7 tools)
|
|
75
|
+
|
|
76
|
+
| Tool | Description |
|
|
77
|
+
| ---------------------------- | ------------------------------------------------------------------ |
|
|
78
|
+
| `browser_get_text` | Extract text from the page or a specific element |
|
|
79
|
+
| `browser_get_html` | Get inner or outer HTML of the page or an element |
|
|
80
|
+
| `browser_get_attribute` | Get the value of a DOM attribute |
|
|
81
|
+
| `browser_get_links` | Extract all links with text, href, and title |
|
|
82
|
+
| `browser_query_selector_all` | Query all matching elements with tag, text, attributes, visibility |
|
|
83
|
+
| `browser_extract_table` | Extract structured data from HTML tables (headers + rows) |
|
|
84
|
+
| `browser_extract_structured` | Extract clean readable text, stripping scripts/styles/SVG |
|
|
85
|
+
|
|
86
|
+
### Vision (4 tools)
|
|
87
|
+
|
|
88
|
+
| Tool | Description |
|
|
89
|
+
| ------------------------------ | --------------------------------------------------------------------------------------- |
|
|
90
|
+
| `browser_screenshot` | Screenshot the page or element. Returns base64 PNG/JPEG |
|
|
91
|
+
| `browser_screenshot_element` | Screenshot a specific element with bounding box coordinates |
|
|
92
|
+
| `browser_find_by_description` | Find elements by natural language using the accessibility tree |
|
|
93
|
+
| `browser_click_by_description` | Click an element by natural language description (tries role, text, label, placeholder) |
|
|
94
|
+
|
|
95
|
+
### Network (5 tools)
|
|
96
|
+
|
|
97
|
+
| Tool | Description |
|
|
98
|
+
| --------------------------- | -------------------------------------------------------------------- |
|
|
99
|
+
| `browser_intercept_request` | Intercept HTTP requests -- block, modify, or continue by URL pattern |
|
|
100
|
+
| `browser_wait_for_response` | Wait for an HTTP response matching a URL pattern |
|
|
101
|
+
| `browser_block_resources` | Block resource types (image, stylesheet, font, media, script) |
|
|
102
|
+
| `browser_capture_har` | Start/stop HAR traffic capture. Returns all captured entries on stop |
|
|
103
|
+
| `browser_get_api_calls` | Get captured XHR/fetch calls, filtered by URL pattern or method |
|
|
104
|
+
|
|
105
|
+
## Stealth Mode
|
|
106
|
+
|
|
107
|
+
Stealth mode makes the browser harder to detect as automated. It applies evasion scripts on context creation and enables human-like input simulation.
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const session = new BrowserSession({
|
|
111
|
+
stealth: true, // enable all defaults
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// or configure individually
|
|
115
|
+
const session = new BrowserSession({
|
|
116
|
+
stealth: {
|
|
117
|
+
humanLikeTyping: true, // random delays between keystrokes (50-150ms)
|
|
118
|
+
humanLikeMouse: true, // bezier curve mouse movement
|
|
119
|
+
fingerprintRandomization: true, // canvas/WebGL/plugin spoofing
|
|
120
|
+
blockWebDriver: true, // navigator.webdriver = false
|
|
121
|
+
evasionScripts: [], // custom init scripts to inject
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
What stealth mode does:
|
|
127
|
+
|
|
128
|
+
- Sets `navigator.webdriver` to `false`
|
|
129
|
+
- Spoofs `navigator.plugins` with realistic Chrome plugins
|
|
130
|
+
- Sets `navigator.languages` to `['en-US', 'en']`
|
|
131
|
+
- Randomizes canvas fingerprint (1-bit pixel noise)
|
|
132
|
+
- Spoofs WebGL vendor/renderer (Intel Iris)
|
|
133
|
+
- Injects `window.chrome` runtime stubs
|
|
134
|
+
- Overrides `Permissions.query` for notifications
|
|
135
|
+
- Rotates User-Agent strings per browser type
|
|
136
|
+
- Adds human-like typing delays (50-150ms per character)
|
|
137
|
+
- Uses bezier curve mouse movement for clicks
|
|
138
|
+
|
|
139
|
+
## Vision Mode
|
|
140
|
+
|
|
141
|
+
Vision tools let agents interact with pages using natural language instead of CSS selectors:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
import { BrowserSession, browserTools } from '@cogitator-ai/browser';
|
|
145
|
+
|
|
146
|
+
const session = new BrowserSession();
|
|
147
|
+
await session.start();
|
|
148
|
+
|
|
149
|
+
const tools = browserTools(session, { modules: ['navigation', 'vision'] });
|
|
150
|
+
|
|
151
|
+
// Agent can now use:
|
|
152
|
+
// browser_screenshot -- take a screenshot for visual analysis
|
|
153
|
+
// browser_find_by_description -- "find the login button"
|
|
154
|
+
// browser_click_by_description -- "click the Submit button"
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
`browser_find_by_description` walks the accessibility tree and matches elements by role and name against the description. `browser_click_by_description` tries multiple strategies: role button, role link, text content, label, and placeholder.
|
|
158
|
+
|
|
159
|
+
## Network Control
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { BrowserSession, createNavigationTools, createNetworkTools } from '@cogitator-ai/browser';
|
|
163
|
+
|
|
164
|
+
const session = new BrowserSession();
|
|
165
|
+
await session.start();
|
|
166
|
+
|
|
167
|
+
const tools = [...createNavigationTools(session), ...createNetworkTools(session)];
|
|
168
|
+
|
|
169
|
+
// Agent can intercept requests:
|
|
170
|
+
// browser_intercept_request({ urlPattern: "**/ads/**", action: "block" })
|
|
171
|
+
|
|
172
|
+
// Block resource types to speed up loading:
|
|
173
|
+
// browser_block_resources({ types: ["image", "font", "stylesheet"] })
|
|
174
|
+
|
|
175
|
+
// Monitor API calls made by the page:
|
|
176
|
+
// browser_get_api_calls({ urlPattern: "/api/", method: "POST" })
|
|
177
|
+
|
|
178
|
+
// Capture HAR traffic:
|
|
179
|
+
// browser_capture_har({ action: "start" })
|
|
180
|
+
// ... navigate and interact ...
|
|
181
|
+
// browser_capture_har({ action: "stop", path: "./traffic.har" })
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## BrowserSession API
|
|
185
|
+
|
|
186
|
+
### Constructor
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
const session = new BrowserSession(config?: BrowserSessionConfig);
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### BrowserSessionConfig
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
interface BrowserSessionConfig {
|
|
196
|
+
headless?: boolean; // default: true
|
|
197
|
+
browser?: 'chromium' | 'firefox' | 'webkit'; // default: 'chromium'
|
|
198
|
+
stealth?: boolean | StealthConfig; // enable stealth mode
|
|
199
|
+
proxy?: string | ProxyConfig; // proxy server
|
|
200
|
+
viewport?: { width: number; height: number }; // default: 1280x720
|
|
201
|
+
userAgent?: string; // custom UA (stealth rotates automatically)
|
|
202
|
+
locale?: string; // browser locale (e.g., 'en-US')
|
|
203
|
+
timezone?: string; // timezone ID (e.g., 'America/New_York')
|
|
204
|
+
geolocation?: { latitude: number; longitude: number };
|
|
205
|
+
cookies?: BrowserCookie[]; // pre-load cookies
|
|
206
|
+
timeout?: number; // navigation timeout, default: 30000ms
|
|
207
|
+
actionTimeout?: number; // action timeout, default: 10000ms
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Lifecycle
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
await session.start(); // launch browser, create context and first page
|
|
215
|
+
await session.close(); // close browser and cleanup
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Properties
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
session.page; // active Playwright Page
|
|
222
|
+
session.tabs; // all open Page[]
|
|
223
|
+
session.browser; // Playwright Browser instance
|
|
224
|
+
session.context; // Playwright BrowserContext
|
|
225
|
+
session.config; // current config
|
|
226
|
+
session.stealthEnabled; // whether stealth is on
|
|
227
|
+
session.stealthConfig; // resolved StealthConfig or null
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Tab Management
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
const page = await session.newTab('https://example.com'); // open new tab
|
|
234
|
+
session.switchTab(1); // switch to tab by index
|
|
235
|
+
await session.closeTab(0); // close tab by index
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Cookie Management
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
const cookies = await session.getCookies();
|
|
242
|
+
await session.setCookies([{ name: 'token', value: 'abc', domain: '.example.com' }]);
|
|
243
|
+
await session.saveCookies('./cookies.json');
|
|
244
|
+
await session.loadCookies('./cookies.json');
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Module Selection
|
|
248
|
+
|
|
249
|
+
Load only the tool modules you need:
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
// all 32 tools
|
|
253
|
+
const tools = browserTools(session);
|
|
254
|
+
|
|
255
|
+
// only navigation + extraction (14 tools)
|
|
256
|
+
const tools = browserTools(session, {
|
|
257
|
+
modules: ['navigation', 'extraction'],
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// or use individual factory functions
|
|
261
|
+
import {
|
|
262
|
+
createNavigationTools,
|
|
263
|
+
createExtractionTools,
|
|
264
|
+
createScreenshotTool,
|
|
265
|
+
} from '@cogitator-ai/browser';
|
|
266
|
+
|
|
267
|
+
const tools = [
|
|
268
|
+
...createNavigationTools(session),
|
|
269
|
+
...createExtractionTools(session),
|
|
270
|
+
createScreenshotTool(session),
|
|
271
|
+
];
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Available modules: `navigation`, `interaction`, `extraction`, `vision`, `network`.
|
|
275
|
+
|
|
276
|
+
## Utility Helpers
|
|
277
|
+
|
|
278
|
+
Standalone helpers for advanced use cases:
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
import {
|
|
282
|
+
smartSelect,
|
|
283
|
+
findFormField,
|
|
284
|
+
getReadableText,
|
|
285
|
+
getAccessibilityTree,
|
|
286
|
+
elementToInfo,
|
|
287
|
+
} from '@cogitator-ai/browser';
|
|
288
|
+
|
|
289
|
+
// smartSelect tries CSS, XPath, then text matching
|
|
290
|
+
const locator = await smartSelect(page, 'Submit');
|
|
291
|
+
|
|
292
|
+
// findFormField tries name, placeholder, aria-label, label text
|
|
293
|
+
const input = await findFormField(page, 'Email');
|
|
294
|
+
|
|
295
|
+
// getReadableText strips scripts/styles and returns clean text
|
|
296
|
+
const text = await getReadableText(page);
|
|
297
|
+
|
|
298
|
+
// getAccessibilityTree returns simplified a11y tree
|
|
299
|
+
const tree = await getAccessibilityTree(page);
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## Stealth Standalone Functions
|
|
303
|
+
|
|
304
|
+
Use stealth primitives directly outside of BrowserSession:
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
import {
|
|
308
|
+
humanLikeType,
|
|
309
|
+
humanLikeClick,
|
|
310
|
+
humanLikeScroll,
|
|
311
|
+
getRandomUserAgent,
|
|
312
|
+
getAllUserAgents,
|
|
313
|
+
getEvasionScripts,
|
|
314
|
+
applyStealthToContext,
|
|
315
|
+
getStealthLaunchOptions,
|
|
316
|
+
} from '@cogitator-ai/browser';
|
|
317
|
+
|
|
318
|
+
// human-like input on any Playwright page
|
|
319
|
+
await humanLikeType(page, '#search', 'cogitator ai');
|
|
320
|
+
await humanLikeClick(page, '.submit-btn');
|
|
321
|
+
await humanLikeScroll(page, 'down', 500);
|
|
322
|
+
|
|
323
|
+
// get a random UA for a browser type
|
|
324
|
+
const ua = getRandomUserAgent('chromium');
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## License
|
|
328
|
+
|
|
329
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/browser-tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { browserTools } from '../tools/index.js';
|
|
3
|
+
vi.mock('playwright', () => ({
|
|
4
|
+
chromium: { launch: vi.fn() },
|
|
5
|
+
}));
|
|
6
|
+
function createMockSession() {
|
|
7
|
+
const mockPage = {
|
|
8
|
+
goto: vi.fn(),
|
|
9
|
+
goBack: vi.fn(),
|
|
10
|
+
goForward: vi.fn(),
|
|
11
|
+
reload: vi.fn(),
|
|
12
|
+
url: vi.fn().mockReturnValue('about:blank'),
|
|
13
|
+
title: vi.fn().mockResolvedValue(''),
|
|
14
|
+
waitForURL: vi.fn(),
|
|
15
|
+
waitForSelector: vi.fn(),
|
|
16
|
+
click: vi.fn(),
|
|
17
|
+
fill: vi.fn(),
|
|
18
|
+
type: vi.fn(),
|
|
19
|
+
selectOption: vi.fn(),
|
|
20
|
+
hover: vi.fn(),
|
|
21
|
+
evaluate: vi.fn(),
|
|
22
|
+
keyboard: { press: vi.fn(), type: vi.fn() },
|
|
23
|
+
dragAndDrop: vi.fn(),
|
|
24
|
+
setInputFiles: vi.fn(),
|
|
25
|
+
textContent: vi.fn(),
|
|
26
|
+
innerHTML: vi.fn(),
|
|
27
|
+
content: vi.fn(),
|
|
28
|
+
getAttribute: vi.fn(),
|
|
29
|
+
screenshot: vi.fn().mockResolvedValue(Buffer.from('')),
|
|
30
|
+
viewportSize: vi.fn().mockReturnValue({ width: 1280, height: 720 }),
|
|
31
|
+
accessibility: { snapshot: vi.fn().mockResolvedValue(null) },
|
|
32
|
+
locator: vi.fn().mockReturnValue({
|
|
33
|
+
screenshot: vi.fn(),
|
|
34
|
+
boundingBox: vi.fn(),
|
|
35
|
+
evaluate: vi.fn(),
|
|
36
|
+
count: vi.fn().mockResolvedValue(0),
|
|
37
|
+
nth: vi.fn(),
|
|
38
|
+
first: vi.fn(),
|
|
39
|
+
}),
|
|
40
|
+
getByRole: vi.fn().mockReturnValue({ count: vi.fn().mockResolvedValue(0) }),
|
|
41
|
+
getByText: vi.fn().mockReturnValue({ count: vi.fn().mockResolvedValue(0) }),
|
|
42
|
+
getByLabel: vi.fn().mockReturnValue({ count: vi.fn().mockResolvedValue(0) }),
|
|
43
|
+
getByPlaceholder: vi.fn().mockReturnValue({ count: vi.fn().mockResolvedValue(0) }),
|
|
44
|
+
route: vi.fn(),
|
|
45
|
+
unroute: vi.fn(),
|
|
46
|
+
waitForResponse: vi.fn(),
|
|
47
|
+
on: vi.fn(),
|
|
48
|
+
removeListener: vi.fn(),
|
|
49
|
+
mouse: { move: vi.fn(), click: vi.fn(), wheel: vi.fn() },
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
page: mockPage,
|
|
53
|
+
stealthEnabled: false,
|
|
54
|
+
stealthConfig: null,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
describe('browserTools', () => {
|
|
58
|
+
const session = createMockSession();
|
|
59
|
+
it('returns all 32 tools with no options', () => {
|
|
60
|
+
const tools = browserTools(session);
|
|
61
|
+
expect(tools).toHaveLength(32);
|
|
62
|
+
});
|
|
63
|
+
it('all tools have unique names', () => {
|
|
64
|
+
const tools = browserTools(session);
|
|
65
|
+
const names = tools.map((t) => t.name);
|
|
66
|
+
expect(new Set(names).size).toBe(names.length);
|
|
67
|
+
});
|
|
68
|
+
it('all tool names start with browser_', () => {
|
|
69
|
+
const tools = browserTools(session);
|
|
70
|
+
for (const t of tools) {
|
|
71
|
+
expect(t.name).toMatch(/^browser_/);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
it('returns 7 navigation tools', () => {
|
|
75
|
+
const tools = browserTools(session, { modules: ['navigation'] });
|
|
76
|
+
expect(tools).toHaveLength(7);
|
|
77
|
+
});
|
|
78
|
+
it('returns 9 interaction tools', () => {
|
|
79
|
+
const tools = browserTools(session, { modules: ['interaction'] });
|
|
80
|
+
expect(tools).toHaveLength(9);
|
|
81
|
+
});
|
|
82
|
+
it('returns 7 extraction tools', () => {
|
|
83
|
+
const tools = browserTools(session, { modules: ['extraction'] });
|
|
84
|
+
expect(tools).toHaveLength(7);
|
|
85
|
+
});
|
|
86
|
+
it('returns 4 vision tools', () => {
|
|
87
|
+
const tools = browserTools(session, { modules: ['vision'] });
|
|
88
|
+
expect(tools).toHaveLength(4);
|
|
89
|
+
});
|
|
90
|
+
it('returns 5 network tools', () => {
|
|
91
|
+
const tools = browserTools(session, { modules: ['network'] });
|
|
92
|
+
expect(tools).toHaveLength(5);
|
|
93
|
+
});
|
|
94
|
+
it('combines modules correctly', () => {
|
|
95
|
+
const tools = browserTools(session, { modules: ['navigation', 'extraction'] });
|
|
96
|
+
expect(tools).toHaveLength(14);
|
|
97
|
+
});
|
|
98
|
+
it('all tools have valid toJSON()', () => {
|
|
99
|
+
const tools = browserTools(session);
|
|
100
|
+
for (const t of tools) {
|
|
101
|
+
const json = t.toJSON();
|
|
102
|
+
expect(json).toHaveProperty('name');
|
|
103
|
+
expect(json).toHaveProperty('description');
|
|
104
|
+
expect(json).toHaveProperty('parameters');
|
|
105
|
+
expect(typeof json.name).toBe('string');
|
|
106
|
+
expect(typeof json.description).toBe('string');
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
it('all tools have category web', () => {
|
|
110
|
+
const tools = browserTools(session);
|
|
111
|
+
for (const t of tools) {
|
|
112
|
+
expect(t.category).toBe('web');
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
it('returns 0 tools for empty modules array', () => {
|
|
116
|
+
const tools = browserTools(session, { modules: [] });
|
|
117
|
+
expect(tools).toHaveLength(0);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=browser-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/browser-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/extraction.test.ts"],"names":[],"mappings":""}
|