grafana/k6 · error

parsing element fill options: %w

Error message

parsing element fill options: %w

What it means

Thrown synchronously by ElementHandle.fill() when its options object fails to parse. fill() parses common.ElementHandleBaseOptions (force, noWaitAfter, timeout), whose Parse in common/element_handle_options.go only performs lenient coercions and always returns nil in current k6, so this wrap is defensive and effectively unreachable today. If you do see it, you are likely on an older xk6-browser build where base-option parsing was structural, or hitting a regression.

Source

Thrown at internal/js/modules/k6/browser/browser/element_handle_mapping.go:74

		},
		"dblclick": func(opts sobek.Value) (*sobek.Promise, error) {
			popts := common.NewElementHandleDblclickOptions(eh.DefaultTimeout())
			if err := popts.Parse(vu.Context(), opts); err != nil {
				return nil, fmt.Errorf("parsing element double click options: %w", err)
			}
			return promise(vu, func() (any, error) {
				return nil, eh.Dblclick(popts) //nolint:wrapcheck
			}), nil
		},
		"dispatchEvent": func(typ string, eventInit sobek.Value) *sobek.Promise {
			return promise(vu, func() (any, error) {
				return nil, eh.DispatchEvent(typ, exportArg(eventInit)) //nolint:wrapcheck
			})
		},
		"fill": func(value string, opts sobek.Value) (*sobek.Promise, error) {
			popts := common.NewElementHandleBaseOptions(eh.DefaultTimeout())
			if err := popts.Parse(vu.Context(), opts); err != nil {
				return nil, fmt.Errorf("parsing element fill options: %w", err)
			}
			return promise(vu, func() (any, error) {
				return nil, eh.Fill(value, popts) //nolint:wrapcheck
			}), nil
		},
		"focus": func() *sobek.Promise {
			return promise(vu, func() (any, error) {
				return nil, eh.Focus() //nolint:wrapcheck
			})
		},
		"getAttribute": func(name string) *sobek.Promise {
			return promise(vu, func() (any, error) {
				s, ok, err := eh.GetAttribute(name)
				if err != nil {
					return nil, err //nolint:wrapcheck
				}
				if !ok {
					return nil, nil

View on GitHub (pinned to 93accf6570)

Solutions

  1. Keep the options object to the documented keys: { force: true|false, noWaitAfter: true|false, timeout: <ms number> }
  2. Ensure timeout is a number of milliseconds, not a string like '5s' (strings coerce to 0 or NaN, silently changing behavior)
  3. If the error persists, reproduce with a minimal options object and report the k6 version, since current Parse cannot fail here
  4. Check the wrapped cause after the colon: it identifies which field actually failed in your k6 build

Example fix

// before
await el.fill('hello', { timeout: '5s', force: 'yes' });

// after
await el.fill('hello', { timeout: 5000, force: true });
Defensive patterns

Strategy: try-catch

Validate before calling

const ALLOWED = new Set(['force', 'noWaitAfter', 'timeout']);
const bad = Object.keys(opts || {}).filter(k => !ALLOWED.has(k));
if (bad.length) console.warn(`fill(): ignoring unsupported options: ${bad.join(', ')}`);
if (opts?.timeout !== undefined && !Number.isFinite(Number(opts.timeout))) {
  throw new Error('fill(): timeout must be a number of milliseconds');
}

Type guard

function isFillOpts(o) {
  if (o == null) return true;
  return (o.force === undefined || typeof o.force === 'boolean') &&
         (o.noWaitAfter === undefined || typeof o.noWaitAfter === 'boolean') &&
         (o.timeout === undefined || Number.isFinite(o.timeout));
}

Try / catch

try {
  await el.fill('hello', opts);
} catch (e) {
  if (/parsing element fill options/.test(String(e.message))) {
    console.log(`fix fill options: ${e.message}`); // current k6 cannot raise this; check version
  } else throw e;
}

Prevention

When it happens

Trigger: In current code, none: any value for force/noWaitAfter/timeout is coerced (ToBoolean/ToInteger) and unknown keys are ignored. Historically, passing a non-object options value whose fields failed structural export produced this error.

Common situations: Running scripts written against old xk6-browser versions (pre k6 v0.4x browser module GA) on a newer binary or vice versa; misattributing a fill() failure to options when the real error (e.g. element not an input) happens later inside the promise.

Related errors


AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15). Data as JSON: /api/errors/5c7a526ec32b6b29. Report an issue: GitHub.