grafana/k6 · error

parsing page dispatch event options

Error message

parsing page dispatch event options: %w

What it means

Thrown synchronously by page.dispatchEvent(selector, type, eventInit, opts) when FrameDispatchEventOptions.Parse fails. In the current codebase this wrapper is defensive only: FrameDispatchEventOptions embeds FrameBaseOptions, whose Parse (internal/js/modules/k6/browser/common/frame_options.go:218-232) accepts only 'strict' (ToBoolean) and 'timeout' (ToInteger) and unconditionally returns nil. Unknown option keys are silently ignored and bad values are coerced, so the error cannot fire on this k6 version.

Solutions

  1. Keep opts to the documented keys — only timeout (milliseconds) and strict (boolean) are read for dispatchEvent
  2. If hit on a custom build, check that FrameBaseOptions.Parse in your tree matches upstream expectations and pass plain types
  3. Pass no options at all when defaults suffice: page.dispatchEvent(sel, 'click', { ... })

Example fix

// before
await page.dispatchEvent('#el', 'custom', {}, { timeout: '30s' });

// after
await page.dispatchEvent('#el', 'custom', {}, { timeout: 30000 });
Defensive patterns

Strategy: validation

Validate before calling

const ALLOWED = new Set(['timeout', 'strict']);
const bad = Object.keys(opts ?? {}).filter(k => !ALLOWED.has(k));
if (bad.length) console.warn(`dispatchEvent ignores unknown options: ${bad.join(', ')}`);
if (opts?.timeout !== undefined && !Number.isInteger(opts.timeout)) {
  throw new Error('dispatchEvent timeout must be integer milliseconds');
}
await page.dispatchEvent(selector, type, eventInit, opts);

Type guard

/** @param {unknown} o */
function isDispatchOpts(o) {
  if (o === undefined || o === null) return true;
  if (typeof o !== 'object') return false;
  const t = /** @type {any} */ (o).timeout;
  const s = /** @type {any} */ (o).strict;
  return (t === undefined || Number.isInteger(t)) && (s === undefined || typeof s === 'boolean');
}

Try / catch

try {
  await page.dispatchEvent(selector, type, eventInit, opts);
} catch (e) {
  if (String(e).includes('parsing page dispatch event options')) {
    await page.dispatchEvent(selector, type, eventInit); // retry with defaults
  } else throw e;
}

Prevention

When it happens

Trigger: No current input reaches this error; it exists to wrap future validation of strict/timeout. If you see it, you are likely on a fork or a different k6 version where FrameBaseOptions.Parse validates types (e.g. timeout as a non-numeric, non-coercible value).

Common situations: Running scripts against a custom xk6 build or a patched browser module that added strict timeout validation; upgrading k6 versions where the shared FrameBaseOptions parser gained error paths.

Related errors


AI-assisted analysis of grafana/k6@8d06114777 (2026-09-14). Data as JSON: /api/errors/490ca99de703af5b. Report an issue: GitHub.

Appendix: source

Thrown at internal/js/modules/k6/browser/browser/page_mapping.go:84

				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 {
				return nil, fmt.Errorf("parsing emulateMedia options: %w", err)
			}
			return promise(vu, func() (any, error) {
				return nil, p.EmulateMedia(popts) //nolint:wrapcheck
			}), nil
		},
		"emulateVisionDeficiency": func(typ string) *sobek.Promise {
			return promise(vu, func() (any, error) {
				return nil, p.EmulateVisionDeficiency(typ) //nolint:wrapcheck

View on GitHub (pinned to 8d06114777)