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

  1. Use an array of strings for modifiers: page.dblclick(sel, { modifiers: ['Shift'] })
  2. Use a numeric coordinate object for position: { position: { x: 10, y: 10 } }
  3. 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

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


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)