xpzouying/xiaohongshu-mcp · error
读取旧版发布按钮 disabled 属性失败
Error message
读取旧版发布按钮 disabled 属性失败
What it means
This error is wrapped in findPublishButton when the CDP call to read the `disabled` attribute of a visible legacy (old-version) Xiaohongshu publish button fails. It means the rod Element.Attribute call itself errored (browser/tab closed, element detached, CDP communication failure), not that the button is disabled. The library throws it because it cannot determine clickability without the attribute value.
Source
Thrown at xiaohongshu/publish.go:522
if submitDisabled != nil && *submitDisabled == "true" {
return &publishButton{elem: widget, isWidget: true}, "新版发布按钮不可点击", nil
}
return &publishButton{elem: widget, isWidget: true}, "", nil
}
oldButtons, err := page.Elements(".publish-page-publish-btn button.bg-red")
if err != nil {
return nil, "", errors.Wrap(err, "查找旧版发布按钮失败")
}
for _, oldButton := range oldButtons {
if !isElementVisible(oldButton) {
continue
}
if disabled, err := oldButton.Attribute("disabled"); err != nil {
return nil, "", errors.Wrap(err, "读取旧版发布按钮 disabled 属性失败")
} else if disabled != nil {
return &publishButton{elem: oldButton}, "旧版发布按钮 disabled", nil
}
if ariaDisabled, err := oldButton.Attribute("aria-disabled"); err != nil {
return nil, "", errors.Wrap(err, "读取旧版发布按钮 aria-disabled 属性失败")
} else if ariaDisabled != nil && *ariaDisabled == "true" {
return &publishButton{elem: oldButton}, "旧版发布按钮 aria-disabled=true", nil
}
if cls, err := oldButton.Attribute("class"); err != nil {
return nil, "", errors.Wrap(err, "读取旧版发布按钮 class 属性失败")
} else if cls != nil && hasExactClass(*cls, "disabled") {
return &publishButton{elem: oldButton}, "旧版发布按钮包含 disabled class", nil
}
return &publishButton{elem: oldButton}, "", nil
}View on GitHub (pinned to 332d196854)
Solutions
- Retry waitForPublishButtonClickable with a small delay — the element likely got detached by a page re-render; the polling loop will re-query fresh elements
- Check that the browser process and target tab are still alive (rod.Browser / page.MustTarget) before retrying
- Increase page load waits (page.WaitStable / WaitDOMStable) before triggering publish so elements stop mutating mid-check
- Upgrade rod to the latest version to rule out known CDP race bugs
Example fix
// before
btn, reason, err := waitForPublishButtonClickable(page)
// after
err = page.WaitDOMStable(time.Second, 0.1)
if err != nil { return err }
btn, reason, err := waitForPublishButtonClickable(page) Defensive patterns
Strategy: retry
Validate before calling
if page == nil { return errors.New("page 未初始化") }
if err := page.WaitStable(300 * time.Millisecond); err != nil { return err } Type guard
func pageAlive(page *rod.Page) bool {
if page == nil { return false }
_, err := page.Elements("body")
return err == nil
} Try / catch
btn, reason, err := waitForPublishButtonClickable(page)
if err != nil {
if strings.Contains(err.Error(), "读取旧版发布按钮 disabled 属性失败") {
time.Sleep(500 * time.Millisecond)
btn, reason, err = waitForPublishButtonClickable(page)
}
if err != nil { return err }
} Prevention
- Wait for DOM stability before starting publish-button polling
- Keep the browser window/tab open for the whole automation run
- Wrap attribute-reading steps in a retry loop with backoff
- Monitor the CDP connection and re-launch on disconnect
When it happens
Trigger: Calling waitForPublishButtonClickable while the page is being navigated or reloading so the matched `.publish-page-publish-btn button.bg-red` element is detached between query and attribute read; the browser context/tab was closed mid-poll; CDP connection dropped.
Common situations: Slow page loads where the old publish button is replaced by React re-renders; user closes the Chrome window during automation; network hiccup breaking the DevTools websocket; running against a stale rod.Page after navigation.
Related errors
AI-assisted analysis of xpzouying/xiaohongshu-mcp@332d196854 (2026-09-05).
Data as JSON: /api/errors/9b0284b83a06259e.
Report an issue: GitHub.