xpzouying/xiaohongshu-mcp · error

输入标签内容失败

Error message

输入标签内容失败

What it means

inputTag wraps failure from humanize.Type when typing the actual tag text after the '#'. The '#' was typed successfully but sending the tag body to the content element failed, so no tag text could be entered for autocomplete. Indicates the element or browser session failed mid-sequence.

Source

Thrown at xiaohongshu/publish.go:732

	for _, tag := range tags {
		tag = strings.TrimLeft(tag, "#")
		if err := inputTag(ctx, contentElem, tag); err != nil {
			return errors.Wrapf(err, "输入标签[%s]失败", tag)
		}
	}
	return nil
}

func inputTag(ctx context.Context, contentElem *rod.Element, tag string) error {
	// 输入 # 触发话题联想
	if err := humanize.Type(ctx, contentElem, "#"); err != nil {
		return errors.Wrap(err, "输入#失败")
	}
	time.Sleep(200 * time.Millisecond) // 技术等待:等联想下拉框弹出

	if err := humanize.Type(ctx, contentElem, tag); err != nil {
		return errors.Wrap(err, "输入标签内容失败")
	}

	time.Sleep(1 * time.Second) // 技术等待:等联想结果刷新

	page := contentElem.Page()
	topicContainer, err := page.Element("#creator-editor-topic-container")
	if err != nil || topicContainer == nil {
		slog.Warn("未找到标签联想下拉框,直接输入空格", "tag", tag)
		return humanize.Type(ctx, contentElem, " ")
	}

	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 {

View on GitHub (pinned to 332d196854)

Solutions

  1. Verify the element is still attached after typing '#' (WaitStable before typing the tag).
  2. Check the context deadline is generous enough for per-character typing.
  3. Retry the whole inputTag call for the failing tag.
  4. Validate tag content (no newlines/control chars) before publishing, as such chars can break typing.

Example fix

// before
if err := humanize.Type(ctx, contentElem, tag); err != nil {
    return errors.Wrap(err, "输入标签内容失败")
}
// after
time.Sleep(300 * time.Millisecond) // 等编辑器稳定
if err := contentElem.WaitStable(200 * time.Millisecond); err != nil {
    return errors.Wrap(err, "编辑器元素失效")
}
if err := humanize.Type(ctx, contentElem, tag); err != nil {
    return errors.Wrap(err, "输入标签内容失败")
}
Defensive patterns

Strategy: retry

Validate before calling

if strings.ContainsAny(tag, "\n\r\t") { return errors.New("tag 含非法字符") }
if err := contentElem.WaitStable(200 * time.Millisecond); err != nil { return err }

Type guard

func isValidTag(tag string) bool { return tag != "" && !strings.ContainsAny(tag, "\n\r\t") }

Try / catch

if err := inputTag(ctx, contentElem, tag); err != nil {
    slog.Warn("标签输入失败,重试一次", "tag", tag)
    err = inputTag(ctx, contentElem, tag)
}

Prevention

When it happens

Trigger: Same as 190 but occurring on the second humanize.Type call: element detached after the 200ms wait, page busy rendering the autocomplete dropdown, browser connection lost, or context cancelled during typing.

Common situations: Tags containing characters needing IME/keyboard handling that the humanizer types slowly, exceeding timeouts; page re-render triggered by the '#'; user context deadline exceeded on slow machines.

Related errors


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