{"record":{"id":"53ef851dec52ceb9","repo":"grafana/k6","slug":"parse-press-options-of-selector-q-on-key-q-w","errorCode":null,"errorMessage":"parse press options of selector %q on key %q: %w","messagePattern":"parse press options of selector %q on key %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/browser/frame_mapping.go","lineNumber":324,"sourceCode":"\t\t},\n\t\t\"locator\": func(selector string, opts sobek.Value) mapping {\n\t\t\treturn mapLocator(vu, f.Locator(selector, parseLocatorOptions(rt, opts)))\n\t\t},\n\t\t\"frameLocator\": func(selector string) *sobek.Object {\n\t\t\tmfl := mapFrameLocator(vu, f.FrameLocator(selector))\n\t\t\treturn rt.ToValue(mfl).ToObject(rt)\n\t\t},\n\t\t\"name\": f.Name,\n\t\t\"page\": func() mapping {\n\t\t\treturn mapPage(vu, f.Page())\n\t\t},\n\t\t\"parentFrame\": func() mapping {\n\t\t\treturn mapFrame(vu, f.ParentFrame())\n\t\t},\n\t\t\"press\": func(selector, key string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFramePressOptions(rt, opts, f.Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parse press options of selector %q on key %q: %w\", selector, key, err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, f.Press(selector, key, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"selectOption\": func(selector string, values sobek.Value, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameSelectOptionOptions(rt, opts, f.Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing select option options: %w\", err)\n\t\t\t}\n\n\t\t\tconvValues, err := ConvertSelectOptionValues(rt, values)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing select options values: %w\", err)\n\t\t\t}\n\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn f.SelectOption(selector, convValues, popts) //nolint:wrapcheck","sourceCodeStart":306,"sourceCodeEnd":342,"githubUrl":"https://github.com/grafana/k6/blob/8d06114777191d21ef885d05c5f8aa9e1ed838ae/internal/js/modules/k6/browser/browser/frame_mapping.go#L306-L342","documentation":"Thrown when `frame.press(selector, key, opts)` options fail to parse into FramePressOptions (delay ms int, noWaitAfter bool, timeout ms, strict bool). Message includes both selector and key. ElementHandlePressOptions.Parse is fully coercive (ToInteger/ToBoolean), so the branch is currently defensive.","triggerScenarios":"Not reachable today; `delay: '100'` coerces, `delay: '100ms'` coerces to 0. The key argument itself is not validated here — invalid key names fail later in the CDP layer, not in this parse.","commonSituations":"String delay values silently becoming 0 (no keystroke delay); Playwright's deprecated `noWaitAfter` being passed as strings; expecting a typo'd key like 'Enter ' (trailing space) to error here — it does not.","solutions":["Pass delay/noWaitAfter/timeout/strict as proper number/boolean/number/boolean","Remember the second argument is a single key name like 'Enter' or 'a', not a string of characters","For typing text use frame.type or frame.fill, not press"],"exampleFix":"// before\nawait frame.press('#i', 'Enter', { delay: '100ms' }); // delay becomes 0\n\n// after\nawait frame.press('#i', 'Enter', { delay: 100 }); // milliseconds, number","handlingStrategy":"try-catch","validationCode":"const opts = { delay: 100, timeout: 5000 };\nif (opts.delay != null && typeof opts.delay !== 'number') throw new Error('delay must be a number in ms');\nif (typeof key !== 'string' || key.length === 0) throw new Error('key must be a non-empty key name like \"Enter\"');","typeGuard":"function isPressOptions(o) {\n  return o == null || (typeof o === 'object' &&\n    (o.delay === undefined || typeof o.delay === 'number') &&\n    (o.noWaitAfter === undefined || typeof o.noWaitAfter === 'boolean') &&\n    (o.timeout === undefined || typeof o.timeout === 'number'));\n}","tryCatchPattern":"try {\n  await frame.press(sel, key, opts);\n} catch (e) {\n  if (String(e).includes('parse press options')) { console.error(`bad press opts for ${sel} key ${key}`); } else { throw e; }\n}","preventionTips":["delay is milliseconds between keydown/keyup as a number — '100ms' coerces to 0","Second argument is one key name ('Enter', 'ArrowDown', 'a'), not text","Message includes both selector and key for easy triage"],"tags":["k6","browser","frame","press","keyboard","options"],"backgroundTag":"invalid-options-argument","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"}