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

  1. Wait for the element to be visible and stable before using offsets: await el.waitFor({ state: 'visible' })
  2. Scroll it into view first: await el.scrollIntoViewIfNeeded()
  3. Drop the offset and use a plain center click if the exact point isn't essential
  4. 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

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


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)