{"record":{"id":"e3b6b44ecf861ef5","repo":"grafana/k6","slug":"parsing-keyboard-options-w","errorCode":null,"errorMessage":"parsing keyboard options: %w","messagePattern":"parsing keyboard options: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/browser/keyboard_mapping.go","lineNumber":26,"sourceCode":"\t\"go.k6.io/k6/v2/internal/js/modules/k6/browser/common\"\n)\n\nfunc mapKeyboard(vu moduleVU, kb *common.Keyboard) mapping {\n\treturn mapping{\n\t\t\"down\": func(key string) *sobek.Promise {\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, kb.Down(key) //nolint:wrapcheck\n\t\t\t})\n\t\t},\n\t\t\"up\": func(key string) *sobek.Promise {\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, kb.Up(key) //nolint:wrapcheck\n\t\t\t})\n\t\t},\n\t\t\"press\": func(key string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tkbopts, err := exportTo[common.KeyboardOptions](vu.Runtime(), opts)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing keyboard options: %w\", err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, kb.Press(key, kbopts)\n\t\t\t}), nil\n\t\t},\n\t\t\"type\": func(text string, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tkbopts, err := exportTo[common.KeyboardOptions](vu.Runtime(), opts)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing keyboard options: %w\", err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, kb.Type(text, kbopts)\n\t\t\t}), nil\n\t\t},\n\t\t\"insertText\": func(text string) *sobek.Promise {\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, kb.InsertText(text) //nolint:wrapcheck\n\t\t\t})","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/grafana/k6/blob/01ffac6f245854c1b8adc6a69857c76a15f90022/internal/js/modules/k6/browser/browser/keyboard_mapping.go#L8-L44","documentation":"Thrown by keyboard.press(key, options) (browser/keyboard_mapping.go:26) when the options value cannot be exported to Go's KeyboardOptions { Delay int64 } via rt.ExportTo. Unlike most frame options, this path is a strict typed export: it fails when opts is not an object at all (a string like 'fast') or when delay is not a number (e.g. '100ms', 'fast', or a numeric string '100').","triggerScenarios":"page.keyboard.press('Enter', 'fast'); page.keyboard.press('Enter', { delay: '100ms' }); page.keyboard.press('Enter', { delay: '100' }) on this strict export path; opts loaded from JSON where delay is a string.","commonSituations":"Porting Playwright snippets that name delays with units; storing press options in shared config and forgetting to convert to a number; passing a leftover string argument (e.g. a key name) as the second parameter.","solutions":["Pass an object with a numeric delay in milliseconds: { delay: 100 }, or omit options","Convert dynamic values: { delay: Number(cfg.delay) }","Never pass a plain string as the options argument","If you need default behavior, call press(key) with no second argument"],"exampleFix":"// before\npage.keyboard.press('Enter', { delay: '100ms' });\n// after\npage.keyboard.press('Enter', { delay: 100 });","handlingStrategy":"type-guard","validationCode":"if (opts !== undefined && (typeof opts !== 'object' || Array.isArray(opts) ||\n    (opts.delay !== undefined && typeof opts.delay !== 'number'))) {\n  throw new Error('keyboard options must be { delay: number }');\n}","typeGuard":"function isKeyboardOptions(o) {\n  return o === undefined || o === null ||\n    (typeof o === 'object' && !Array.isArray(o) &&\n     (o.delay === undefined || (typeof o.delay === 'number' && Number.isFinite(o.delay))));\n}","tryCatchPattern":"try { await page.keyboard.press('Enter', { delay: Number(cfg.delay) }); } catch (e) { if (!String(e.message).includes('parsing keyboard options')) throw e; }","preventionTips":["delay is a bare number in milliseconds — never '100ms' or 'fast'","Never pass a string as the second argument to keyboard.press","Convert config-sourced delays with Number() at load time"],"tags":["k6","k6-browser","keyboard","press","options","type-mismatch"],"backgroundTag":"options-validation-failed","analyzedSha":"01ffac6f245854c1b8adc6a69857c76a15f90022","analyzedAt":"2026-08-18T03:05:52.393Z","contentChangedAt":"2026-08-18T03:05:52.393Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}