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

  1. 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.
  2. Ensure the page is still open (page.isClosed() === false) before calling page.setViewportSize().
  3. Retry the call once after a short wait if the failure happened during a navigation or page-creation race.
  4. Verify Chrome did not crash (check k6 logs and browser process memory limits, e.g. --disable-dev-shm-usage or a bigger container shm).
  5. 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

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


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)