grafana/k6 · error
mouse up: %w
Error message
mouse up: %w
What it means
Root-level error from the internal Mouse.up(): the CDP Input.dispatchMouseEvent(mouseReleased) call itself failed. This is a raw Chrome DevTools Protocol failure, meaning the session or target is gone (page closed, browser crashed, connection dropped) rather than a problem with the release action itself.
Source
Thrown at internal/js/modules/k6/browser/common/mouse.go:112
return nil
}
// Up will trigger a MouseUp event in the browser.
func (m *Mouse) Up(opts *MouseDownUpOptions) error {
if err := m.up(opts); err != nil {
return fmt.Errorf("releasing the mouse button on x:%f y:%f: %w", m.x, m.y, err)
}
return nil
}
func (m *Mouse) up(opts *MouseDownUpOptions) error {
m.button = input.None
action := input.DispatchMouseEvent(input.MouseReleased, m.x, m.y).
WithButton(input.MouseButton(opts.Button)).
WithModifiers(input.Modifier(m.keyboard.modifiers)).
WithClickCount(opts.ClickCount)
if err := action.Do(cdp.WithExecutor(m.ctx, m.session)); err != nil {
return fmt.Errorf("mouse up: %w", err)
}
return nil
}
// Move will trigger a MouseMoved event in the browser.
func (m *Mouse) Move(x float64, y float64, opts *MouseMoveOptions) error {
if err := m.move(x, y, opts); err != nil {
return fmt.Errorf("moving the mouse pointer to x:%f y:%f: %w", x, y, err)
}
return nil
}
func (m *Mouse) move(x float64, y float64, opts *MouseMoveOptions) error {
fromX := m.x
fromY := m.y
m.x = x
m.y = yView on GitHub (pinned to 93accf6570)
Solutions
- Verify the browser and page are still alive before the release call
- Treat this error as session-lost: recreate the page (and Mouse) rather than retrying up() alone
- Fix the root cause: memory limits for Chromium, fewer parallel pages, stable remote endpoint
- Fail fast on earlier errors so input is never dispatched to a dead session
Example fix
// before
await page.mouse.up(); // on a possibly dead session
// after
if (page.isClosed()) throw new Error('cannot release mouse: page closed');
await page.mouse.up(); Defensive patterns
Strategy: try-catch
Validate before calling
if (page.isClosed()) throw new Error('page closed');
await page.mouse.up(); Try / catch
try {
await page.mouse.up();
} catch (e) {
if (/target closed|connection refused|websocket/i.test(e.message)) {
throw new Error('CDP connection lost; browser likely dead');
}
throw e;
} Prevention
- Watch for OOM kills of Chromium in container logs
- Wrap whole gestures (down+move+up) so failures restart cleanly
- Keep remote browser endpoints stable and version-matched
When it happens
Trigger: action.Do(cdp.WithExecutor(...)) for mouseReleased returning an error: DevTools websocket closed, target destroyed by navigation/close, browser process exit, or remote CDP connection failure.
Common situations: Browser killed by OOM mid-test; page closed between down and up; remote browser endpoint restarted; test code swallowing an earlier failure and continuing to drive a dead session.
Related errors
- mouse down: %w
- mouse move: %w
- evaluating pointer action: %w
- run if waiting for debugger to attach: %w
- internal error while enabling %T: %w
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/f3ca296c7998d347.
Report an issue: GitHub.