{"record":{"id":"b71063e9c4793e4f","repo":"xpzouying/xiaohongshu-mcp","slug":"s-w-b71063","errorCode":null,"errorMessage":"未找到交互元素 %s: %w","messagePattern":"未找到交互元素 (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"xiaohongshu/like_favorite.go","lineNumber":61,"sourceCode":"\treturn &interactAction{page: page}\n}\n\nfunc (a *interactAction) preparePage(ctx context.Context, actionType interactActionType, feedID, xsecToken string) *rod.Page {\n\tpage := a.page.Context(ctx).Timeout(60 * time.Second)\n\turl := makeFeedDetailURL(feedID, xsecToken)\n\tlogrus.Infof(\"Opening feed detail page for %s: %s\", actionType, url)\n\n\tpage.MustNavigate(url)\n\tpage.MustWaitDOMStable()\n\thumanize.Delay(ctx, humanize.AfterNavigate)\n\n\treturn page\n}\n\nfunc (a *interactAction) performClick(page *rod.Page, selector string) error {\n\telement, err := page.Element(selector)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"未找到交互元素 %s: %w\", selector, err)\n\t}\n\treturn humanize.Click(element)\n}\n\n// stateOf 从交互状态里取目标字段（点赞取 liked，收藏取 collected）。\ntype stateOf func(liked, collected bool) bool\n\n// toggleInteract 点击交互按钮并轮询校验状态是否变为 want；最多两次点击。\n// 到达即成功；始终未变或无法读状态则返回 error——消除\"点了没报错就算成功\"的假阳性。\nfunc (a *interactAction) toggleInteract(ctx context.Context, page *rod.Page, feedID, selector string, want bool, actionType interactActionType, pick stateOf) error {\n\tfor attempt := 1; attempt <= 2; attempt++ {\n\t\tif err := a.performClick(page, selector); err != nil {\n\t\t\treturn fmt.Errorf(\"%s点击失败: %w\", actionType, err)\n\t\t}\n\n\t\tok, err := a.waitInteractState(page, feedID, want, pick, 4*time.Second)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%s后无法确认状态: %w\", actionType, err)","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/xpzouying/xiaohongshu-mcp/blob/332d196854a9eac0d2b8c2c0e3d0cc43139d724c/xiaohongshu/like_favorite.go#L43-L79","documentation":"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.","triggerScenarios":"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.","commonSituations":"xiaohongshu DOM update changing selectors; slow page render exceeding rod's element wait timeout; interacting with a blocked/removed note that lacks action buttons.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// ensure the page is ready before interacting\nif err := page.WaitLoad(); err != nil { return err }\n// optionally verify the selector exists first\nif _, err := page.Element(selector); err != nil {\n    return fmt.Errorf(\"precheck: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"err := client.LikeFeed(ctx, feedID)\nif err != nil && strings.Contains(err.Error(), \"未找到交互元素\") {\n    log.Warnf(\"selector missing for %s — DOM may have changed\", feedID)\n    return err\n}","preventionTips":["Wait for page load/network idle before interaction calls","Track xiaohongshu DOM changes; keep selectors centralized","Skip notes that fail accessibility checks before interacting"],"tags":["dom","selector","scraping"],"backgroundTag":"element-not-found","analyzedSha":"332d196854a9eac0d2b8c2c0e3d0cc43139d724c","analyzedAt":"2026-09-05T22:22:55.988Z","contentChangedAt":"2026-09-05T22:22:55.988Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}