{"record":{"id":"d054ba42f81c8e2f","repo":"grafana/k6","slug":"setting-viewport-size-to-s-w","errorCode":null,"errorMessage":"setting viewport size to %s: %w","messagePattern":"setting viewport size to (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/screenshotter.go","lineNumber":303,"sourceCode":"\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"node is either not visible or not an HTMLElement: %w\", err)\n\t}\n\tif bbox.Width <= 0 {\n\t\treturn nil, fmt.Errorf(\"node has 0 width\")\n\t}\n\tif bbox.Height <= 0 {\n\t\treturn nil, fmt.Errorf(\"node has 0 height\")\n\t}\n\n\tvar overriddenViewportSize *Size\n\tfitsViewport := bbox.Width <= viewportSize.Width && bbox.Height <= viewportSize.Height\n\tif !fitsViewport { //nolint:nestif\n\t\toverriddenViewportSize = Size{\n\t\t\tWidth:  math.Max(viewportSize.Width, bbox.Width),\n\t\t\tHeight: math.Max(viewportSize.Height, bbox.Height),\n\t\t}.enclosingIntSize()\n\t\tif err := h.frame.page.setViewportSize(overriddenViewportSize); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"setting viewport size to %s: %w\",\n\t\t\t\toverriddenViewportSize, err)\n\t\t}\n\t\terr = h.waitAndScrollIntoViewIfNeeded(h.ctx, false, true, opts.Timeout)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"scrolling element into view: %w\", err)\n\t\t}\n\t\tbbox, err = h.boundingBox()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"node is either not visible or not an HTMLElement: %w\", err)\n\t\t}\n\t\tif bbox.Width <= 0 {\n\t\t\treturn nil, fmt.Errorf(\"node has 0 width\")\n\t\t}\n\t\tif bbox.Height <= 0 {\n\t\t\treturn nil, fmt.Errorf(\"node has 0 height\")\n\t\t}\n\t}\n","sourceCodeStart":285,"sourceCodeEnd":321,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/screenshotter.go#L285-L321","documentation":"When an element is larger than the viewport, elementHandle.screenshot() first grows the viewport to max(viewport, boundingBox) via setViewportSize (Emulation.setDeviceMetricsOverride). This error wraps that CDP call failing, and includes the attempted size.","triggerScenarios":"elementHandle.screenshot() on an element wider/taller than the viewport while the page is closing/navigating, the renderer is gone, or device-metrics emulation is in a bad state; also context cancellation during k6 teardown.","commonSituations":"Screenshotting full-width tables/long sections racing navigation; browser crash under load; oversized elements (huge data grids) hitting chrome's device-metrics limits.","solutions":["Stabilize the page before capture (await goto, waitForLoadState, no concurrent close).","Retry the element screenshot once — transient emulation errors often clear.","Set an initial viewport large enough to contain the element so no resize is needed.","If sizes are extreme, capture with page.screenshot({fullPage:true}) or clip instead of element screenshot."],"exampleFix":"// before\nawait page.$('.wide-table').then(el => el.screenshot({ path: 't.png' })); // element >> viewport, racing load\n\n// after\nconst p = await browser.newPage({ viewport: { width: 1920, height: 2400 } });\nawait p.goto(url); await p.waitForLoadState('load');\nawait (await p.$('.wide-table')).screenshot({ path: 't.png' });","handlingStrategy":"try-catch","validationCode":"const bb = await locator.boundingBox();\nconst fits = bb && bb.width <= 1280 && bb.height <= 720; // compare with your viewport; resize upfront if not","typeGuard":null,"tryCatchPattern":"try { await el.screenshot({ path: 'e.png' }); }\ncatch (e) { if (String(e).includes('setting viewport size')) { /* wait for idle page, retry once */ } else throw e; }","preventionTips":["Open pages with a viewport large enough for the target element.","Avoid resizing captures while navigation is pending.","Keep the page open until the screenshot resolves."],"tags":["k6","browser","screenshot","element-handle","viewport-resize","cdp"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}