{"record":{"id":"a48ae03770a70952","repo":"grafana/k6","slug":"pressing-the-mouse-button-on-x-f-y-f-w","errorCode":null,"errorMessage":"pressing the mouse button on x:%f y:%f: %w","messagePattern":"pressing the mouse button on x:(.+?) y:(.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/mouse.go","lineNumber":80,"sourceCode":"\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// DblClick will trigger Click twice in quick succession.\nfunc (m *Mouse) DblClick(x float64, y float64, opts *MouseDblClickOptions) error {\n\tif err := m.click(x, y, opts.ToMouseClickOptions()); err != nil {\n\t\treturn fmt.Errorf(\"double clicking on x:%f y:%f: %w\", x, y, err)\n\t}\n\treturn nil\n}\n\n// Down will trigger a MouseDown event in the browser.\nfunc (m *Mouse) Down(opts *MouseDownUpOptions) error {\n\tif err := m.down(opts); err != nil {\n\t\treturn fmt.Errorf(\"pressing the mouse button on x:%f y:%f: %w\", m.x, m.y, err)\n\t}\n\treturn nil\n}\n\nfunc (m *Mouse) down(opts *MouseDownUpOptions) error {\n\tm.button = input.MouseButton(opts.Button)\n\taction := input.DispatchMouseEvent(input.MousePressed, m.x, m.y).\n\t\tWithButton(input.MouseButton(opts.Button)).\n\t\tWithModifiers(input.Modifier(m.keyboard.modifiers)).\n\t\tWithClickCount(opts.ClickCount)\n\tif err := action.Do(cdp.WithExecutor(m.ctx, m.session)); err != nil {\n\t\treturn fmt.Errorf(\"mouse down: %w\", err)\n\t}\n\treturn nil\n}\n\n// Up will trigger a MouseUp event in the browser.\nfunc (m *Mouse) Up(opts *MouseDownUpOptions) error {","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/mouse.go#L62-L98","documentation":"Thrown by Mouse.Down() when the internal m.down() fails at the CDP level. Down() dispatches Input.dispatchMouseEvent(mousePressed) at the mouse's current coordinates (m.x, m.y), so it fails when the DevTools session is gone (page closed, target crashed, browser exit) or the protocol call is rejected mid-press.","triggerScenarios":"mouse.down() called after page.close(), browser.disconnect(), or a target crash; pressing while a navigation destroys the session; dispatch rejected due to an invalid state in the input domain.","commonSituations":"Simulating drag-and-drop (down/move/up) where the drag triggers navigation or the page closes mid-gesture; long-running tests where the browser died between operations; forgetting to move the mouse to a valid position first.","solutions":["Check page.isClosed() and browser connectivity before starting a press-hold gesture","Perform down/move/up in one tight sequence with no awaits on navigation in between","Re-establish the page and restart the gesture if the session dropped","Avoid triggering actions in mousedown handlers that navigate away mid-gesture"],"exampleFix":"// before\nawait page.mouse.down();\nawait page.goto('/'); // gesture context lost\nawait page.mouse.up();\n\n// after\nawait page.mouse.down();\nawait page.mouse.move(200, 300, { steps: 5 });\nawait page.mouse.up(); // complete gesture before any navigation","handlingStrategy":"try-catch","validationCode":"if (page.isClosed()) throw new Error('page closed before press');\nawait page.mouse.move(x, y);\nawait page.mouse.down();","typeGuard":null,"tryCatchPattern":"try {\n  await page.mouse.down();\n} catch (e) {\n  if (/target closed|session|context destroyed/i.test(e.message)) {\n    throw new Error('mouse session lost; restart gesture on a new page');\n  }\n  throw e;\n}","preventionTips":["Complete down/move/up without intervening navigation","Check the page is open before each gesture phase","Create a fresh Mouse per page; never reuse across pages"],"tags":["browser","mouse","cdp","drag"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}