{"record":{"id":"1a37cd2f971839e6","repo":"grafana/k6","slug":"parsing-double-click-options-w","errorCode":null,"errorMessage":"parsing double click options: %w","messagePattern":"parsing double click options: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/browser/frame_mapping.go","lineNumber":55,"sourceCode":"\t\t\tpopts, err := parseFrameClickOptions(vu.Context(), opts, f.Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\terr := f.Click(selector, popts)\n\t\t\t\treturn nil, err //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"content\": func() *sobek.Promise {\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn f.Content() //nolint:wrapcheck\n\t\t\t})\n\t\t},\n\t\t\"dblclick\": func(selector string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts := common.NewFrameDblClickOptions(f.Timeout())\n\t\t\tif err := popts.Parse(vu.Context(), opts); 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, f.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 := common.NewFrameDispatchEventOptions(f.Timeout())\n\t\t\tif err := popts.Parse(vu.Context(), opts); err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing frame 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, f.DispatchEvent(selector, typ, earg, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"evaluate\": func(pageFunc sobek.Value, gargs ...sobek.Value) (*sobek.Promise, error) {\n\t\t\tif sobekEmptyString(pageFunc) {\n\t\t\t\treturn nil, fmt.Errorf(\"evaluate requires a page function\")","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/browser/frame_mapping.go#L37-L73","documentation":"The options object passed to frame.dblclick(selector, opts) failed to parse (frame_mapping.go:55). ElementHandleDblclickOptions parses 'position' (must be {x: number, y: number}) and 'modifiers' (must be an array of strings); either failing to export throws this error synchronously.","triggerScenarios":"frame.dblclick('#el', { position: '10,10' }) or { modifiers: 'Shift' } (string instead of array) - the sobek ExportTo into map[string]float64 or []string fails and the wrapper adds 'parsing double click options:'.","commonSituations":"Reusing mouse-action option objects where modifiers were stored as a comma-separated string; ported Playwright snippets with tuple positions; config-driven option objects where types loosen at the JSON boundary.","solutions":["Use { modifiers: ['Alt', 'Shift'] } and { position: { x: 10, y: 20 } }","Split string modifiers before the call: { modifiers: raw.split(',') }","Coerce positions from strings: { position: { x: Number(p.x), y: Number(p.y) } }"],"exampleFix":"// before\nframe.dblclick('#row', { modifiers: 'Shift', position: [5, 5] });\n// after\nframe.dblclick('#row', { modifiers: ['Shift'], position: { x: 5, y: 5 } });","handlingStrategy":"type-guard","validationCode":"const norm = {\n  ...opts,\n  ...(opts?.modifiers && !Array.isArray(opts.modifiers) ? { modifiers: String(opts.modifiers).split(',') } : {}),\n  ...(opts?.position ? { position: { x: Number(opts.position.x), y: Number(opts.position.y) } } : {}),\n};","typeGuard":"function isDblclickOptions(o) {\n  if (o == null) return true;\n  const posOk = o.position == null || (typeof o.position === 'object' && !Array.isArray(o.position)\n    && Number.isFinite(Number(o.position.x)) && Number.isFinite(Number(o.position.y)));\n  const modOk = o.modifiers == null || (Array.isArray(o.modifiers) && o.modifiers.every(m => typeof m === 'string'));\n  return posOk && modOk;\n}","tryCatchPattern":"try {\n  await frame.dblclick(sel, norm);\n} catch (e) {\n  if (String(e.message).includes('parsing double click options')) throw new Error(`bad dblclick opts for ${sel}: ${JSON.stringify(opts)}`);\n  throw e;\n}","preventionTips":["modifiers is an array of strings; position is {x, y} numbers","Normalize once at the config boundary instead of at each call site","Reuse one shared option-validator for click, dblclick, and hover"],"tags":["k6","browser","frame","options-parsing","javascript"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}