grafana/k6 · error
restoring viewport
Error message
restoring viewport: %w
What it means
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.
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
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at internal/js/modules/k6/browser/common/screenshotter.go:350 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of grafana/k6@3fcf5388d7 (2026-09-20).
Data as JSON: /api/errors/41b168f9891cb368.
Report an issue: GitHub.
Appendix: source
Thrown at internal/js/modules/k6/browser/common/screenshotter.go:321
if err != nil {
return nil, fmt.Errorf("node is either not visible or not an HTMLElement: %w", err)
}
if bbox.Width <= 0 {
return nil, fmt.Errorf("node has 0 width")
}
if bbox.Height <= 0 {
return nil, fmt.Errorf("node has 0 height")
}
fitsViewport := bbox.Width <= viewportSize.Width && bbox.Height <= viewportSize.Height
if !fitsViewport { //nolint:nestif
overriddenViewportSize := Size{
Width: math.Max(viewportSize.Width, bbox.Width),
Height: math.Max(viewportSize.Height, bbox.Height),
}.enclosingIntSize()
defer func() {
if restoreErr := s.restoreViewport(h.frame.page, originalSize); restoreErr != nil {
err = errors.Join(err, fmt.Errorf("restoring viewport: %w", restoreErr))
}
}()
if err := h.frame.page.setViewportSize(s.ctx, overriddenViewportSize); err != nil {
return nil, fmt.Errorf("setting viewport size to %s: %w",
overriddenViewportSize, err)
}
err = h.waitAndScrollIntoViewIfNeeded(h.ctx, false, true, opts.Timeout)
if err != nil {
return nil, fmt.Errorf("scrolling element into view: %w", err)
}
bbox, err = h.boundingBox()
if err != nil {
return nil, fmt.Errorf("node is either not visible or not an HTMLElement: %w", err)
}
if bbox.Width <= 0 {
return nil, fmt.Errorf("node has 0 width")
}
if bbox.Height <= 0 {View on GitHub (pinned to 3fcf5388d7)