{"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":264,"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":246,"sourceCodeEnd":282,"githubUrl":"https://github.com/grafana/k6/blob/3fcf5388d78cb382f0c0d42ec556a06bfd1b8dee/internal/js/modules/k6/browser/common/screenshotter.go#L246-L282","documentation":"Thrown by getViewPortDimensions when the CDP Page.getLayoutMetrics call fails; the screenshotter needs the CSS visual viewport (scale, pageX, pageY) to compute full-page clip geometry. Notably, a nil cssVisualViewport is handled gracefully (warns and falls back to defaults), so this error means the CDP call itself errored, not a nil metric.","triggerScenarios":"Any screenshot needing viewport metrics (fullPage or clip) where the CDP session is broken: page/target closed mid-screenshot, renderer crash, or navigation racing the metrics call.","commonSituations":"Full-page screenshots in memory-constrained containers where the renderer dies; screenshotting while a page is being redirected or closed; flaky CDP connections in long test runs.","solutions":["Check the wrapped CDP error for 'target closed' — fix renderer stability (memory, --disable-dev-shm-usage) or screenshot before teardown.","Take the screenshot after the page reaches a stable lifecycle state.","Retry once for navigation races.","Reduce screenshot frequency in long runs if the browser is destabilizing."],"exampleFix":"// before\nawait page.screenshot({ path: 'full.png', fullPage: true }); // mid-redirect\n\n// after\nawait page.waitForLoadState('load');\nawait page.screenshot({ path: 'full.png', fullPage: true });","handlingStrategy":"retry","validationCode":"await page.waitForLoadState('load'); // stable page before fullPage/clip capture","typeGuard":null,"tryCatchPattern":"try {\n  await page.screenshot({ fullPage: true, path: 'f.png' });\n} catch (e) {\n  if (/getting layout metrics/i.test(String(e)) && !/target closed/i.test(String(e))) {\n    await page.waitForTimeout(500);\n    await page.screenshot({ fullPage: true, path: 'f.png' });\n  } else throw e;\n}","preventionTips":["Avoid screenshots during redirects or right before page close.","Stabilize the renderer environment (memory, shm) for big captures.","A nil visual viewport is already tolerated — an error here means the CDP call failed."],"tags":["k6","browser","screenshot","layout-metrics","cdp"],"backgroundTag":"cdp-command-failed","analyzedSha":"3fcf5388d78cb382f0c0d42ec556a06bfd1b8dee","analyzedAt":"2026-08-18T03:05:52.393Z","contentChangedAt":"2026-08-18T03:05:52.393Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}