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 = y

View on GitHub (pinned to 93accf6570)

Solutions

  1. Verify the browser and page are still alive before the release call
  2. Treat this error as session-lost: recreate the page (and Mouse) rather than retrying up() alone
  3. Fix the root cause: memory limits for Chromium, fewer parallel pages, stable remote endpoint
  4. 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

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


AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15). Data as JSON: /api/errors/f3ca296c7998d347. Report an issue: GitHub.