grafana/k6 · error
setting viewport size
Error message
setting viewport size: %w
What it means
Thrown by Page.SetViewportSize in the k6 browser module when the page fails to apply a new viewport size. It wraps the error from the internal setViewportSize -> setEmulatedSize chain, which ultimately drives the CDP Emulation.setDeviceMetricsOverride call on every frame session. The outer message 'setting viewport size' only adds context; the underlying error names the real cause (CDP/protocol failure, closed target, or invalid size).
Solutions
- Check the wrapped error text after 'setting viewport size:' — it names the actual CDP failure (e.g. 'target closed', 'session detached') and dictates the fix.
- Ensure the page is still open (page.isClosed() === false) before calling page.setViewportSize().
- Retry the call once after a short wait if the failure happened during a navigation or page-creation race.
- Verify Chrome did not crash (check k6 logs and browser process memory limits, e.g. --disable-dev-shm-usage or a bigger container shm).
- Pass positive finite integers for width and height.
Example fix
// before
page.setViewportSize({ width: 1280, height: 720 }); // fails if page is mid-close
// after
if (!page.isClosed()) {
page.setViewportSize({ width: 1280, height: 720 });
} Defensive patterns
Strategy: try-catch
Validate before calling
if (page.isClosed()) { /* skip resize */ }
const w = Number(size.width), h = Number(size.height);
if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) throw new Error('invalid viewport'); Type guard
const isValidViewport = (s) => typeof s === 'object' && s !== null && Number.isFinite(s.width) && s.width > 0 && Number.isFinite(s.height) && s.height > 0;
Try / catch
try {
page.setViewportSize({ width: 1280, height: 720 });
} catch (e) {
if (/target closed|session/i.test(String(e))) { /* page gone; abort flow */ }
else throw e;
} Prevention
- Never resize during navigation or teardown; check page.isClosed() first.
- Keep sizes positive integers.
- Give Chrome enough memory/shm so the target does not die mid-resize.
When it happens
Trigger: Calling page.setViewportSize({width, height}) (or any API that resizes the viewport, e.g. element screenshots that enlarge the viewport for oversized elements via screenshotElement's overriddenViewportSize path) while the page/target is closing, on a crashed browser, or after the CDP session is torn down; passing NaN or negative dimensions is also surfaced through this wrapper.
Common situations: Resizing the viewport right before or during navigation/closure races the target being destroyed; running with a browser that crashed mid-test (OOM in containerized Chrome); headless environment issues that kill the target; extremely large sizes that Chrome rejects.
Related errors
- capturing screenshot
- getting layout metrics for screenshot
- getting original viewport size
- getting viewport dimensions
- resetting screenshot background color
AI-assisted analysis of grafana/k6@3fcf5388d7 (2026-09-20).
Data as JSON: /api/errors/8a7d6b0273fe232c.
Report an issue: GitHub.
Appendix: source
Thrown at internal/js/modules/k6/browser/common/page.go:1764
p.logger.Debugf("Page:SetExtraHTTPHeaders", "sid:%v", p.sessionID())
p.extraHTTPHeaders = headers
return p.updateExtraHTTPHeaders()
}
// SetInputFiles sets input files for the selected element.
func (p *Page) SetInputFiles(selector string, files *Files, opts *FrameSetInputFilesOptions) error {
p.logger.Debugf("Page:SetInputFiles", "sid:%v selector:%s", p.sessionID(), selector)
return p.MainFrame().SetInputFiles(selector, files, opts)
}
// SetViewportSize will update the viewport width and height.
func (p *Page) SetViewportSize(viewportSize *Size) error {
p.logger.Debugf("Page:SetViewportSize", "sid:%v", p.sessionID())
if err := p.setViewportSize(p.ctx, viewportSize); err != nil {
return fmt.Errorf("setting viewport size: %w", err)
}
return nil
}
// Tap will tap the element matching the provided selector.
func (p *Page) Tap(selector string, opts *FrameTapOptions) error {
p.logger.Debugf("Page:SetViewportSize", "sid:%v selector:%s", p.sessionID(), selector)
return p.MainFrame().Tap(selector, opts)
}
// TextContent returns the textContent attribute of the first element found
// that matches the selector. The second return value is true if the returned
// text content is not null or empty, and false otherwise.
func (p *Page) TextContent(selector string, popts *FrameTextContentOptions) (string, bool, error) {
p.logger.Debugf("Page:TextContent", "sid:%v selector:%s", p.sessionID(), selector)
View on GitHub (pinned to 3fcf5388d7)