{"record":{"id":"ec54461e4567a704","repo":"grafana/k6","slug":"getting-viewport-dimensions-w","errorCode":null,"errorMessage":"getting viewport dimensions: %w","messagePattern":"getting viewport dimensions: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/screenshotter.go","lineNumber":137,"sourceCode":"}\n\nfunc (s *screenshotter) originalViewportSize(p *Page) (*Size, *Size, error) {\n\toriginalViewportSize := p.viewportSize()\n\tviewportSize := originalViewportSize\n\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()","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/screenshotter.go#L119-L155","documentation":"Thrown when the screenshotter cannot read the viewport dimensions of a page whose CDP-assigned viewport is 0x0. It evaluates `() => ({width: window.innerWidth, height: window.innerHeight})` in the main frame and this CDP Runtime.evaluate call itself failed (the error is wrapped verbatim). This is a Chrome DevTools Protocol-level failure, not a size problem.","triggerScenarios":"page.setViewportSize was never applied / page has no emulated viewport, and during the evaluate: the page is navigating (execution context destroyed), the page/target was closed, the renderer crashed, or the screenshotter context was cancelled (test ending, iteration timeout).","commonSituations":"Calling page.screenshot() concurrently with page.goto() or page.reload(); screenshotting right before/after page.close(); browser process killed by OOM in a container; k6 iteration teardown racing the screenshot.","solutions":["Await navigation fully before screenshotting: await page.goto(url); await page.waitForLoadState('load');","Ensure the page is still open — remove any page.close() that can race the screenshot.","Retry the screenshot once after a short wait if the failure message contains 'Execution context was destroyed' or 'Target closed'.","If the browser dies repeatedly, check container memory limits / chromium crash logs (renderer OOM shows up here)."],"exampleFix":"// before\nconst p = await browser.newPage();\nconst nav = p.goto(url); // not awaited\nawait p.screenshot({ path: 's.png' }); // evaluate can lose the context mid-navigation\n\n// after\nconst p = await browser.newPage();\nawait p.goto(url);\nawait p.waitForLoadState('load');\nawait p.screenshot({ path: 's.png' });","handlingStrategy":"try-catch","validationCode":"await page.goto(url);\nawait page.waitForLoadState('load');\n// page must not be closed concurrently","typeGuard":null,"tryCatchPattern":"try {\n  await page.screenshot({ path: 's.png' });\n} catch (e) {\n  if (/Target closed|Execution context was destroyed|session closed/i.test(String(e))) {\n    await sleep(500); await page.screenshot({ path: 's.png' }); // one retry\n  } else { throw e; }\n}","preventionTips":["Await every goto/reload before screenshots.","Never fire page.close() in parallel with a screenshot.","Watch container memory if the browser dies with these errors."],"tags":["k6","browser","screenshot","cdp","navigation-race","execution-context"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}