{"record":{"id":"35fe52d4baaba089","repo":"grafana/k6","slug":"parse-iseditabled-options-of-selector-q-w","errorCode":null,"errorMessage":"parse isEditabled options of selector %q: %w","messagePattern":"parse isEditabled options of selector %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/browser/page_mapping.go","lineNumber":310,"sourceCode":"\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn p.IsChecked(selector, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"isClosed\": p.IsClosed,\n\t\t\"isDisabled\": func(selector string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameIsDisabledOptions(rt, opts, p.MainFrame().Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parse isDisabled options of selector %q: %w\", selector, err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn p.IsDisabled(selector, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"isEditable\": func(selector string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameIsEditableOptions(rt, opts, p.MainFrame().Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parse isEditabled options of selector %q: %w\", selector, err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn p.IsEditable(selector, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"isEnabled\": func(selector string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameIsEnabledOptions(rt, opts, p.MainFrame().Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parse isEnabled options of selector %q: %w\", selector, err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn p.IsEnabled(selector, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"isHidden\": func(selector string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameIsHiddenOptions(rt, opts)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parse isHidden options of selector %q: %w\", selector, err)","sourceCodeStart":292,"sourceCodeEnd":328,"githubUrl":"https://github.com/grafana/k6/blob/8d06114777191d21ef885d05c5f8aa9e1ed838ae/internal/js/modules/k6/browser/browser/page_mapping.go#L292-L328","documentation":"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.","triggerScenarios":"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'.","commonSituations":"Custom builds with stricter validation; grep-based log analysis defeated by the typo'd message.","solutions":["Pass only strict and timeout (integer ms) in opts","Omit opts for defaults","When filtering logs, match the literal (misspelled) message text 'isEditabled'"],"exampleFix":"// before\nawait page.isEditable('#field', { timeout: '1s' });\n\n// after\nawait page.isEditable('#field', { timeout: 1000 });","handlingStrategy":"validation","validationCode":"const ALLOWED = new Set(['timeout', 'strict']);\nconst bad = Object.keys(opts ?? {}).filter(k => !ALLOWED.has(k));\nif (bad.length) console.warn(`isEditable ignores unknown options: ${bad.join(', ')}`);\nif (opts?.timeout !== undefined && !Number.isInteger(opts.timeout)) {\n  throw new Error('isEditable timeout must be integer milliseconds');\n}\nawait page.isEditable(selector, opts);","typeGuard":"/** @param {unknown} o */\nfunction isBaseOpts(o) {\n  if (o === undefined || o === null) return true;\n  if (typeof o !== 'object') return false;\n  const t = /** @type {any} */ (o);\n  return (t.timeout === undefined || Number.isInteger(t.timeout))\n    && (t.strict === undefined || typeof t.strict === 'boolean');\n}","tryCatchPattern":"try {\n  return await page.isEditable(selector, opts);\n} catch (e) {\n  // note: the thrown message contains the typo 'isEditabled'\n  if (String(e).includes('isEditabled options')) {\n    return await page.isEditable(selector);\n  } throw e;\n}","preventionTips":["isEditable reads only timeout and strict","When grepping logs, search the literal misspelling 'isEditabled'","Pass timeouts as integers"],"tags":["k6","browser","page","is-editable","options","typo"],"backgroundTag":"invalid-option-type","analyzedSha":"8d06114777191d21ef885d05c5f8aa9e1ed838ae","analyzedAt":"2026-09-14T20:10:14.619Z","contentChangedAt":"2026-09-14T20:10:14.619Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}