grafana/k6 · error

getting original viewport size: %w

Error message

getting original viewport size: %w

What it means

Entry guard of elementHandle.screenshot()/locator.screenshot({}): it reads the current viewport size (directly from the page, or via in-page evaluation when the page has no emulated viewport). This wraps the failure of that lookup — i.e. the 'getting viewport dimensions'/'unpacking window size' chain (errors 981/982).

Source

Thrown at internal/js/modules/k6/browser/common/screenshotter.go:276

	} else {
		logger.Warnf(
			"Screenshotter::screenshot",
			"chrome browser returned nil on page.getLayoutMetrics, falling back to defaults for cssVisualViewport "+
				"(scale: %v, pageX: %v, pageY: %v)."+
				"This is non-standard behavior, if possible please report this issue (with a reproducible script) "+
				"to the https://github.com/grafana/k6/issues/new.",
			visualViewportScale, visualViewportPageX, visualViewportPageY,
		)
	}

	return visualViewportScale, visualViewportPageX, visualViewportPageY, nil
}

func (s *screenshotter) screenshotElement(h *ElementHandle, opts *ElementHandleScreenshotOptions) ([]byte, error) {
	format := opts.Format
	viewportSize, originalViewportSize, err := s.originalViewportSize(h.frame.page)
	if err != nil {
		return nil, fmt.Errorf("getting original viewport size: %w", 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 {
		return nil, fmt.Errorf("node has 0 height")
	}

View on GitHub (pinned to 93accf6570)

Solutions

  1. Create the page with an explicit viewport (browser.newContext({viewport:{width:1280,height:720}})) so no evaluation is needed.
  2. Await navigation and waitFor the element before elementHandle.screenshot().
  3. Keep the page open until the call resolves; retry once on transient context-destroyed errors.
  4. Upgrade k6 if conversion-related failures persist.

Example fix

// before
const p = await browser.newPage();
await p.goto(url);
await p.$('#chart').then(el => el.screenshot({ path: 'el.png' })); // 0x0 viewport path

// after
const p = await browser.newPage({ viewport: { width: 1280, height: 720 } });
await p.goto(url);
const el = await p.$('#chart');
await el.screenshot({ path: 'el.png' });
Defensive patterns

Strategy: validation

Validate before calling

const p = await browser.newPage({ viewport: { width: 1280, height: 720 } }); // avoids the 0x0-viewport evaluate entirely
await p.waitForLoadState('load');

Try / catch

try { await el.screenshot({ path: 'e.png' }); }
catch (e) { if (String(e).includes('getting original viewport size')) { /* set viewport, retry once */ } else throw e; }

Prevention

When it happens

Trigger: elementHandle.screenshot() on a page with a 0x0/unset viewport while the evaluate of window.innerWidth/innerHeight fails (navigation, closed page, cancelled context), or the result fails to convert.

Common situations: Screenshots of elements on pages created without a viewport option while navigation is still settling; screenshotting during teardown; browser crash mid-test.

Related errors


AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15). Data as JSON: /api/errors/a5eb4d5212c76d22. Report an issue: GitHub.