xpzouying/xiaohongshu-mcp · error

切换到上传视频失败

Error message

切换到上传视频失败

What it means

NewPublishVideoAction 已导航到发布页,但 mustClickPublishTab 切换到「上传视频」TAB 失败(TAB 未找到或被浮层遮挡),无法进入视频上传模式。具体原因见被包装的底层错误。

Source

Thrown at xiaohongshu/publish_video.go:46

	pp := page.Timeout(300 * time.Second)

	if err := pp.Navigate(urlOfPublic); err != nil {
		return nil, errors.Wrap(err, "导航到发布页面失败")
	}

	// 使用 WaitLoad 代替 WaitIdle(更宽松)
	if err := pp.WaitLoad(); err != nil {
		logrus.Warnf("等待页面加载出现问题: %v,继续尝试", err)
	}
	time.Sleep(2 * time.Second)

	if err := pp.WaitDOMStable(time.Second, 0.1); err != nil {
		logrus.Warnf("等待 DOM 稳定出现问题: %v,继续尝试", err)
	}
	time.Sleep(1 * time.Second)

	if err := mustClickPublishTab(pp, "上传视频"); err != nil {
		return nil, errors.Wrap(err, "切换到上传视频失败")
	}

	time.Sleep(1 * time.Second)

	return &PublishAction{page: pp}, nil
}

// PublishVideo 上传视频并提交
func (p *PublishAction) PublishVideo(ctx context.Context, content PublishVideoContent) error {
	if content.VideoPath == "" {
		return errors.New("视频不能为空")
	}

	// 重设超时:.Context(ctx) 会替换掉 NewPublishVideoAction 里 Timeout(300s) 的 deadline
	page := p.page.Context(ctx).Timeout(300 * time.Second)

	if err := uploadVideo(page, content.VideoPath); err != nil {
		return errors.Wrap(err, "小红书上传视频失败")

View on GitHub (pinned to 332d196854)

Solutions

  1. 截图或保存页面 HTML 确认当前页面是发布页还是登录页,登录态失效则重新登录
  2. 检查 mustClickPublishTab 内的 tab 选择器与文案是否与当前页面一致,按需更新
  3. 用 rod 的 WaitRequestIdle / 轮询等待 tab 元素出现,替代固定 time.Sleep
  4. 为该步骤增加一次重试(刷新页面后重新查找 tab)

Example fix

// before
time.Sleep(1 * time.Second)
if err := mustClickPublishTab(pp, "上传视频"); err != nil {
    return nil, errors.Wrap(err, "切换到上传视频失败")
}
// after
var tabErr error
for i := 0; i < 3; i++ {
    if tabErr = mustClickPublishTab(pp, "上传视频"); tabErr == nil {
        break
    }
    _ = pp.Reload()
    _ = pp.WaitLoad()
    time.Sleep(2 * time.Second)
}
if tabErr != nil {
    return nil, errors.Wrap(tabErr, "切换到上传视频失败")
}
Defensive patterns

Strategy: validation

Validate before calling

// 调用前确认当前确实是发布页而非登录页
url := pp.MustInfo().URL
if strings.Contains(url, "login") || !strings.Contains(url, "creator") {
    return errors.New("登录态失效,被重定向到: " + url)
}

Type guard

func onPublishPage(pp *rod.Page) bool {
    el, err := pp.Element("text=上传视频")
    return err == nil && el != nil
}

Try / catch

if err := mustClickPublishTab(pp, "上传视频"); err != nil {
    snapshot, _ := pp.Screenshot(true, nil)
    _ = os.WriteFile("tab-fail.png", snapshot, 0o644)
    return errors.Wrap(err, "切换到上传视频失败,已保存页面截图")
}

Prevention

When it happens

Trigger: mustClickPublishTab 返回错误:发布页 DOM 改版导致 tab 选择器失效;页面未登录被重定向到登录页(没有 tab 可点);页面加载慢,固定 sleep 后 tab 未渲染;「上传视频」文案被平台更名。

Common situations: cookie 过期后进入页面实际是登录页;小红书改版把 tab 文字改成「上传视频」以外的形式或换了组件库;弱网下 WaitDOMStable 失败(仅 warn 不中断)后 tab 还没出来;默认停在「上传图文」tab 且查找范围不对。

Related errors


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