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
- Verify the note page renders normally in a browser and the button exists
- Update the selector constant to the current DOM structure
- 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
- Wait for page load/network idle before interaction calls
- Track xiaohongshu DOM changes; keep selectors centralized
- Skip notes that fail accessibility checks before interacting
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.