{"record":{"id":"6f29bac53b5f6721","repo":"grafana/k6","slug":"parsing-setcontent-options-w","errorCode":null,"errorMessage":"parsing setContent options: %w","messagePattern":"parsing setContent options: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/browser/frame_mapping.go","lineNumber":358,"sourceCode":"\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn f.SelectOption(selector, convValues, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"setChecked\": func(selector string, checked bool, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameCheckOptions(rt, opts, f.Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing frame set check options: %w\", err)\n\t\t\t}\n\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, f.SetChecked(selector, checked, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"setContent\": func(html string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameSetContentOptions(rt, opts, f.Page().NavigationTimeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing setContent options: %w\", err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, f.SetContent(html, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"setInputFiles\": func(selector string, files sobek.Value, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameSetInputFilesOptions(rt, opts, f.Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing setInputFiles options: %w\", err)\n\t\t\t}\n\n\t\t\tpfiles := new(common.Files)\n\t\t\tif err := pfiles.Parse(vu.Context(), files); err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing setInputFiles parameter: %w\", err)\n\t\t\t}\n\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, f.SetInputFiles(selector, pfiles, popts) //nolint:wrapcheck","sourceCodeStart":340,"sourceCodeEnd":376,"githubUrl":"https://github.com/grafana/k6/blob/8d06114777191d21ef885d05c5f8aa9e1ed838ae/internal/js/modules/k6/browser/browser/frame_mapping.go#L340-L376","documentation":"Thrown when `frame.setContent(html, opts)` options fail to parse into FrameSetContentOptions. Keys: `timeout` (ms, coercive) and `waitUntil` — a strict enum accepting exactly 'load', 'domcontentloaded', or 'networkidle' (validated by LifecycleEvent.UnmarshalText, whose error lists all valid values). An invalid waitUntil is the only real trigger.","triggerScenarios":"`frame.setContent('<p>hi</p>', { waitUntil: 'DOMContentLoaded' })`, `{ waitUntil: 'load ' }` (trailing space), or any string not in the enum; the underlying error is \"invalid lifecycle event: %q; must be one of: domcontentloaded, load, networkidle\".","commonSituations":"CamelCase lifecycle names copied from browser event docs ('DOMContentLoaded' mirrors the DOM event, not k6's option value); Playwright scripts using newer lifecycle names not supported here.","solutions":["Use exactly 'load', 'domcontentloaded', or 'networkidle'","Read the wrapped cause — it enumerates valid values","Default is 'load'; omit waitUntil if that is what you want"],"exampleFix":"// before\nawait frame.setContent(html, { waitUntil: 'DOMContentLoaded' });\n\n// after\nawait frame.setContent(html, { waitUntil: 'domcontentloaded' });","handlingStrategy":"validation","validationCode":"const WAIT_UNTIL = new Set(['load', 'domcontentloaded', 'networkidle']);\nfunction assertSetContentOpts(opts = {}) {\n  if (opts.waitUntil !== undefined && !WAIT_UNTIL.has(opts.waitUntil)) {\n    throw new Error(`waitUntil must be one of: ${[...WAIT_UNTIL].join(', ')}`);\n  }\n}","typeGuard":"function isValidLifecycleEvent(v) {\n  return v === 'load' || v === 'domcontentloaded' || v === 'networkidle';\n}","tryCatchPattern":"try {\n  await frame.setContent(html, opts);\n} catch (e) {\n  if (/parsing setContent options.*invalid lifecycle event/.test(String(e))) {\n    throw new Error('Bad waitUntil for setContent; use load|domcontentloaded|networkidle');\n  }\n  throw e;\n}","preventionTips":["Share one constant list of lifecycle values across goto and setContent","The DOM event is 'DOMContentLoaded' but the option value is lowercase 'domcontentloaded'","Default waitUntil is 'load' — omit it unless you need otherwise"],"tags":["k6","browser","frame","set-content","wait-until","lifecycle-event"],"backgroundTag":"invalid-enum-value","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"}