{"record":{"id":"ecfb7ffd36ceda1c","repo":"grafana/k6","slug":"unpacking-window-size-w","errorCode":null,"errorMessage":"unpacking window size: %w","messagePattern":"unpacking window size: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/screenshotter.go","lineNumber":142,"sourceCode":"\tif viewportSize.Width != 0 || viewportSize.Height != 0 {\n\t\treturn &viewportSize, &originalViewportSize, nil\n\t}\n\n\topts := evalOptions{\n\t\tforceCallable: true,\n\t\treturnByValue: true,\n\t}\n\tresult, err := p.frameManager.MainFrame().evaluate(s.ctx, mainWorld, opts, `\n\t() => (\n\t\t{ width: window.innerWidth, height: window.innerHeight }\n\t)`)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"getting viewport dimensions: %w\", err)\n\t}\n\n\tvar returnVal Size\n\tif err := convert(result, &returnVal); err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"unpacking window size: %w\", err)\n\t}\n\n\tviewportSize.Width = returnVal.Width\n\tviewportSize.Height = returnVal.Height\n\n\treturn &viewportSize, &originalViewportSize, nil\n}\n\nfunc (s *screenshotter) restoreViewport(p *Page, originalViewport *Size) error {\n\tif originalViewport != nil {\n\t\treturn p.setViewportSize(originalViewport)\n\t}\n\treturn p.resetViewport()\n}\n\nfunc (s *screenshotter) screenshot(\n\tsess session, doc, viewport *Rect, format ImageFormat, omitBackground bool, quality int64, path string,\n) ([]byte, error) {","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/screenshotter.go#L124-L160","documentation":"The in-page evaluation of window.innerWidth/window.innerHeight succeeded, but converting the returned value into the Size struct failed (JSON round-trip through helpers.go convert). The value came back in a shape that does not unmarshal into {width: float64, height: float64}.","triggerScenarios":"Only reachable from the same path as 'getting viewport dimensions' — a page with no emulated viewport (0x0) — where CDP returns a RemoteObject that deserializes into something other than a {width,height} number map (e.g. undefined, a string, or a sobek value that does not marshal cleanly).","commonSituations":"Rare; seen with non-standard documents (about:blank races, pages replacing window properties, aggressive anti-automation scripts tampering with window.innerWidth) and with browser/k6 version mismatches in how RemoteObjects are decoded.","solutions":["Set an explicit viewport so this code path is never used: browser.newPage({ viewport: { width: 1280, height: 720 } }) or page.setViewportSize().","Upgrade k6 and its bundled chromium — RemoteObject decoding for evaluated results has changed across versions.","If a page script overrides window.innerWidth/innerHeight, neutralize it or screenshot a different page.","Catch and fall back: skip size-dependent options (fullPage, clip) for that page."],"exampleFix":"// before\nconst p = await browser.newContext().newPage(); // no viewport option -> 0x0 path possible\nawait p.screenshot({ path: 's.png' });\n\n// after\nconst p = await browser.newContext({ viewport: { width: 1280, height: 720 } }).newPage();\nawait p.screenshot({ path: 's.png' });","handlingStrategy":"validation","validationCode":"const w = await page.evaluate('window.innerWidth');\nif (typeof w !== 'number' || !Number.isFinite(w)) throw new Error('viewport unreadable; set an explicit viewport');","typeGuard":"function isFiniteSize(v) {\n  return v != null && typeof v === 'object'\n    && Number.isFinite(Number(v.width)) && Number.isFinite(Number(v.height));\n}","tryCatchPattern":"try { await page.screenshot({ path: 's.png' }); }\ncatch (e) { if (String(e).includes('unpacking window size')) { /* set viewport and retry */ } else throw e; }","preventionTips":["Always create pages with an explicit viewport option.","Keep k6 and its bundled chromium versions in sync.","Avoid pages that override window.innerWidth/innerHeight."],"tags":["k6","browser","screenshot","json-conversion","viewport"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}