{"record":{"id":"41b168f9891cb368","repo":"grafana/k6","slug":"restoring-viewport-w","errorCode":null,"errorMessage":"restoring viewport: %w","messagePattern":"restoring viewport: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/screenshotter.go","lineNumber":321,"sourceCode":"\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"node is either not visible or not an HTMLElement: %w\", err)\n\t}\n\tif bbox.Width <= 0 {\n\t\treturn nil, fmt.Errorf(\"node has 0 width\")\n\t}\n\tif bbox.Height <= 0 {\n\t\treturn nil, fmt.Errorf(\"node has 0 height\")\n\t}\n\n\tfitsViewport := bbox.Width <= viewportSize.Width && bbox.Height <= viewportSize.Height\n\tif !fitsViewport { //nolint:nestif\n\t\toverriddenViewportSize := Size{\n\t\t\tWidth:  math.Max(viewportSize.Width, bbox.Width),\n\t\t\tHeight: math.Max(viewportSize.Height, bbox.Height),\n\t\t}.enclosingIntSize()\n\t\tdefer func() {\n\t\t\tif restoreErr := s.restoreViewport(h.frame.page, originalSize); restoreErr != nil {\n\t\t\t\terr = errors.Join(err, fmt.Errorf(\"restoring viewport: %w\", restoreErr))\n\t\t\t}\n\t\t}()\n\t\tif err := h.frame.page.setViewportSize(s.ctx, overriddenViewportSize); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"setting viewport size to %s: %w\",\n\t\t\t\toverriddenViewportSize, err)\n\t\t}\n\t\terr = h.waitAndScrollIntoViewIfNeeded(h.ctx, false, true, opts.Timeout)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"scrolling element into view: %w\", err)\n\t\t}\n\t\tbbox, err = h.boundingBox()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"node is either not visible or not an HTMLElement: %w\", err)\n\t\t}\n\t\tif bbox.Width <= 0 {\n\t\t\treturn nil, fmt.Errorf(\"node has 0 width\")\n\t\t}\n\t\tif bbox.Height <= 0 {","sourceCodeStart":303,"sourceCodeEnd":339,"githubUrl":"https://github.com/grafana/k6/blob/3fcf5388d78cb382f0c0d42ec556a06bfd1b8dee/internal/js/modules/k6/browser/common/screenshotter.go#L303-L339","documentation":"Raised at the end of screenshotElement when the element did not fit the original viewport (so the viewport was temporarily enlarged) and restoring the original viewport via restoreViewport fails. The failure means the cleanup CDP call (Emulation.clearDeviceMetricsOverride / setDeviceMetricsOverride) was rejected — usually because the page or CDP session died during or after the screenshot. The screenshot bytes may already have been captured, but the error is still returned, abandoning them.","triggerScenarios":"Thrown at internal/js/modules/k6/browser/common/screenshotter.go:350 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the page and browser stay alive until the screenshot call returns","Retry the whole screenshot operation on a healthy page","If persistent, avoid triggering viewport override by using fullPage screenshots or resizing via a new browser context","Check the underlying CDP error for session/target closure details"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3fcf5388d78cb382f0c0d42ec556a06bfd1b8dee","analyzedAt":"2026-09-20T22:01:45.163Z","contentChangedAt":"2026-09-20T22:01:45.163Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}