grafana/k6 · error

parse isEditabled options of selector

Error message

parse isEditabled options of selector %q: %w

What it means

Thrown synchronously by page.isEditable(selector, opts) when FrameIsEditableOptions.Parse fails. The embedded FrameBaseOptions.Parse (internal/js/modules/k6/browser/common/frame_options.go:218-232) always returns nil on stock k6, so this wrapper is defensive/unreachable there. Note the wrapper text contains a known typo — 'isEditabled' instead of 'isEditable' (page_mapping.go:309) — useful when grepping logs or source.

Solutions

  1. Pass only strict and timeout (integer ms) in opts
  2. Omit opts for defaults
  3. When filtering logs, match the literal (misspelled) message text 'isEditabled'

Example fix

// before
await page.isEditable('#field', { timeout: '1s' });

// after
await page.isEditable('#field', { timeout: 1000 });
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(`isEditable ignores unknown options: ${bad.join(', ')}`);
if (opts?.timeout !== undefined && !Number.isInteger(opts.timeout)) {
  throw new Error('isEditable timeout must be integer milliseconds');
}
await page.isEditable(selector, opts);

Type guard

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

Try / catch

try {
  return await page.isEditable(selector, opts);
} catch (e) {
  // note: the thrown message contains the typo 'isEditabled'
  if (String(e).includes('isEditabled options')) {
    return await page.isEditable(selector);
  } throw e;
}

Prevention

When it happens

Trigger: Not reachable with current stock code; a custom parser validating strict/timeout could raise it. Searching for 'isEditable options' in logs will miss it because of the typo — search 'isEditabled'.

Common situations: Custom builds with stricter validation; grep-based log analysis defeated by the typo'd message.

Related errors


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

Appendix: source

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

			}
			return promise(vu, func() (any, error) {
				return p.IsChecked(selector, popts) //nolint:wrapcheck
			}), nil
		},
		"isClosed": p.IsClosed,
		"isDisabled": func(selector string, opts sobek.Value) (*sobek.Promise, error) {
			popts, err := parseFrameIsDisabledOptions(rt, opts, p.MainFrame().Timeout())
			if err != nil {
				return nil, fmt.Errorf("parse isDisabled options of selector %q: %w", selector, err)
			}
			return promise(vu, func() (any, error) {
				return p.IsDisabled(selector, popts) //nolint:wrapcheck
			}), nil
		},
		"isEditable": func(selector string, opts sobek.Value) (*sobek.Promise, error) {
			popts, err := parseFrameIsEditableOptions(rt, opts, p.MainFrame().Timeout())
			if err != nil {
				return nil, fmt.Errorf("parse isEditabled options of selector %q: %w", selector, err)
			}
			return promise(vu, func() (any, error) {
				return p.IsEditable(selector, popts) //nolint:wrapcheck
			}), nil
		},
		"isEnabled": func(selector string, opts sobek.Value) (*sobek.Promise, error) {
			popts, err := parseFrameIsEnabledOptions(rt, opts, p.MainFrame().Timeout())
			if err != nil {
				return nil, fmt.Errorf("parse isEnabled options of selector %q: %w", selector, err)
			}
			return promise(vu, func() (any, error) {
				return p.IsEnabled(selector, popts) //nolint:wrapcheck
			}), nil
		},
		"isHidden": func(selector string, opts sobek.Value) (*sobek.Promise, error) {
			popts, err := parseFrameIsHiddenOptions(rt, opts)
			if err != nil {
				return nil, fmt.Errorf("parse isHidden options of selector %q: %w", selector, err)

View on GitHub (pinned to 8d06114777)