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
- Pass positive, non-zero integers for width and height
- Guard computed sizes before the call
- 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
- Set the viewport once at context creation (newContext({viewport:{width,height}}))
- Guard computed dimensions (env vars, device descriptors) before calling setViewportSize
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
- clip area is either empty or outside the viewport
- unsupported vision deficiency: %s
- predicate function is not callable
- "handler" argument cannot be nil
- provided selector is empty
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/8a7d6b0273fe232c.
Report an issue: GitHub.