{"record":{"id":"869a77b52bf2f1b2","repo":"grafana/k6","slug":"parsing-browser-newpage-options-w","errorCode":null,"errorMessage":"parsing browser.newPage options: %w","messagePattern":"parsing browser\\.newPage options: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/browser/browser_mapping.go","lineNumber":82,"sourceCode":"\t\t},\n\t\t\"userAgent\": func() (string, error) {\n\t\t\tb, err := browser()\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\treturn b.UserAgent(), nil\n\t\t},\n\t\t\"version\": func() (string, error) {\n\t\t\tb, err := browser()\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\treturn b.Version(), nil\n\t\t},\n\t\t\"newPage\": func(opts sobek.Value) (*sobek.Promise, error) {\n\t\t\tpopts, err := parseBrowserContextOptions(vu.Runtime(), opts)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing browser.newPage options: %w\", err)\n\t\t\t}\n\t\t\treturn promise(vu, func() (any, error) {\n\t\t\t\tb, err := browser()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tpage, err := b.NewPage(popts)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err //nolint:wrapcheck\n\t\t\t\t}\n\t\t\t\tif err := initBrowserContext(b.Context(), vu.testRunID); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\treturn mapPage(vu, page), nil\n\t\t\t}), nil\n\t\t},\n\t}","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/browser/browser_mapping.go#L64-L100","documentation":"browser.newPage(opts) uses the same parseBrowserContextOptions pipeline as newContext: the passed value is exported onto a default-filled common.BrowserContextOptions struct, then proxy options are validated. Any export or validation failure is wrapped as 'parsing browser.newPage options'. newPage then creates an implicit context with those options.","triggerScenarios":"newPage({ viewport: [1280, 720] }) - array instead of {width, height}; newPage({ deviceScaleFactor: '2' }); newPage({ proxy: {} }) - empty proxy object fails 'proxy.server must be set'; any non-exportable value in the options object.","commonSituations":"Reusing a config object shared with other Playwright/Puppeteer calls whose field shapes differ; passing device descriptors with incompatible key names; env-var-driven booleans arriving as strings.","solutions":["Use exactly the documented context option keys and types (viewport/screen objects, numeric deviceScaleFactor, boolean flags)","If you only need a proxy, remember server is the one mandatory proxy field","Inspect the wrapped cause after the colon - it names the field that failed to export"],"exampleFix":"// before: array viewport, string scale factor\nconst page = await browser.newPage({ viewport: [1280, 720], deviceScaleFactor: '2' });\n\n// after: object viewport, numeric scale factor\nconst page = await browser.newPage({ viewport: { width: 1280, height: 720 }, deviceScaleFactor: 2 });","handlingStrategy":"type-guard","validationCode":"// reuse the same shape check as newContext before calling newPage\nfunction validContextOptions(o = {}) {\n  const num = (v) => typeof v === 'number';\n  if (o.viewport !== undefined && !(num(o.viewport.width) && num(o.viewport.height))) return false;\n  if (o.deviceScaleFactor !== undefined && typeof o.deviceScaleFactor !== 'number') return false;\n  if (o.proxy !== undefined && (typeof o.proxy.server !== 'string' || !o.proxy.server)) return false;\n  return true;\n}\nif (!validContextOptions(opts)) throw new TypeError('bad browser page options');\nconst page = await browser.newPage(opts);","typeGuard":"interface Viewport { width: number; height: number }\ninterface PageOpts {\n  viewport?: Viewport;\n  deviceScaleFactor?: number;\n  ignoreHTTPSErrors?: boolean;\n  locale?: string;\n  userAgent?: string;\n  proxy?: { server: string; bypass?: string };\n}\nfunction isPageOpts(v: unknown): v is PageOpts {\n  const o = v as PageOpts;\n  return (\n    v != null && typeof v === 'object' && !Array.isArray(v) &&\n    (o.viewport == null || (typeof o.viewport.width === 'number' && typeof o.viewport.height === 'number')) &&\n    (o.deviceScaleFactor == null || typeof o.deviceScaleFactor === 'number') &&\n    (o.proxy == null || typeof o.proxy.server === 'string')\n  );\n}","tryCatchPattern":"try {\n  page = await browser.newPage(opts);\n} catch (e) {\n  if (String(e).includes('parsing browser.newPage options')) {\n    page = await browser.newPage(); // defaults, then set what you can via page APIs\n  } else throw e;\n}","preventionTips":["newPage takes context options, not Playwright device descriptors - map descriptors to the documented keys first","Viewport is an object {width, height}, never an array or 'WxH' string","Validate shared option objects once at script start rather than at each call site"],"tags":["browser","new-page","browser-context","options-parsing"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}