{"record":{"id":"ac7b385acdd738ee","repo":"grafana/k6","slug":"getting-layout-metrics-for-screenshot-w","errorCode":null,"errorMessage":"getting layout metrics for screenshot: %w","messagePattern":"getting layout metrics for screenshot: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/screenshotter.go","lineNumber":249,"sourceCode":"\t// Save screenshot capture to file\n\tif path != \"\" {\n\t\tif err := s.persister.Persist(s.ctx, path, bytes.NewBuffer(buf)); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"persisting screenshot: %w\", err)\n\t\t}\n\t}\n\n\treturn buf, nil\n}\n\nfunc getViewPortDimensions(ctx context.Context, sess session, logger *log.Logger) (float64, float64, float64, error) {\n\tvisualViewportScale := 1.0\n\tvisualViewportPageX, visualViewportPageY := 0.0, 0.0\n\n\t// Add clip region\n\t//nolint:dogsled\n\t_, _, _, _, cssVisualViewport, _, err := cdppage.GetLayoutMetrics().Do(cdp.WithExecutor(ctx, sess))\n\tif err != nil {\n\t\treturn 0, 0, 0, fmt.Errorf(\"getting layout metrics for screenshot: %w\", err)\n\t}\n\n\t// we had a null pointer panic cases, when visualViewport is nil\n\t// instead of the erroring out, we fallback to defaults and still try to do a screenshot\n\tif cssVisualViewport != nil {\n\t\tvisualViewportScale = cssVisualViewport.Scale\n\t\tvisualViewportPageX = cssVisualViewport.PageX\n\t\tvisualViewportPageY = cssVisualViewport.PageY\n\t} else {\n\t\tlogger.Warnf(\n\t\t\t\"Screenshotter::screenshot\",\n\t\t\t\"chrome browser returned nil on page.getLayoutMetrics, falling back to defaults for cssVisualViewport \"+\n\t\t\t\t\"(scale: %v, pageX: %v, pageY: %v).\"+\n\t\t\t\t\"This is non-standard behavior, if possible please report this issue (with a reproducible script) \"+\n\t\t\t\t\"to the https://github.com/grafana/k6/issues/new.\",\n\t\t\tvisualViewportScale, visualViewportPageX, visualViewportPageY,\n\t\t)\n\t}","sourceCodeStart":231,"sourceCodeEnd":267,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/screenshotter.go#L231-L267","documentation":"getViewPortDimensions() calls Page.getLayoutMetrics to obtain the CSS visual viewport (scale, pageX, pageY) used to translate clip coordinates. The CDP command itself errored. (A nil cssVisualViewport is handled separately with a warn + defaults — this error is the command failing outright.)","triggerScenarios":"Any screenshot with a viewport rect (page.screenshot of the viewport) while the target is closing, navigating, or the renderer is gone; CDP session cancelled by test shutdown or timeout.","commonSituations":"Screenshot racing page.goto()/reload()/close(); browser crashed under memory pressure; k6 scenario teardown cancelling the browser context mid-capture.","solutions":["Await full navigation before capturing: await page.goto(url); await page.waitForLoadState('load');","Ensure the page stays open until screenshot() resolves.","Retry once for transient 'Target closed'/'Session closed' messages.","Stabilize the browser environment (memory limits, GPU flags) if chrome itself is dying."],"exampleFix":"// before\npage.goto(url); // unhandled promise\nawait page.screenshot({ path: 's.png' }); // getLayoutMetrics can race navigation\n\n// after\nawait page.goto(url);\nawait page.screenshot({ path: 's.png' });","handlingStrategy":"retry","validationCode":"await page.waitForLoadState('load'); // ensure no navigation in flight","typeGuard":null,"tryCatchPattern":"try { await page.screenshot({ path: 's.png' }); }\ncatch (e) {\n  if (String(e).includes('getting layout metrics')) { await sleep(500); await page.screenshot({ path: 's.png' }); }\n  else throw e;\n}","preventionTips":["Screenshot only after load settles.","Keep the page open through the whole capture.","Monitor for renderer crashes under memory pressure."],"tags":["k6","browser","screenshot","cdp","layout-metrics","navigation-race"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}