xpzouying/xiaohongshu-mcp · error

未找到交互元素 %s: %w

Error message

未找到交互元素 %s: %w

What it means

performClick waits for the interaction element (like/favorite button) matched by selector via page.Element. If the element can't be found it throws '未找到交互元素 <selector>: %w', aborting the like/favorite toggle.

Source

Thrown at xiaohongshu/like_favorite.go:61

	return &interactAction{page: page}
}

func (a *interactAction) preparePage(ctx context.Context, actionType interactActionType, feedID, xsecToken string) *rod.Page {
	page := a.page.Context(ctx).Timeout(60 * time.Second)
	url := makeFeedDetailURL(feedID, xsecToken)
	logrus.Infof("Opening feed detail page for %s: %s", actionType, url)

	page.MustNavigate(url)
	page.MustWaitDOMStable()
	humanize.Delay(ctx, humanize.AfterNavigate)

	return page
}

func (a *interactAction) performClick(page *rod.Page, selector string) error {
	element, err := page.Element(selector)
	if err != nil {
		return fmt.Errorf("未找到交互元素 %s: %w", selector, err)
	}
	return humanize.Click(element)
}

// stateOf 从交互状态里取目标字段(点赞取 liked,收藏取 collected)。
type stateOf func(liked, collected bool) bool

// toggleInteract 点击交互按钮并轮询校验状态是否变为 want;最多两次点击。
// 到达即成功;始终未变或无法读状态则返回 error——消除"点了没报错就算成功"的假阳性。
func (a *interactAction) toggleInteract(ctx context.Context, page *rod.Page, feedID, selector string, want bool, actionType interactActionType, pick stateOf) error {
	for attempt := 1; attempt <= 2; attempt++ {
		if err := a.performClick(page, selector); err != nil {
			return fmt.Errorf("%s点击失败: %w", actionType, err)
		}

		ok, err := a.waitInteractState(page, feedID, want, pick, 4*time.Second)
		if err != nil {
			return fmt.Errorf("%s后无法确认状态: %w", actionType, err)

View on GitHub (pinned to 332d196854)

Solutions

  1. Verify the note page renders normally in a browser and the button exists
  2. Update the selector constant to the current DOM structure
  3. Wait for page load/network idle before calling the interaction API
Defensive patterns

Strategy: validation

Validate before calling

// ensure the page is ready before interacting
if err := page.WaitLoad(); err != nil { return err }
// optionally verify the selector exists first
if _, err := page.Element(selector); err != nil {
    return fmt.Errorf("precheck: %w", err)
}

Try / catch

err := client.LikeFeed(ctx, feedID)
if err != nil && strings.Contains(err.Error(), "未找到交互元素") {
    log.Warnf("selector missing for %s — DOM may have changed", feedID)
    return err
}

Prevention

When it happens

Trigger: toggleInteract is invoked on a feed detail page where the like/collect button selector doesn't exist — page didn't finish loading, note is blocked, or the UI structure/class names changed.

Common situations: xiaohongshu DOM update changing selectors; slow page render exceeding rod's element wait timeout; interacting with a blocked/removed note that lacks action buttons.

Related errors


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