grafana/k6 · error
parsing double click options
Error message
parsing double click options: %w
What it means
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.
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')
Example fix
// before
await page.dblclick('#item', { modifiers: 'Shift', position: { x: '5', y: '5' } });
// parsing double click options: ...
// after
await page.dblclick('#item', { modifiers: ['Shift'], position: { x: 5, y: 5 } }); Defensive patterns
Strategy: validation
Validate before calling
const ok = (opts?.modifiers === undefined ||
(Array.isArray(opts.modifiers) && opts.modifiers.every(m => typeof m === 'string')))
&& (opts?.position === undefined ||
(typeof opts.position === 'object' && Number.isFinite(opts.position.x) && Number.isFinite(opts.position.y)));
if (!ok) throw new Error('dblclick: modifiers must be string[], position must be {x,y} numbers');
await page.dblclick(selector, opts); Type guard
/** @param {unknown} m */
function isModifierList(m) {
return m === undefined || (Array.isArray(m) && m.every(x => typeof x === 'string'));
}
/** @param {unknown} p */
function isPosition(p) {
return p === undefined || (typeof p === 'object' && p !== null
&& Number.isFinite(/** @type {any} */ (p).x)
&& Number.isFinite(/** @type {any} */ (p).y));
} Try / catch
try {
await page.dblclick(selector, opts);
} catch (e) {
if (String(e).includes('parsing double click options')) {
console.warn(`bad dblclick opts for ${selector}, retrying plain`);
await page.dblclick(selector);
} else throw e;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- parsing hover options
- parsing double click options
- parsing hover options
- parsing hover options
- parsing locator tap options
AI-assisted analysis of grafana/k6@8d06114777 (2026-09-14).
Data as JSON: /api/errors/0d1919e3c6df483c.
Report an issue: GitHub.
Appendix: source
Thrown at internal/js/modules/k6/browser/browser/page_mapping.go:75
// Now it's safe to close the taskqueue for this targetID.
vu.close(p.TargetID())
return nil, err //nolint:wrapcheck
})
},
"content": func() *sobek.Promise {
return promise(vu, func() (any, error) {
return p.Content() //nolint:wrapcheck
})
},
"context": func() mapping {
return mapBrowserContext(vu, p.Context())
},
"dblclick": func(selector string, opts sobek.Value) (*sobek.Promise, error) {
popts, err := parseFrameDblclickOptions(rt, opts, p.MainFrame().Timeout())
if err != nil {
return nil, fmt.Errorf("parsing double click options: %w", err)
}
return promise(vu, func() (any, error) {
return nil, p.Dblclick(selector, popts) //nolint:wrapcheck
}), nil
},
"dispatchEvent": func(selector, typ string, eventInit, opts sobek.Value) (*sobek.Promise, error) {
popts, err := parseFrameDispatchEventOptions(rt, opts, p.MainFrame().Timeout())
if err != nil {
return nil, fmt.Errorf("parsing page dispatch event options: %w", err)
}
earg := exportArg(eventInit)
return promise(vu, func() (any, error) {
return nil, p.DispatchEvent(selector, typ, earg, popts) //nolint:wrapcheck
}), nil
},
"emulateMedia": func(opts sobek.Value) (*sobek.Promise, error) {
popts, err := parsePageEmulateMediaOptions(rt, opts, common.NewPageEmulateMediaOptions(p))
if err != nil {View on GitHub (pinned to 8d06114777)