{"record":{"id":"1be517e5054e8b21","repo":"grafana/k6","slug":"parsing-emulatemedia-options-w","errorCode":null,"errorMessage":"parsing emulateMedia options: %w","messagePattern":"parsing emulateMedia options: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/browser/page_mapping.go","lineNumber":94,"sourceCode":"\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, p.Dblclick(selector, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"dispatchEvent\": func(selector, typ string, eventInit, opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseFrameDispatchEventOptions(rt, opts, p.MainFrame().Timeout())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing page dispatch event options: %w\", err)\n\t\t\t}\n\t\t\tearg := exportArg(eventInit)\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, p.DispatchEvent(selector, typ, earg, popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"emulateMedia\": func(opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parsePageEmulateMediaOptions(rt, opts, common.NewPageEmulateMediaOptions(p))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing emulateMedia options: %w\", err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, p.EmulateMedia(popts) //nolint:wrapcheck\n\t\t\t}), nil\n\t\t},\n\t\t\"emulateVisionDeficiency\": func(typ string) *sobek.Promise {\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn nil, p.EmulateVisionDeficiency(typ) //nolint:wrapcheck\n\t\t\t})\n\t\t},\n\t\t\"evaluate\": func(pageFunc sobek.Value, gargs ...sobek.Value) (*sobek.Promise, error) {\n\t\t\tif sobekEmptyString(pageFunc) {\n\t\t\t\treturn nil, fmt.Errorf(\"evaluate requires a page function\")\n\t\t\t}\n\t\t\tfuncString := pageFunc.String()\n\t\t\tgopts := exportArgs(gargs)\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\treturn p.Evaluate(funcString, gopts...)","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/grafana/k6/blob/8d06114777191d21ef885d05c5f8aa9e1ed838ae/internal/js/modules/k6/browser/browser/page_mapping.go#L76-L112","documentation":"Thrown synchronously by page.emulateMedia(opts) when parsePageEmulateMediaOptions fails. That helper (internal/js/modules/k6/browser/browser/page_mapping.go:1131-1154, marked nolint:unparam) always returns a nil error in the current code: it copies colorScheme, media and reducedMotion as strings without validation. The wrapper is therefore defensive, and invalid enum strings surface later from CDP/browser-side validation, not from this message.","triggerScenarios":"No input reaches this error in this version. Invalid values such as media: 'printx' are accepted here and fail later inside p.EmulateMedia when the value is validated/sent to the browser.","commonSituations":"Typos in media ('print' vs 'prints'), colorScheme ('dark'/'light'/'no-preference'), or reducedMotion ('reduce'/'no-preference') usually produce a different downstream error; seeing this exact message implies a modified k6 build with added validation.","solutions":["Use the documented values: media: 'screen'|'print'|'null', colorScheme: 'light'|'dark'|'no-preference', reducedMotion: 'reduce'|'no-preference'","If the error does appear, check your k6/xk6 build for a patched parsePageEmulateMediaOptions and match its accepted values","Pass null to reset emulation: page.emulateMedia({ media: null })"],"exampleFix":"// before\nawait page.emulateMedia({ media: 'prints' });\n\n// after\nawait page.emulateMedia({ media: 'print' });","handlingStrategy":"validation","validationCode":"const MEDIA = new Set(['screen', 'print', 'null', null]);\nconst SCHEME = new Set(['light', 'dark', 'no-preference', 'null', null]);\nconst MOTION = new Set(['reduce', 'no-preference', 'null', null]);\nif (opts?.media !== undefined && !MEDIA.has(opts.media)) throw new Error(`bad media: ${opts.media}`);\nif (opts?.colorScheme !== undefined && !SCHEME.has(opts.colorScheme)) throw new Error(`bad colorScheme: ${opts.colorScheme}`);\nif (opts?.reducedMotion !== undefined && !MOTION.has(opts.reducedMotion)) throw new Error(`bad reducedMotion: ${opts.reducedMotion}`);\nawait page.emulateMedia(opts);","typeGuard":"/** @param {unknown} o */\nfunction isEmulateMediaOpts(o) {\n  if (o === undefined || o === null) return true;\n  if (typeof o !== 'object') return false;\n  const m = /** @type {any} */ (o);\n  return (m.media === undefined || m.media === null || typeof m.media === 'string')\n    && (m.colorScheme === undefined || typeof m.colorScheme === 'string')\n    && (m.reducedMotion === undefined || typeof m.reducedMotion === 'string');\n}","tryCatchPattern":"try {\n  await page.emulateMedia(opts);\n} catch (e) {\n  if (String(e).includes('parsing emulateMedia options')) {\n    // only on non-stock builds; strip suspicious keys and retry\n    const { media = 'screen' } = opts ?? {};\n    await page.emulateMedia({ media });\n  } else throw e;\n}","preventionTips":["Use exact values: media screen|print|null, colorScheme light|dark|no-preference, reducedMotion reduce|no-preference","Validate emulation options once at script start since parse does not validate them","Pass null (not undefined) when you intend to reset emulation"],"tags":["k6","browser","page","emulate-media","options"],"backgroundTag":"invalid-option-type","analyzedSha":"8d06114777191d21ef885d05c5f8aa9e1ed838ae","analyzedAt":"2026-08-18T03:05:52.393Z","contentChangedAt":"2026-08-18T03:05:52.393Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}