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

  1. Ensure the page and browser stay alive until the screenshot call returns
  2. Retry the whole screenshot operation on a healthy page
  3. If persistent, avoid triggering viewport override by using fullPage screenshots or resizing via a new browser context
  4. 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)