{"record":{"id":"870dcf02b8df51ef","repo":"grafana/k6","slug":"moving-the-mouse-pointer-to-x-f-y-f-w","errorCode":null,"errorMessage":"moving the mouse pointer to x:%f y:%f: %w","messagePattern":"moving the mouse pointer to x:(.+?) y:(.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/mouse.go","lineNumber":121,"sourceCode":"}\n\nfunc (m *Mouse) up(opts *MouseDownUpOptions) error {\n\tm.button = input.None\n\taction := input.DispatchMouseEvent(input.MouseReleased, 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 up: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// Move will trigger a MouseMoved event in the browser.\nfunc (m *Mouse) Move(x float64, y float64, opts *MouseMoveOptions) error {\n\tif err := m.move(x, y, opts); err != nil {\n\t\treturn fmt.Errorf(\"moving the mouse pointer to x:%f y:%f: %w\", x, y, err)\n\t}\n\treturn nil\n}\n\nfunc (m *Mouse) move(x float64, y float64, opts *MouseMoveOptions) error {\n\tfromX := m.x\n\tfromY := m.y\n\tm.x = x\n\tm.y = y\n\tfor i := int64(1); i <= opts.Steps; i++ {\n\t\tx := fromX + (m.x-fromX)*float64(i/opts.Steps)\n\t\ty := fromY + (m.y-fromY)*float64(i/opts.Steps)\n\t\taction := input.DispatchMouseEvent(input.MouseMoved, x, y).\n\t\t\tWithButton(m.button).\n\t\t\tWithModifiers(input.Modifier(m.keyboard.modifiers))\n\t\tif err := action.Do(cdp.WithExecutor(m.ctx, m.session)); err != nil {\n\t\t\treturn fmt.Errorf(\"mouse move: %w\", err)\n\t\t}","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/mouse.go#L103-L139","documentation":"Thrown by Mouse.Move(x, y) when the internal m.move() fails. Move() dispatches one or more Input.dispatchMouseEvent(mouseMoved) events interpolated over opts.Steps from the current position to (x, y). Any single step failing (session gone, target crashed) aborts with this wrapped error; a steps value of 0 makes no dispatches and cannot fail this way.","triggerScenarios":"mouse.move(x, y, {steps}) where the session dies mid-loop: page.close() during the move, browser crash, target destroyed by navigation between steps; very many steps extending exposure to session loss.","commonSituations":"Drag-and-drop gestures with many steps across a slow page; move interrupted by SPA navigation triggered by hover; remote browser connection drop mid-gesture.","solutions":["Keep gestures short: use a modest steps count and avoid awaits/navigation during the move","Verify page.isClosed() before starting the move","Recreate the page and restart the gesture if this fires","Stabilize the environment (memory, remote endpoint) if crashes are frequent"],"exampleFix":"// before\nawait page.mouse.move(600, 400, { steps: 50 }); // long exposure window\n\n// after\nif (page.isClosed()) throw new Error('page closed');\nawait page.mouse.move(600, 400, { steps: 10 });","handlingStrategy":"try-catch","validationCode":"if (page.isClosed()) throw new Error('page closed');\nawait page.mouse.move(x, y, { steps: 10 });","typeGuard":null,"tryCatchPattern":"try {\n  await page.mouse.move(x, y, { steps });\n} catch (e) {\n  if (/target closed|session/i.test(e.message)) {\n    throw new Error('session lost mid-move; restart gesture');\n  }\n  throw e;\n}","preventionTips":["Use a small steps count (5-10) to limit exposure","No navigation or long awaits during multi-step moves","Verify page state before each gesture"],"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"}