xpzouying/xiaohongshu-mcp · error

元素无可点击区域

Error message

元素无可点击区域

What it means

Raised in ClickNoWait (humanize/input.go:111) when elem.Shape() returns a shape with zero quads, meaning the browser reports no clickable geometry for the element. Without a quad there is no area to compute a center point or jitter target for the humanized mouse move/click.

Source

Thrown at humanize/input.go:111

	}

	Delay(elem.Page().GetContext(), PointerSettle)

	if err := elem.WaitEnabled(); err != nil {
		return err
	}

	return pressAndRelease(mouse)
}

// ClickNoWait 跳过 WaitInteractable 的遮挡重试,用于它会误判而死等的场景。
func ClickNoWait(elem *rod.Element) error {
	shape, err := elem.Shape()
	if err != nil {
		return err
	}
	if len(shape.Quads) == 0 {
		return errors.New("元素无可点击区域")
	}

	q := shape.Quads[0]
	center := proto.Point{X: (q[0] + q[4]) / 2, Y: (q[1] + q[5]) / 2}

	target := jitterInQuad(center, q)
	if err := ensureClickable(elem, target); err != nil {
		return err
	}

	mouse := elem.Page().Mouse
	if err := moveMouseCurved(mouse, target); err != nil {
		return err
	}
	return pressAndRelease(mouse)
}

func MoveTo(page *rod.Page, pt proto.Point) error {

View on GitHub (pinned to 332d196854)

Solutions

  1. Wait for the element to be visible/laid out (rod WaitVisible / page.WaitStable) before calling ClickNoWait
  2. Re-acquire the element handle if the DOM was re-rendered
  3. Use humanize.Click (which waits for interactability) instead of ClickNoWait for elements that may not be ready
  4. Check the element is not display:none / zero-size; pick a visible parent or sibling trigger instead

Example fix

// before
el, _ := page.Element("#go")
err := humanize.ClickNoWait(el)
// after
el := page.MustWaitVisible("#go")
err := humanize.Click(el) // waits for interactability internally
Defensive patterns

Strategy: validation

Validate before calling

shape, err := elem.Shape()
if err == nil && len(shape.Quads) > 0 { /* clickable area exists */ }

Type guard

func hasClickArea(elem *rod.Element) bool {
    s, err := elem.Shape()
    return err == nil && len(s.Quads) > 0
}

Try / catch

if err := humanize.ClickNoWait(el); err != nil {
    if strings.Contains(err.Error(), "无可点击区域") {
        el = page.MustElement(selector) // re-acquire and retry
    }
    return err
}

Prevention

When it happens

Trigger: Calling humanize.ClickNoWait on an element that is display:none, detached from the DOM, or has zero-size layout — Shape() then yields len(shape.Quads)==0 and the error is returned.

Common situations: Clicking elements before the page finished layout; stale element handles after SPA re-render; clicking hidden inputs or elements with display:none used purely as data holders.

Related errors


AI-assisted analysis of xpzouying/xiaohongshu-mcp@332d196854 (2026-09-05). Data as JSON: /api/errors/ed642f75cc0ea12c. Report an issue: GitHub.