{"record":{"id":"df64217bbc30724e","repo":"grafana/k6","slug":"node-has-0-height","errorCode":null,"errorMessage":"node has 0 height","messagePattern":"node has 0 height","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/screenshotter.go","lineNumber":292,"sourceCode":"\tviewportSize, originalViewportSize, err := s.originalViewportSize(h.frame.page)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"getting original viewport size: %w\", err)\n\t}\n\n\terr = h.waitAndScrollIntoViewIfNeeded(h.ctx, false, true, opts.Timeout)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"scrolling element into view: %w\", err)\n\t}\n\n\tbbox, err := h.boundingBox()\n\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()","sourceCodeStart":274,"sourceCodeEnd":310,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/screenshotter.go#L274-L310","documentation":"Same guard as the width check: elementHandle.screenshot() rejects elements whose bounding box height <= 0 on the first measurement. The element is attached and has a box, but renders with zero height.","triggerScenarios":"Elements collapsed via height:0/overflow:hidden, containers with only absolutely-positioned children, elements whose content (images/fonts) has not loaded so they have no intrinsic height, or elements hidden by responsive CSS at the current viewport width.","commonSituations":"Capturing chart/iframe wrappers before their content sizes them; hamburger-menu panels at mobile widths; CSS transitions from height:0; media queries collapsing elements at the default 1280x720 viewport.","solutions":["Wait for content to size the element: waitForFunction on getBoundingClientRect().height > 0, or wait for the child content's visibility.","Set an explicit height on the wrapper via page.evaluate if you control the page.","Adjust the page viewport so responsive CSS does not collapse the element.","Fall back to page.screenshot({clip}) around the intended area."],"exampleFix":"// before\nawait page.$('#chart-wrap').then(el => el.screenshot({ path: 'c.png' })); // chart not loaded, height 0\n\n// after\nawait page.waitForFunction(() => document.querySelector('#chart-wrap').getBoundingClientRect().height > 0);\nawait (await page.$('#chart-wrap')).screenshot({ path: 'c.png' });","handlingStrategy":"validation","validationCode":"const bb = await locator.boundingBox();\nif (!bb || bb.height <= 0) throw new Error('element has zero height; wait for content to load');","typeGuard":"function hasPositiveHeight(bb) { return bb != null && Number.isFinite(bb.height) && bb.height > 0; }","tryCatchPattern":"try { await el.screenshot({ path: 'e.png' }); }\ncatch (e) { if (String(e).includes('node has 0 height')) { /* waitForFunction height>0, retry */ } else throw e; }","preventionTips":["Wait for iframes/images/charts to load before capture.","Set explicit dimensions on wrapper elements you control.","Check the element is not collapsed by responsive CSS at your viewport."],"tags":["k6","browser","screenshot","element-handle","zero-size","layout"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}