grafana/k6 · error

setting viewport size: %w

Error message

setting viewport size: %w

What it means

Page.SetViewportSize delegates to the internal setViewportSize, which recalculates the emulated size and applies it (Emulation.setDeviceMetricsOverride) on the main frame session. This outer error wraps either an invalid size failing option parsing or the CDP call failing on a dead/closing session.

Source

Thrown at internal/js/modules/k6/browser/common/page.go:1755

	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(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 93accf6570)

Solutions

  1. Pass positive, non-zero integers for width and height
  2. Guard computed sizes before the call
  3. Call setViewportSize when the page is open and idle, or set viewport once via page.setViewportSize(newContext({viewport: ...})) before navigation

Example fix

// before
await page.setViewportSize({ width: 0, height: 600 }); // invalid

// after
const w = Number(process.env.W) || 1280;
await page.setViewportSize({ width: w, height: 720 });
Defensive patterns

Strategy: validation

Validate before calling

const isSize = (s) => s && Number.isInteger(s.width) && Number.isInteger(s.height) && s.width > 0 && s.height > 0;
if (!isSize(size)) throw new Error('viewport size must be positive integers');

Type guard

const isValidViewportSize = (s) =>
  typeof s?.width === 'number' && typeof s?.height === 'number' &&
  Number.isInteger(s.width) && Number.isInteger(s.height) &&
  s.width > 0 && s.height > 0;

Prevention

When it happens

Trigger: page.setViewportSize({width: 0, height: 0}) or negative/huge values, or a valid size applied to a page whose session is detached (page closing/crashed).

Common situations: Computing width/height from variables that can be 0/undefined at runtime; resizing during teardown; resizing while the page is mid-navigation.

Related errors


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