xpzouying/xiaohongshu-mcp · error

查找正文候选元素失败

Error message

查找正文候选元素失败

What it means

findTextboxByPlaceholder wraps failure from page.Elements("p") when enumerating candidate content paragraphs. This error means rod could not execute the query for <p> elements on the publish page, typically a CDP-level failure rather than 'no elements found' (that returns a separate error).

Source

Thrown at xiaohongshu/publish.go:761

	firstItem, err := topicContainer.Element(".item")
	if err != nil || firstItem == nil {
		slog.Warn("未找到标签联想选项,直接输入空格", "tag", tag)
		return humanize.Type(ctx, contentElem, " ")
	}

	if err := humanize.Click(firstItem); err != nil {
		return errors.Wrap(err, "点击标签联想选项失败")
	}
	slog.Info("成功点击标签联想选项", "tag", tag)
	time.Sleep(500 * time.Millisecond) // 技术等待:等标签处理完成
	return nil
}

func findTextboxByPlaceholder(page *rod.Page) (*rod.Element, error) {
	elements, err := page.Elements("p")
	if err != nil {
		return nil, errors.Wrap(err, "查找正文候选元素失败")
	}
	if len(elements) == 0 {
		return nil, errors.New("no p elements found")
	}

	placeholderElem := findPlaceholderElement(elements, "输入正文描述")
	if placeholderElem == nil {
		return nil, errors.New("no placeholder element found")
	}

	textboxElem := findTextboxParent(placeholderElem)
	if textboxElem == nil {
		return nil, errors.New("no textbox parent found")
	}

	return textboxElem, nil
}

View on GitHub (pinned to 332d196854)

Solutions

  1. Verify the page is alive before searching (e.g., page.Info() or page.MustWaitStable pattern).
  2. Re-navigate/reload the publish page if the session is stale, then retry.
  3. Check the rod browser connection and re-connect if the CDP websocket dropped.
  4. Wrap with a short retry since transient CDP races are common.

Example fix

// before
elements, err := page.Elements("p")
// after
if _, err := page.Info(); err != nil {
    return nil, errors.Wrap(err, "页面已失效,请重新打开发布页")
}
elements, err := page.Elements("p")
Defensive patterns

Strategy: try-catch

Validate before calling

if _, err := page.Info(); err != nil { return errors.Wrap(err, "页面已失效") }

Type guard

func pageAlive(p *rod.Page) bool { _, err := p.Info(); return err == nil }

Try / catch

contentElem, err := findContentElement(page)
if err != nil {
    if strings.Contains(err.Error(), "查找正文候选元素失败") {
        return errors.New("发布页不可用,请重新打开后再试")
    }
    return err
}

Prevention

When it happens

Trigger: Calling findContentElement when the page object is invalid, the tab was closed, the CDP connection dropped, or page.Elements hit a navigation/race while querying.

Common situations: Browser closed mid-flow; page navigated between publish steps; remote browser endpoint unreachable; using a stale rod.Page after the tab crashed.

Related errors


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