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
- 截图或保存页面 HTML 确认当前页面是发布页还是登录页,登录态失效则重新登录
- 检查 mustClickPublishTab 内的 tab 选择器与文案是否与当前页面一致,按需更新
- 用 rod 的 WaitRequestIdle / 轮询等待 tab 元素出现,替代固定 time.Sleep
- 为该步骤增加一次重试(刷新页面后重新查找 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
- 每次发布前校验登录态/URL,避免在登录页上找 tab
- tab 查找失败时保存截图便于排查改版
- 用元素等待替代固定 sleep
- 把 tab 文案/选择器收敛为常量,改版时只改一处
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.