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
- Create the page with an explicit viewport (browser.newContext({viewport:{width:1280,height:720}})) so no evaluation is needed.
- Await navigation and waitFor the element before elementHandle.screenshot().
- Keep the page open until the call resolves; retry once on transient context-destroyed errors.
- 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
- Always create pages/contexts with an explicit viewport.
- Await navigation before element screenshots.
- Re-query element handles close in time to the capture.
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
- parsing element handle screenshot options: %w
- unpacking window size: %w
- scrolling element into view: %w
- node is either not visible or not an HTMLElement: %w
- node has 0 width
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/a5eb4d5212c76d22.
Report an issue: GitHub.