grafana/k6 · error

getting viewport dimensions

Error message

getting viewport dimensions: %w

What it means

Thrown when a screenshot needs the viewport dimensions (because the page was opened without an explicit viewport size, so originalViewportSize falls back to evaluating window.innerWidth/window.innerHeight) and that evaluation fails. The error wraps whatever the frame evaluate returns — typically a destroyed execution context or a closed target.

Solutions

  1. Check the wrapped cause — 'target closed'/'context destroyed' means the page died; fix the crash or call screenshot earlier.
  2. Take screenshots after the page reaches a stable lifecycle state.
  3. If you don't need the real viewport, launch with an explicit viewport so this code path is skipped entirely.
  4. Increase container memory / use --disable-dev-shm-usage if Chrome is crashing.

Example fix

// before (viewport: null path, screenshot during churn)
await page.screenshot({ path: 'home.png' });

// after
await page.waitForLoadState('load');
await page.screenshot({ path: 'home.png' });
Defensive patterns

Strategy: try-catch

Validate before calling

if (page.isClosed()) throw new Error('page closed before screenshot');
await page.waitForLoadState('load');

Try / catch

try {
  await page.screenshot({ path: 's.png' });
} catch (e) {
  if (/getting viewport dimensions.*(target closed|context destroyed)/i.test(String(e))) {
    /* page died: report env issue, do not retry */
  } else throw e;
}

Prevention

When it happens

Trigger: Taking any screenshot on a browser context launched with viewport: null (real viewport mode), while the page is navigating, crashing, or closing, so the `() => ({width: window.innerWidth, height: window.innerHeight})` evaluation cannot run.

Common situations: Launching with options.viewport = null to get the real screen size and then screenshotting during/after teardown; renderer crash in low-memory CI containers; screenshot racing a redirect.

Related errors


AI-assisted analysis of grafana/k6@3fcf5388d7 (2026-09-20). Data as JSON: /api/errors/ec54461e4567a704. Report an issue: GitHub.

Appendix: source

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

	return &size, nil
}

func (s *screenshotter) originalViewportSize(p *Page) (*Size, error) {
	viewportSize := p.viewportSize()
	if viewportSize.Width != 0 || viewportSize.Height != 0 {
		return &viewportSize, nil
	}

	opts := evalOptions{
		forceCallable: true,
		returnByValue: true,
	}
	result, err := p.frameManager.MainFrame().evaluate(s.ctx, mainWorld, opts, `
	() => (
		{ width: window.innerWidth, height: window.innerHeight }
	)`)
	if err != nil {
		return nil, fmt.Errorf("getting viewport dimensions: %w", err)
	}

	var returnVal Size
	if err := convert(result, &returnVal); err != nil {
		return nil, fmt.Errorf("unpacking window size: %w", err)
	}

	viewportSize.Width = returnVal.Width
	viewportSize.Height = returnVal.Height

	return &viewportSize, nil
}

func (s *screenshotter) restoreViewport(p *Page, originalSize *EmulatedSize) error {
	ctx, cancel := s.cleanupContext()
	defer cancel()
	if originalSize != nil {
		return p.setEmulatedSize(ctx, originalSize)

View on GitHub (pinned to 3fcf5388d7)