grafana/k6 · error
finding offset position
Error message
finding offset position: %w
What it means
In offsetPosition(), after border widths were read, BoundingBox() failed for the element, so the offset position cannot be anchored. The wrapped error is the underlying bounding-box failure — typically ErrElementNotVisible ('Could not compute box model'), ErrElementNotAttachedToDOM, or a CDP error.
Solutions
- Wait for the element to be visible and stable before using offsets: await el.waitFor({ state: 'visible' })
- Scroll it into view first: await el.scrollIntoViewIfNeeded()
- Drop the offset and use a plain center click if the exact point isn't essential
- Re-query the element after any navigation instead of reusing handles
Example fix
// before
await el.click({ pos: { x: 5, y: 5 } });
// after
await el.scrollIntoViewIfNeeded();
await el.waitFor({ state: 'visible' });
await el.click({ pos: { x: 5, y: 5 } }); Defensive patterns
Strategy: validation
Validate before calling
await el.scrollIntoViewIfNeeded();
await el.waitFor({ state: 'visible' });
const box = await el.boundingBox();
if (!box) throw new Error('element has no box; cannot use pos offset'); Prevention
- Wait for visible and scroll into view before offset clicks
- Prefer center clicks unless the exact point matters
When it happens
Trigger: Calling a pointer action with a pos offset on an element that is hidden (display:none/visibility:hidden), zero-sized, or detached between the border read and the box read; also when the page/session dies mid-action.
Common situations: Offset clicks on elements inside collapsed containers, hidden tabs, or animating elements measured before layout settles; stale element handles reused after navigation.
Related errors
- finding clickable point
- converting result ( of type %t) to border
- %w: %w
- another element is intercepting with pointer action
- clicking on element
AI-assisted analysis of grafana/k6@3fcf5388d7 (2026-08-18).
Data as JSON: /api/errors/1ce202cdf489578d.
Report an issue: GitHub.
Appendix: source
Thrown at internal/js/modules/k6/browser/common/element_handle.go:443
}
`
opts := evalOptions{
forceCallable: true,
returnByValue: true,
}
result, err := h.evalWithScript(apiCtx, opts, fn)
if err != nil {
return nil, err
}
var border struct{ Top, Left float64 }
if err := convert(result, &border); err != nil {
return nil, fmt.Errorf("converting result (%v of type %t) to border: %w", result, result, err)
}
box, err := h.BoundingBox()
if err != nil {
return nil, fmt.Errorf("finding offset position: %w", err)
}
if box == nil || (border.Left == 0 && border.Top == 0) {
return nil, ErrElementNotVisible
}
// Make point relative to the padding box to align with offsetX/offsetY.
return &Position{
X: box.X + border.Left + offset.X,
Y: box.Y + border.Top + offset.Y,
}, nil
}
func (h *ElementHandle) ownerFrame(apiCtx context.Context) (*Frame, error) {
frameID, err := h.frame.page.getOwnerFrame(apiCtx, h)
if err != nil {
return nil, err
}View on GitHub (pinned to 3fcf5388d7)