xpzouying/xiaohongshu-mcp · error

点击提交按钮失败: %w

Error message

点击提交按钮失败: %w

What it means

ReplyToComment 找到提交按钮后 humanize.Click 点击失败:按钮被遮挡、禁用或页面重渲染导致点击坐标失效。

Source

Thrown at xiaohongshu/comment_feed.go:178

	if err != nil {
		return fmt.Errorf("无法找到回复输入框: %w", err)
	}

	// 输入内容
	if err := humanize.Type(ctx, inputEl, content); err != nil {
		return fmt.Errorf("输入回复内容失败: %w", err)
	}

	humanize.Delay(ctx, humanize.AfterType)

	// 查找并点击提交按钮
	submitBtn, err := page.Element("div.bottom button.submit")
	if err != nil {
		return fmt.Errorf("无法找到提交按钮: %w", err)
	}

	if err := humanize.Click(submitBtn); err != nil {
		return fmt.Errorf("点击提交按钮失败: %w", err)
	}

	humanize.Delay(ctx, humanize.AfterClick)

	// 就地校验:回复应在评论区渲染出现,否则判定未成功。
	if !waitCommentRendered(page, content, 4*time.Second) {
		logrus.Warnf("回复提交后未在评论区渲染,判定未成功: feed=%s", feedID)
		return fmt.Errorf("回复未确认成功:提交后未在评论区出现(可能账号被限制或发送失败)")
	}

	logrus.Infof("回复评论成功并已确认")
	return nil
}

// findCommentElement 滚动查找指定评论:优先按 commentID 命中,否则按 userID 匹配。
// 二级评论折叠在「展开 N 条回复」后面,未展开时不在 DOM 里,因此查找过程中要展开。
func findCommentElement(ctx context.Context, page *rod.Page, commentID, userID string) (*rod.Element, error) {
	logrus.Infof("开始查找评论 - commentID: %s, userID: %s", commentID, userID)

View on GitHub (pinned to 332d196854)

Solutions

  1. 重试整个 ReplyToComment 流程(偶发错误,重试通常可恢复)
  2. 在点击前重新查找元素而不是复用旧句柄,避免 stale element
  3. 降低操作频率,检查是否每次都在同一位置失败(若是则疑似风控遮罩)
  4. 检查 humanize.Click 实现与 rod 超时设置,必要时延长 page.Timeout

Example fix

// before
if err := humanize.Click(submitBtn); err != nil {
    return fmt.Errorf("点击提交按钮失败: %w", err)
}

// after
if err := humanize.Click(submitBtn); err != nil {
    // 按钮可能被重渲染移除,重新查找一次再点
    if btn2, err2 := page.Element("div.bottom button.submit"); err2 == nil {
        if err3 := humanize.Click(btn2); err3 != nil {
            return fmt.Errorf("点击提交按钮失败: %w", err3)
        }
    } else {
        return fmt.Errorf("点击提交按钮失败(按钮已消失): %w", err)
    }
}
Defensive patterns

Strategy: retry

Try / catch

for i := 0; i < 2; i++ {
    err := action.ReplyToComment(ctx, feedID, token, commentID, userID, content)
    if err == nil {
        break
    }
    if !strings.Contains(err.Error(), "点击提交按钮失败") || i == 1 {
        return err
    }
    time.Sleep(3 * time.Second)
}

Prevention

When it happens

Trigger: ReplyToComment 中 page.Element 找到 div.bottom button.submit 后,humanize.Click(submitBtn) 执行失败:元素在点击前被前端重渲染移除、元素不可点击(被遮罩覆盖)、或 rod 页面超时到期。

Common situations: 页面在输入完成后弹出风控验证层遮住按钮;前端局部重渲染导致元素句柄失效(stale element);5 分钟页面超时在长滚动查找评论后刚好到期。

Related errors


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