Rename the command from "browser multi-click" to "browser batch-click"
per @AsenL's request. Updated across all files: implementation, action
enum, CLI wiring, router, output formatting, and all tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- multi_click_sequential_json: verifies 3 buttons clicked in order
with correct response shape (total, clicked, results array,
changed.url_changed + focus_changed, context, meta)
- multi_click_partial_failure_json: verifies MULTI_CLICK_PARTIAL
error with successful-prefix results and failed_at details when
second selector doesn't exist
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add pre/post focus state tracking to match interaction command contract
- Include focus_changed in changed object alongside url_changed
- Add 3 parser tests: basic multi-selector, missing selectors, --delay flag
- Make dispatch_click and get_active_element_id reusable from click.rs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a multi-click command that accepts multiple selectors and clicks
them in sequence. Stops on the first failure, returning partial results
with details about which clicks succeeded. Supports --delay for
inter-click timing and all click options (button, count).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Increase DevTools URL discovery timeout from 15s to 30s for CI environments
- Relax snap_selector_flag_limits_subtree assertion to allow ±2 node tolerance
- Increase E2E test workflow timeout to 20 minutes
Move Installation before Quick Start with npm and cargo-from-source
options. Simplify Quick Start to usage only. Add dedicated AI Agent
Skills section.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Chrome 146+ may enforce Trusted Types on certain pages, causing
innerHTML assignments to fail. Replace innerHTML with createElement
+ appendChild in install_select_fixture.
Three issues fixed:
1. Input.dispatchKeyEvent routes to Chrome's active tab, ignoring sessionId.
- type: add Target.activateTarget before key dispatch loop
- press: add Target.activateTarget before key dispatch
2. type command used minimal key definitions (just key+text) which didn't
trigger native text insertion on contenteditable elements.
- Reuse key_definition() from press module for full CDP key definitions
(code, windowsVirtualKeyCode, nativeVirtualKeyCode, unmodifiedText)
3. Contenteditable e2e test fixture had element at top:500px, whose center
(y=531) exceeded headless viewport height (513), causing click to miss.
- Changed to top:200px
Closes ACT-822
CDP DOM.focus fails on contenteditable divs (e.g., Lark/Notion/Slate editors)
with "Element is not focusable" (-32000). This change adds a JS .focus()
fallback and click-to-place-cursor for rich text editors.
Changes:
- Add TabContext::focus_element() with JS .focus() fallback when DOM.focus fails
- type command: detect contenteditable and click element center to establish
cursor position (required by Slate/ProseMirror internal cursor management)
- fill/focus commands: use focus_element() instead of raw DOM.focus
- Add E2E tests for type and focus on contenteditable elements
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[packages/cli]fix: graceful Chrome shutdown via SIGTERM before SIGKILL
Send SIGTERM first so Chrome can flush Preferences (window placement,
cookies, etc.), wait up to 3s for graceful exit, then fall back to
SIGKILL. This allows Chrome to restore window position and size on
next launch.
Send SIGTERM first so Chrome can flush Preferences (window placement,
cookies, etc.), wait up to 3s for graceful exit, then fall back to
SIGKILL. This allows Chrome to restore window position and size on
next launch.