{"record":{"id":"0d1919e3c6df483c","repo":"grafana/k6","slug":"parsing-double-click-options-w-0d1919","errorCode":null,"errorMessage":"parsing double click options: %w","messagePattern":"parsing double click options: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/browser/page_mapping.go","lineNumber":75,"sourceCode":"\n\t\t\t\t// Now it's safe to close the taskqueue for this targetID.\n\t\t\t\tvu.close(p.TargetID())\n\n\t\t\t\treturn nil, err //nolint:wrapcheck\n\t\t\t})\n\t\t},\n\t\t\"content\": func() *sobek.Promise {\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn p.Content() //nolint:wrapcheck\n\t\t\t})\n\t\t},\n\t\t\"context\": func() mapping {\n\t\t\treturn mapBrowserContext(vu, p.Context())\n\t\t},\n\t\t\"dblclick\": func(selector string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameDblclickOptions(rt, opts, p.MainFrame().Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing double click options: %w\", err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, p.Dblclick(selector, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"dispatchEvent\": func(selector, typ string, eventInit, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameDispatchEventOptions(rt, opts, p.MainFrame().Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing page dispatch event options: %w\", err)\n\t\t\t}\n\t\t\tearg := exportArg(eventInit)\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, p.DispatchEvent(selector, typ, earg, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"emulateMedia\": func(opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parsePageEmulateMediaOptions(rt, opts, common.NewPageEmulateMediaOptions(p))\n\t\t\tif err != nil {","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/grafana/k6/blob/8d06114777191d21ef885d05c5f8aa9e1ed838ae/internal/js/modules/k6/browser/browser/page_mapping.go#L57-L93","documentation":"Thrown synchronously by page.dblclick(selector, opts) when FrameDblclickOptions.Parse fails. Two inner branches can fail (internal/js/modules/k6/browser/common/element_handle_options.go:336-359): 'position' must export to an object with numeric x/y, and 'modifiers' must export to an array of strings via rt.ExportTo. button, delay, force, noWaitAfter, timeout, trial and strict are coerced and never fail.","triggerScenarios":"page.dblclick(sel, { modifiers: 'Shift' }) — a string instead of an array; modifiers: [1, 2] with non-string items; position: { x: '10', y: 10 } or position: 'topLeft'; any position value that is not a plain object of numbers.","commonSituations":"Copy-pasting Playwright code where modifiers was written as a single key name; building modifiers conditionally so it is sometimes undefined-shaped; reading coordinates or modifier lists from JSON where types are strings or mixed.","solutions":["Use an array of strings for modifiers: page.dblclick(sel, { modifiers: ['Shift'] })","Use a numeric coordinate object for position: { position: { x: 10, y: 10 } }","Normalize data-sourced values before the call: Array.isArray(modifiers) && modifiers.every(m => typeof m === 'string')"],"exampleFix":"// before\nawait page.dblclick('#item', { modifiers: 'Shift', position: { x: '5', y: '5' } });\n// parsing double click options: ...\n\n// after\nawait page.dblclick('#item', { modifiers: ['Shift'], position: { x: 5, y: 5 } });","handlingStrategy":"validation","validationCode":"const ok = (opts?.modifiers === undefined ||\n  (Array.isArray(opts.modifiers) && opts.modifiers.every(m => typeof m === 'string')))\n  && (opts?.position === undefined ||\n  (typeof opts.position === 'object' && Number.isFinite(opts.position.x) && Number.isFinite(opts.position.y)));\nif (!ok) throw new Error('dblclick: modifiers must be string[], position must be {x,y} numbers');\nawait page.dblclick(selector, opts);","typeGuard":"/** @param {unknown} m */\nfunction isModifierList(m) {\n  return m === undefined || (Array.isArray(m) && m.every(x => typeof x === 'string'));\n}\n\n/** @param {unknown} p */\nfunction isPosition(p) {\n  return p === undefined || (typeof p === 'object' && p !== null\n    && Number.isFinite(/** @type {any} */ (p).x)\n    && Number.isFinite(/** @type {any} */ (p).y));\n}","tryCatchPattern":"try {\n  await page.dblclick(selector, opts);\n} catch (e) {\n  if (String(e).includes('parsing double click options')) {\n    console.warn(`bad dblclick opts for ${selector}, retrying plain`);\n    await page.dblclick(selector);\n  } else throw e;\n}","preventionTips":["Always bracket modifiers: ['Shift'], never 'Shift'","Keep option objects in typed constants instead of inline literals","Validate externally sourced option objects once at script setup"],"tags":["k6","browser","page","dblclick","options","modifiers","position"],"backgroundTag":"invalid-option-type","analyzedSha":"8d06114777191d21ef885d05c5f8aa9e1ed838ae","analyzedAt":"2026-09-14T20:10:14.619Z","contentChangedAt":"2026-09-14T20:10:14.619Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}