chrometools-mcp 2.5.0 → 3.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/CHANGELOG.md +420 -0
- package/COMPONENT_MAPPING_SPEC.md +1217 -0
- package/README.md +406 -38
- package/bridge/bridge-client.js +472 -0
- package/bridge/bridge-service.js +399 -0
- package/bridge/install.js +241 -0
- package/browser/browser-manager.js +107 -2
- package/browser/page-manager.js +226 -69
- package/docs/CHROME_EXTENSION.md +219 -0
- package/docs/PAGE_OBJECT_MODEL_CONCEPT.md +1756 -0
- package/extension/background.js +643 -0
- package/extension/content.js +715 -0
- package/extension/icons/create-icons.js +164 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/manifest.json +58 -0
- package/extension/popup/popup.css +437 -0
- package/extension/popup/popup.html +102 -0
- package/extension/popup/popup.js +415 -0
- package/extension/recorder-overlay.css +93 -0
- package/index.js +3347 -2901
- package/models/BaseInputModel.js +93 -0
- package/models/CheckboxGroupModel.js +199 -0
- package/models/CheckboxModel.js +103 -0
- package/models/ColorInputModel.js +53 -0
- package/models/DateInputModel.js +67 -0
- package/models/RadioGroupModel.js +126 -0
- package/models/RangeInputModel.js +60 -0
- package/models/SelectModel.js +97 -0
- package/models/TextInputModel.js +34 -0
- package/models/TextareaModel.js +59 -0
- package/models/TimeInputModel.js +49 -0
- package/models/index.js +122 -0
- package/package.json +3 -2
- package/pom/apom-converter.js +267 -0
- package/pom/apom-tree-converter.js +515 -0
- package/pom/element-id-generator.js +175 -0
- package/recorder/page-object-generator.js +16 -0
- package/recorder/scenario-executor.js +80 -2
- package/server/tool-definitions.js +839 -713
- package/server/tool-groups.js +1 -1
- package/server/tool-schemas.js +367 -326
- package/server/websocket-bridge.js +447 -0
- package/utils/selector-resolver.js +186 -0
- package/utils/ui-framework-detector.js +392 -0
- package/RELEASE_NOTES_v2.5.0.md +0 -109
- package/npm_publish_output.txt +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,426 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [3.1.2] - 2026-01-26
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Multi-tab scenario recording** — Automatic recording of tab switches during scenario capture
|
|
9
|
+
- When user switches tabs during recording, an `openTab` action is automatically recorded
|
|
10
|
+
- Records tab URL, title, and switch reason for accurate playback
|
|
11
|
+
- Only records if switching to a different tab (ignores same-tab activations)
|
|
12
|
+
- Location: `extension/background.js` (chrome.tabs.onActivated listener)
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- **openTab navigation strategy** — Changed from `networkidle2` to `domcontentloaded` in scenario executor
|
|
16
|
+
- Prevents timeout errors when opening tabs with continuous ad/tracking loading
|
|
17
|
+
- Consistent with other navigation improvements in 3.1.1
|
|
18
|
+
- Location: `recorder/scenario-executor.js:979`
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
- **openTab with empty URL uses look-ahead to next action's URL** — Smart URL detection for tab switches
|
|
22
|
+
- When openTab has empty URL, executor looks at next action's tabUrl
|
|
23
|
+
- If next action has real URL, uses it for tab opening/switching
|
|
24
|
+
- Fixes scenarios where new tab was opened but URL loaded immediately after
|
|
25
|
+
- Empty URLs without look-ahead match are still skipped (prevents about:blank tabs)
|
|
26
|
+
- Location: `recorder/scenario-executor.js:168-176, 987-990`
|
|
27
|
+
|
|
28
|
+
- **Added 500ms delay before tab switch** — Prevents race conditions during scenario playback
|
|
29
|
+
- Allows previous tab's pending processes (navigation, AJAX, form submissions) to complete
|
|
30
|
+
- Ensures stable state before switching to new tab
|
|
31
|
+
- Location: `recorder/scenario-executor.js:990-992`
|
|
32
|
+
|
|
33
|
+
## [3.1.1] - 2026-01-26
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
- **Scenario recording and saving flow** — Fixed critical bugs preventing scenario recording
|
|
37
|
+
- Fixed Extension → Bridge → MCP communication flow for recording control
|
|
38
|
+
- `startRecording` now properly sends command to Extension via Bridge WebSocket
|
|
39
|
+
- `stopRecording` correctly retrieves recorded actions from Extension state
|
|
40
|
+
- `saveScenario` now successfully saves scenarios to correct project directory
|
|
41
|
+
- Recording state properly synchronized between Extension popup and MCP tools
|
|
42
|
+
- Location: `index.js` (startRecording/stopRecording/saveScenario handlers)
|
|
43
|
+
|
|
44
|
+
- **Navigation timeout for slow websites** — Fixed timeout errors on sites with continuous loading
|
|
45
|
+
- Increased navigation timeout from 30s to 60s
|
|
46
|
+
- Changed wait strategy from `networkidle2` to `domcontentloaded` (less strict)
|
|
47
|
+
- Fixes timeout errors on sites like Yahoo that continuously load ads and tracking scripts
|
|
48
|
+
- Location: `browser/page-manager.js:188-193`
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
- **Improved WebSocket message handling** — Better error reporting and state management
|
|
52
|
+
- Bridge now properly forwards recording commands to Extension
|
|
53
|
+
- MCP server correctly receives recording state updates from Bridge
|
|
54
|
+
- Clear error messages when Extension is not connected or recording fails
|
|
55
|
+
|
|
56
|
+
## [3.1.0] - 2026-01-26
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
- **Native Messaging Bridge Architecture** — complete rewrite of Extension ↔ MCP communication
|
|
60
|
+
- Bridge Service runs as Native Messaging Host (launched by Chrome with Extension)
|
|
61
|
+
- MCP servers connect as WebSocket clients (not servers)
|
|
62
|
+
- Supports 0-8 simultaneous MCP clients connecting/disconnecting at any time
|
|
63
|
+
- Full state (tabs, recordings) sent immediately on client connect
|
|
64
|
+
- No more scanning delays — instant connection to persistent Bridge
|
|
65
|
+
|
|
66
|
+
- **CLI commands for Bridge management**
|
|
67
|
+
- `--install-bridge` — Install Native Messaging Bridge (one-time setup)
|
|
68
|
+
- `--uninstall-bridge` — Remove Bridge installation
|
|
69
|
+
- `--check-bridge` — Verify Bridge is installed
|
|
70
|
+
- `--help` — Show all CLI options
|
|
71
|
+
|
|
72
|
+
- **Stable Extension ID** via manifest key
|
|
73
|
+
- Extension ID is now deterministic: `dmehkibmncgphijnigkahhlekgajhpbl`
|
|
74
|
+
- Required for Native Messaging Host registration
|
|
75
|
+
|
|
76
|
+
- **New extension icons** — Chrome/robot themed design (16, 48, 128px)
|
|
77
|
+
|
|
78
|
+
### Changed
|
|
79
|
+
- **Extension is now Event Producer** — sends all events to Bridge, doesn't manage WebSocket connections
|
|
80
|
+
- **MCP is now Event Consumer** — connects to Bridge as client, receives state on demand
|
|
81
|
+
- **Bridge lifecycle** — starts with Chrome Extension, stops when Chrome closes
|
|
82
|
+
- Removed port scanning (9223-9227) — Bridge uses single fixed port 9223
|
|
83
|
+
|
|
84
|
+
### Architecture
|
|
85
|
+
```
|
|
86
|
+
Chrome Extension (producer) → Native Messaging → Bridge Service (:9223) ← WebSocket ← MCP clients (0-8)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Migration
|
|
90
|
+
1. Run `npx chrometools-mcp --install-bridge` once
|
|
91
|
+
2. Reload Extension in chrome://extensions
|
|
92
|
+
3. Use normally — MCP auto-connects to Bridge
|
|
93
|
+
|
|
94
|
+
## [3.0.4] - 2026-01-26
|
|
95
|
+
|
|
96
|
+
### Added
|
|
97
|
+
- **Smart tab tracking for scenario recording**
|
|
98
|
+
- Recording automatically follows the active tab
|
|
99
|
+
- When user switches tabs during recording, an `openTab` action is recorded
|
|
100
|
+
- When user opens new tab, an `openTab` action is recorded
|
|
101
|
+
- Actions from non-active tabs are automatically filtered out
|
|
102
|
+
- `openTab` action ensures tab exists during playback (opens tab with URL if not exists)
|
|
103
|
+
- Scenario executor supports `openTab` with automatic tab reuse and creation
|
|
104
|
+
- **MCP tools for programmatic recording control**
|
|
105
|
+
- `startRecording` - Start recording from AI/code
|
|
106
|
+
- `stopRecording` - Stop and retrieve recorded actions
|
|
107
|
+
- `getRecorderState` - Query current recording state
|
|
108
|
+
- `saveScenario` - Save recorded actions as scenario
|
|
109
|
+
- AI agents can now fully control recording without manual interaction
|
|
110
|
+
|
|
111
|
+
### Changed
|
|
112
|
+
- Recording now tracks `currentTabId` instead of being locked to `startTabId`
|
|
113
|
+
- Content scripts only send actions when their tab is the active recording target
|
|
114
|
+
- Replaced `switchTab`/`newTab` with unified `openTab` action type
|
|
115
|
+
- `openTab` intelligently checks if tab already exists before creating new one
|
|
116
|
+
- `enableRecorder` now mentions programmatic control tools
|
|
117
|
+
|
|
118
|
+
## [3.0.3] - 2026-01-25
|
|
119
|
+
|
|
120
|
+
### Added
|
|
121
|
+
- **Multi-instance MCP server support** via dynamic port allocation
|
|
122
|
+
- MCP server automatically finds available port from range 9223-9227
|
|
123
|
+
- Chrome Extension scans for running MCP instances every 20 seconds (port scanning)
|
|
124
|
+
- Extension connects to multiple MCP servers simultaneously (broadcast pattern)
|
|
125
|
+
- Enables multiple AI clients (Claude Desktop, Telegram bot, etc.) to work in parallel
|
|
126
|
+
- Graceful handling of ungraceful shutdowns (kill -9) via WebSocket.onclose
|
|
127
|
+
|
|
128
|
+
### Changed
|
|
129
|
+
- **Auto-sync active tab when user switches tabs manually**
|
|
130
|
+
- MCP server now syncs Puppeteer's `lastPage` when extension reports `tab_activated`
|
|
131
|
+
- Callback pattern avoids circular dependencies between websocket-bridge and page-manager
|
|
132
|
+
- MCP commands automatically target the user's currently active tab
|
|
133
|
+
|
|
134
|
+
### Fixed
|
|
135
|
+
- **Input recording deduplication** in Chrome Extension
|
|
136
|
+
- Extension now records only final text value after blur/Enter or 1.5s pause
|
|
137
|
+
- Eliminated intermediate keystroke recordings (e.g., "test" → "test1" recorded as one action)
|
|
138
|
+
- Improved debouncing with `inputStartValues` tracking
|
|
139
|
+
|
|
140
|
+
## [3.0.2] - 2026-01-25
|
|
141
|
+
|
|
142
|
+
### Added
|
|
143
|
+
- **Extension installation instructions for AI agents**
|
|
144
|
+
- `listTabs`, `switchTab`, `enableRecorder` now include install steps when extension not connected
|
|
145
|
+
- `openBrowser` shows warning when connected to existing Chrome (extension needs manual install)
|
|
146
|
+
- Clear step-by-step instructions with extension path for manual installation
|
|
147
|
+
- Alternative fix: close all Chrome windows and restart MCP for auto-install
|
|
148
|
+
|
|
149
|
+
### Changed
|
|
150
|
+
- Improved extension status reporting with `extensionConnected` flag in responses
|
|
151
|
+
|
|
152
|
+
## [3.0.1] - 2026-01-25
|
|
153
|
+
|
|
154
|
+
### Fixed
|
|
155
|
+
- **Multi-tab support** - Fixed extension-based tab switching
|
|
156
|
+
- `switchTab` now uses Chrome Extension for reliable tab switching
|
|
157
|
+
- Auto-connects Puppeteer to switched tab (fixes `analyzePage` after tab switch)
|
|
158
|
+
- `puppeteerConnected: true` in response confirms Puppeteer sync
|
|
159
|
+
|
|
160
|
+
## [3.0.0] - 2026-01-25
|
|
161
|
+
|
|
162
|
+
### BREAKING CHANGES
|
|
163
|
+
- **Chrome Extension for Recording** - Scenario recording now requires Chrome Extension
|
|
164
|
+
- Old HTML-injection recorder (`injectRecorder`) removed
|
|
165
|
+
- Extension auto-loads when Chrome is started by chrometools-mcp
|
|
166
|
+
- Recording controlled via Extension popup (click CT icon in toolbar)
|
|
167
|
+
|
|
168
|
+
### Added
|
|
169
|
+
- **ChromeTools Chrome Extension** (`extension/` folder)
|
|
170
|
+
- Full tab tracking via Chrome tabs API (catches ALL new tabs including Ctrl+T, context menu)
|
|
171
|
+
- Scenario recording via content script (works across all domains)
|
|
172
|
+
- Popup UI for recording control
|
|
173
|
+
- WebSocket connection to MCP server for real-time communication
|
|
174
|
+
|
|
175
|
+
- **WebSocket Bridge** (`server/websocket-bridge.js`)
|
|
176
|
+
- Bidirectional communication between Extension and MCP server
|
|
177
|
+
- Port 9223 (CHROME_DEBUG_PORT + 1)
|
|
178
|
+
- Tab state sync, recorder commands, scenario save/list
|
|
179
|
+
|
|
180
|
+
- **Auto-load Extension** - Chrome launched with `--load-extension` flag
|
|
181
|
+
- Extension automatically installed when Chrome starts
|
|
182
|
+
- No manual installation required
|
|
183
|
+
|
|
184
|
+
### Changed
|
|
185
|
+
- `enableRecorder` tool now checks Extension connection status instead of injecting HTML
|
|
186
|
+
- Tab tracking improved: Extension provides complete tab list including manually opened tabs
|
|
187
|
+
- Recording state persisted in `chrome.storage.local` (survives cross-domain navigation)
|
|
188
|
+
|
|
189
|
+
### Removed
|
|
190
|
+
- `recorder-script.js` HTML injection functionality (still exists for reference)
|
|
191
|
+
- `pagesWithRecorder` tracking (Extension handles this now)
|
|
192
|
+
- `setupRecorderAutoReinjection` function (Extension handles this now)
|
|
193
|
+
|
|
194
|
+
## [2.9.0] - 2026-01-25
|
|
195
|
+
|
|
196
|
+
### Added
|
|
197
|
+
- **Automatic new tab detection** - Tracks tabs opened via `window.open()`, `target="_blank"`, or user actions
|
|
198
|
+
- New tabs automatically become the active page
|
|
199
|
+
- Network monitoring, console capture, and recorder auto-injection enabled on new tabs
|
|
200
|
+
- New tab events queued for AI notification via `listTabs`
|
|
201
|
+
|
|
202
|
+
- **`listTabs` tool** - List all open browser tabs
|
|
203
|
+
- Returns: `{ tabs: [{ index, url, title, isActive }], totalCount }`
|
|
204
|
+
- Includes `newTabsDetected` array when new tabs were opened since last check
|
|
205
|
+
- Use tab index with `switchTab` to change active tab
|
|
206
|
+
|
|
207
|
+
- **`switchTab` tool** - Switch between browser tabs
|
|
208
|
+
- Parameters: `tab` - Tab index (number) or URL pattern (string, partial match)
|
|
209
|
+
- Makes the specified tab active for subsequent commands
|
|
210
|
+
- Returns: `{ success, switchedTo: { url, title } }`
|
|
211
|
+
|
|
212
|
+
### Changed
|
|
213
|
+
- `openPages` Map now tracks all tabs including those opened externally
|
|
214
|
+
- Browser `targetcreated` event handler added for automatic tab tracking
|
|
215
|
+
|
|
216
|
+
## [2.8.0] - 2026-01-25
|
|
217
|
+
|
|
218
|
+
### Added
|
|
219
|
+
- **`getElementByApomId` tool** - Get detailed element information by APOM ID
|
|
220
|
+
- Parameters: `id` (required) - APOM element ID from analyzePage (e.g., `"input_20"`)
|
|
221
|
+
- Returns: Full element details including bounds, attributes, computed styles, visibility
|
|
222
|
+
- Use case: Inspect specific elements without re-analyzing entire page
|
|
223
|
+
|
|
224
|
+
### Changed
|
|
225
|
+
- **APOM format optimization** - ~82% token reduction
|
|
226
|
+
- Tree-structured output with hierarchical parent-child relationships
|
|
227
|
+
- Minified JSON output (no pretty printing)
|
|
228
|
+
- Parent nodes contain only position info (no bounds/metadata)
|
|
229
|
+
- Interactive elements retain full details (bounds, type, metadata)
|
|
230
|
+
- Groups section for radio/checkbox groups with options
|
|
231
|
+
|
|
232
|
+
- **Separate `id` and `selector` parameters** for click, type, hover, selectOption
|
|
233
|
+
- **PREFERRED**: Use `id` parameter with APOM ID from analyzePage (e.g., `click({ id: "button_45" })`)
|
|
234
|
+
- **ALTERNATIVE**: Use `selector` parameter with CSS selector (e.g., `click({ selector: ".submit" })`)
|
|
235
|
+
- Parameters are mutually exclusive (use one or the other)
|
|
236
|
+
- Makes API clearer: agent knows exactly what it's passing
|
|
237
|
+
- Updated tool descriptions with PREFERRED/ALTERNATIVE guidance
|
|
238
|
+
|
|
239
|
+
### Removed
|
|
240
|
+
- **`registerPageObject` tool** - No longer needed
|
|
241
|
+
- `analyzePage()` now automatically registers elements with unique IDs
|
|
242
|
+
- Use APOM IDs directly with click/type/hover/selectOption tools
|
|
243
|
+
- Simplifies workflow: just call `analyzePage()` and use the returned IDs
|
|
244
|
+
|
|
245
|
+
### Performance
|
|
246
|
+
- APOM token usage reduced from ~31,000 to ~5,684 tokens on typical pages
|
|
247
|
+
- Tree structure eliminates redundant parent information
|
|
248
|
+
- Minified JSON further reduces output size
|
|
249
|
+
|
|
250
|
+
## [2.7.0] - 2026-01-25
|
|
251
|
+
|
|
252
|
+
### 🔄 BREAKING CHANGE
|
|
253
|
+
- **`analyzePage` now returns APOM format by default**
|
|
254
|
+
- Previous default was legacy format, now APOM is default
|
|
255
|
+
- Use `useLegacyFormat: true` to get old format if needed
|
|
256
|
+
- Migration: `analyzePage()` now returns APOM instead of legacy
|
|
257
|
+
- Rationale: APOM is superior - provides unique IDs, better structure, automatic registration
|
|
258
|
+
|
|
259
|
+
### Added
|
|
260
|
+
- **🎉 Agent Page Object Model (APOM) - Now Default Format**
|
|
261
|
+
- `analyzePage()` returns structured APOM format (no parameters needed!)
|
|
262
|
+
- New parameter: `useLegacyFormat` - Return old format (default: false)
|
|
263
|
+
- Parameter: `registerElements` - Auto-register elements (default: true)
|
|
264
|
+
- Parameter: `groupBy: 'type' | 'flat'` - Control element grouping
|
|
265
|
+
- Returns: `{ pageId, url, title, timestamp, elements, groups, metadata }`
|
|
266
|
+
- Each element gets unique ID: `input_0`, `button_1`, `form_0`, `radio_0`, `checkbox_0`
|
|
267
|
+
- Elements automatically registered in persistent `window.__ELEMENT_REGISTRY__`
|
|
268
|
+
- **Use IDs instead of CSS selectors**: `type({ id: "input_0", text: "..." })`
|
|
269
|
+
- **Backward compatible**: Set `useLegacyFormat: true` for old format
|
|
270
|
+
- **Tested**: Fully functional with real-world forms
|
|
271
|
+
|
|
272
|
+
- **New POM Modules**
|
|
273
|
+
- `pom/element-id-generator.js` (171 lines) - Smart ID generation
|
|
274
|
+
- Priority: data-testid > id attribute > semantic path + index
|
|
275
|
+
- Supports: input, button, link, form, textarea, select, radio, checkbox
|
|
276
|
+
- `pom/apom-converter.js` (294 lines) - Convert analyzePage to APOM
|
|
277
|
+
- Transforms legacy format to structured model
|
|
278
|
+
- Groups elements by type (forms, inputs, buttons, links)
|
|
279
|
+
- Generates pageId, metadata
|
|
280
|
+
|
|
281
|
+
- **Input Models Architecture** - Modular input handling system
|
|
282
|
+
- New `models/` directory with specialized input handlers
|
|
283
|
+
- `BaseInputModel` - Abstract base class with common interface (setValue, getValue, clear, focus)
|
|
284
|
+
- `TextInputModel` - Default for text-like inputs (text, email, password, search, tel, url)
|
|
285
|
+
- `TimeInputModel` - Correct handling for `input[type="time"]` via JavaScript value assignment
|
|
286
|
+
- `DateInputModel` - Handles date, datetime-local, month, week inputs
|
|
287
|
+
- `ColorInputModel` - Color picker input handling
|
|
288
|
+
- `RangeInputModel` - Slider/range input handling
|
|
289
|
+
- `SelectModel` - HTML `<select>` element handling
|
|
290
|
+
- `CheckboxModel` - Single checkbox toggle
|
|
291
|
+
- `TextareaModel` - Multi-line text input
|
|
292
|
+
- `InputModelFactory` - Factory pattern for selecting appropriate model
|
|
293
|
+
- Fixes issue where keyboard input didn't work for time inputs (only minutes showed)
|
|
294
|
+
|
|
295
|
+
- **Radio/Checkbox Group Models** - Abstract group-level operations
|
|
296
|
+
- `RadioGroupModel` - Select single option from radio group by name, value, or label text
|
|
297
|
+
- `CheckboxGroupModel` - Multi-select from checkbox group with modes:
|
|
298
|
+
- `set` - Replace all selections
|
|
299
|
+
- `add` - Check additional values
|
|
300
|
+
- `remove` - Uncheck specific values
|
|
301
|
+
- `toggle` - Flip specific values
|
|
302
|
+
|
|
303
|
+
- **`selectFromGroup` tool** - New MCP tool for radio/checkbox group selection
|
|
304
|
+
- Parameters: `name` (required), `value`, `values`, `text`, `texts`, `mode`, `by`
|
|
305
|
+
- Works with radio groups (single selection) and checkbox groups (multi-selection)
|
|
306
|
+
- Match by value attribute or label text (`by: 'value' | 'text' | 'auto'`)
|
|
307
|
+
- Example: `selectFromGroup({ name: "size", value: "large" })`
|
|
308
|
+
- Example: `selectFromGroup({ name: "toppings", values: ["cheese", "bacon"], mode: "add" })`
|
|
309
|
+
|
|
310
|
+
- **Radio/Checkbox Groups in `analyzePage`**
|
|
311
|
+
- APOM output now includes `groups` section with radio and checkbox groups
|
|
312
|
+
- Each group shows: name, all options with values, labels, checked state
|
|
313
|
+
- Labels extracted from: parent `<label>`, `<label for="id">`, aria-label attribute
|
|
314
|
+
- Example output:
|
|
315
|
+
```json
|
|
316
|
+
"groups": {
|
|
317
|
+
"radio": {
|
|
318
|
+
"size": {
|
|
319
|
+
"options": [
|
|
320
|
+
{ "value": "small", "label": "Small", "checked": false },
|
|
321
|
+
{ "value": "large", "label": "Large", "checked": true }
|
|
322
|
+
]
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
"checkbox": { ... }
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Fixed
|
|
330
|
+
- **Critical Bug**: Variable shadowing in analyzePage APOM conversion (commit e1e63e2)
|
|
331
|
+
- Fixed `const analysis` shadowing in else block causing undefined analysis
|
|
332
|
+
- **Critical Bug**: Element registry not persisting across page.evaluate calls (commit faadd0e)
|
|
333
|
+
- Changed `const elementRegistry = new Map()` to `window.__ELEMENT_REGISTRY__`
|
|
334
|
+
- Registry now persists between tool calls
|
|
335
|
+
- All selector-resolver functions exported to window
|
|
336
|
+
- **API Error**: `oneOf` not supported at top level in tool schemas
|
|
337
|
+
- Removed `oneOf` blocks from click, type, hover, selectOption tool definitions
|
|
338
|
+
- Both `id` and `selector` parameters now optional with description indicating one is required
|
|
339
|
+
- Fixes error: `tools.19.custom.input_schema: input_schema does not support oneOf, allOf, or anyOf at the top level`
|
|
340
|
+
|
|
341
|
+
### Changed
|
|
342
|
+
- **`analyzePage` enhanced with APOM support**
|
|
343
|
+
- Now supports both legacy and APOM formats
|
|
344
|
+
- Cache logic updated to handle generateIds parameter
|
|
345
|
+
- Elements automatically registered when generateIds=true
|
|
346
|
+
- Radio/checkbox elements now include label text
|
|
347
|
+
|
|
348
|
+
- **`utils/selector-resolver.js` updated for persistence**
|
|
349
|
+
- Registry stored in `window.__ELEMENT_REGISTRY__` instead of local const
|
|
350
|
+
- All functions (registerElement, resolveSelector, etc.) exported to window
|
|
351
|
+
- Survives across multiple page.evaluate contexts
|
|
352
|
+
|
|
353
|
+
- **`navigateTo` auto-opens browser** - No longer throws error when no page is open
|
|
354
|
+
- Automatically opens browser at specified URL if no page is currently open
|
|
355
|
+
- Eliminates need to manually call `openBrowser` before navigation
|
|
356
|
+
- Falls back gracefully with informative message
|
|
357
|
+
|
|
358
|
+
- **`type` tool uses Input Models** - Automatically selects appropriate model based on input type
|
|
359
|
+
- Time inputs now correctly set full value (e.g., "18:30" not just "30")
|
|
360
|
+
- Date inputs work without keyboard simulation issues
|
|
361
|
+
- All specialized inputs handled by their respective models
|
|
362
|
+
|
|
363
|
+
### Technical Details
|
|
364
|
+
- APOM conversion happens in browser context via page.evaluate
|
|
365
|
+
- Element IDs remain stable across page refreshes (based on testid/id/structure)
|
|
366
|
+
- Dual selector mode: all tools accept both IDs and CSS selectors
|
|
367
|
+
- Input models use JavaScript value assignment with proper event dispatching
|
|
368
|
+
|
|
369
|
+
## [2.6.0] - 2026-01-25
|
|
370
|
+
|
|
371
|
+
### Added
|
|
372
|
+
- **UI Framework Detection** - Automatic detection of UI component libraries (MUI, Ant Design, Chakra UI, Bootstrap, Vuetify, Semantic UI)
|
|
373
|
+
- New utility: `utils/ui-framework-detector.js`
|
|
374
|
+
- Detects framework name, version, and component type for each element
|
|
375
|
+
- Integrated into `analyzePage` - all elements now include `uiFramework` field
|
|
376
|
+
- Extracts options from both native `<select>` and custom framework dropdowns
|
|
377
|
+
|
|
378
|
+
- **Enhanced Select/Dropdown Options Extraction** - Smart extraction of dropdown options from various UI libraries
|
|
379
|
+
- Native HTML `<select>` with `<optgroup>` support
|
|
380
|
+
- Material-UI (MUI) Select components
|
|
381
|
+
- Ant Design Select components
|
|
382
|
+
- Chakra UI, Bootstrap, Vuetify, Semantic UI dropdowns
|
|
383
|
+
- Options include: value, text, index, selected, disabled, group
|
|
384
|
+
- Handles cases where options aren't rendered until dropdown opens (with informative notes)
|
|
385
|
+
|
|
386
|
+
- **Page Object ID Support** - Use element IDs instead of CSS selectors
|
|
387
|
+
- New utility: `utils/selector-resolver.js` - Registry for Page Object element IDs
|
|
388
|
+
- New tool: `registerPageObject` - Register elements from Page Object for use with IDs
|
|
389
|
+
- **Backward compatible**: All interaction tools (click, type, selectOption, hover, etc.) now accept BOTH:
|
|
390
|
+
- Page Object IDs (e.g., `"login_email_input"`)
|
|
391
|
+
- CSS selectors (e.g., `"input[name='email']"`)
|
|
392
|
+
- Element registry persists in page context between tool calls
|
|
393
|
+
|
|
394
|
+
- **`registerPageObject` tool** - Register Page Object elements for ID-based interaction
|
|
395
|
+
- Parameters:
|
|
396
|
+
- `elements` (required) - Array of {id, selector, metadata}
|
|
397
|
+
- `clearExisting` (optional) - Clear registry before registering
|
|
398
|
+
- Enables using meaningful IDs instead of fragile CSS selectors
|
|
399
|
+
- Example: After registering, use `click("login_submit_button")` instead of `click("button[type='submit']")`
|
|
400
|
+
|
|
401
|
+
- **Enhanced Page Object Generation** - Page Objects now include comprehensive element information
|
|
402
|
+
- Each element gets unique ID: `{name}_{timestamp}_{random}`
|
|
403
|
+
- Select elements include full options array with groups
|
|
404
|
+
- UI framework detection for all elements
|
|
405
|
+
- Metadata includes: type, label, placeholder, required, validation hints
|
|
406
|
+
|
|
407
|
+
### Changed
|
|
408
|
+
- **`analyzePage` enhanced with UI framework detection**
|
|
409
|
+
- All form fields and inputs now include `uiFramework` field
|
|
410
|
+
- Select elements use smart extraction: works with both vanilla HTML and UI frameworks
|
|
411
|
+
- Better handling of MUI, Ant Design, and other component libraries
|
|
412
|
+
|
|
413
|
+
- **All interaction tools now support dual selector mode**
|
|
414
|
+
- Tools affected: `click`, `type`, `selectOption`, `hover`, `scrollTo`, `drag`, `setStyles`
|
|
415
|
+
- Automatically resolves Page Object IDs to CSS selectors
|
|
416
|
+
- Error messages indicate whether identifier was Page Object ID or CSS selector
|
|
417
|
+
- No breaking changes - existing CSS selector usage works unchanged
|
|
418
|
+
|
|
419
|
+
### Technical Details
|
|
420
|
+
- Selector resolution happens in page context using injected `selector-resolver.js`
|
|
421
|
+
- UI framework detection uses class names, data attributes, and DOM structure analysis
|
|
422
|
+
- Element registry stored in browser page context (survives navigation within same page)
|
|
423
|
+
- New helper function `resolveSelector(page, identifier)` in `index.js`
|
|
424
|
+
|
|
5
425
|
## [2.5.0] - 2026-01-21
|
|
6
426
|
|
|
7
427
|
### Added
|