{"record":{"id":"8a7d6b0273fe232c","repo":"grafana/k6","slug":"setting-viewport-size-w","errorCode":null,"errorMessage":"setting viewport size: %w","messagePattern":"setting viewport size: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/page.go","lineNumber":1755,"sourceCode":"\tp.logger.Debugf(\"Page:SetExtraHTTPHeaders\", \"sid:%v\", p.sessionID())\n\n\tp.extraHTTPHeaders = headers\n\treturn p.updateExtraHTTPHeaders()\n}\n\n// SetInputFiles sets input files for the selected element.\nfunc (p *Page) SetInputFiles(selector string, files *Files, opts *FrameSetInputFilesOptions) error {\n\tp.logger.Debugf(\"Page:SetInputFiles\", \"sid:%v selector:%s\", p.sessionID(), selector)\n\n\treturn p.MainFrame().SetInputFiles(selector, files, opts)\n}\n\n// SetViewportSize will update the viewport width and height.\nfunc (p *Page) SetViewportSize(viewportSize *Size) error {\n\tp.logger.Debugf(\"Page:SetViewportSize\", \"sid:%v\", p.sessionID())\n\n\tif err := p.setViewportSize(viewportSize); err != nil {\n\t\treturn fmt.Errorf(\"setting viewport size: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// Tap will tap the element matching the provided selector.\nfunc (p *Page) Tap(selector string, opts *FrameTapOptions) error {\n\tp.logger.Debugf(\"Page:SetViewportSize\", \"sid:%v selector:%s\", p.sessionID(), selector)\n\n\treturn p.MainFrame().Tap(selector, opts)\n}\n\n// TextContent returns the textContent attribute of the first element found\n// that matches the selector. The second return value is true if the returned\n// text content is not null or empty, and false otherwise.\nfunc (p *Page) TextContent(selector string, popts *FrameTextContentOptions) (string, bool, error) {\n\tp.logger.Debugf(\"Page:TextContent\", \"sid:%v selector:%s\", p.sessionID(), selector)\n","sourceCodeStart":1737,"sourceCodeEnd":1773,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/page.go#L1737-L1773","documentation":"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.","triggerScenarios":"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).","commonSituations":"Computing width/height from variables that can be 0/undefined at runtime; resizing during teardown; resizing while the page is mid-navigation.","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"],"exampleFix":"// before\nawait page.setViewportSize({ width: 0, height: 600 }); // invalid\n\n// after\nconst w = Number(process.env.W) || 1280;\nawait page.setViewportSize({ width: w, height: 720 });","handlingStrategy":"validation","validationCode":"const isSize = (s) => s && Number.isInteger(s.width) && Number.isInteger(s.height) && s.width > 0 && s.height > 0;\nif (!isSize(size)) throw new Error('viewport size must be positive integers');","typeGuard":"const isValidViewportSize = (s) =>\n  typeof s?.width === 'number' && typeof s?.height === 'number' &&\n  Number.isInteger(s.width) && Number.isInteger(s.height) &&\n  s.width > 0 && s.height > 0;","tryCatchPattern":null,"preventionTips":["Set the viewport once at context creation (newContext({viewport:{width,height}}))","Guard computed dimensions (env vars, device descriptors) before calling setViewportSize"],"tags":["browser","viewport","emulation","validation"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}