xpzouying/xiaohongshu-mcp · error

等待商品选择弹窗超时

Error message

等待商品选择弹窗超时

What it means

waitForProductModal 在 10 秒轮询窗口内从未找到可见的 .multi-goods-selector-modal 元素:要么点击商品入口后弹窗未弹出(前端渲染失败),要么网络慢导致弹窗 10s 内未加载完成。

Source

Thrown at xiaohongshu/publish.go:1253

}

// waitForProductModal 等待商品选择弹窗出现
func waitForProductModal(page *rod.Page) (*rod.Element, error) {
	deadline := time.Now().Add(10 * time.Second)

	for time.Now().Before(deadline) {
		modal, err := page.Element(".multi-goods-selector-modal")
		if err == nil && modal != nil {
			visible, _ := modal.Visible()
			if visible {
				slog.Info("商品选择弹窗已出现")
				return modal, nil
			}
		}
		time.Sleep(100 * time.Millisecond) // 缩短轮询间隔,更快响应
	}

	return nil, errors.New("等待商品选择弹窗超时")
}

// searchAndSelectProduct 搜索并选择商品
func searchAndSelectProduct(ctx context.Context, page *rod.Page, modal *rod.Element, keyword string) error {
	slog.Info("搜索商品", "keyword", keyword)

	// 1. 获取搜索框
	searchInput, err := modal.Element(`input[placeholder="搜索商品ID 或 商品名称"]`)
	if err != nil {
		return errors.Wrap(err, "未找到商品搜索框")
	}

	// 2. 清空并输入关键词。SelectAllText 走 Eval(this.select()),只改选区、不额外
	// 派发事件,暂时保留(换键盘全选要区分 Ctrl/Cmd)。
	if err := searchInput.SelectAllText(); err != nil {
		slog.Warn("选择搜索框文本失败", "error", err)
	}
	time.Sleep(100 * time.Millisecond)

View on GitHub (pinned to 332d196854)

Solutions

  1. 先用浏览器手动复现,确认点击'添加商品'后弹窗是否出现及实际 DOM 结构
  2. 更新 waitForProductModal 中的弹窗选择器以匹配最新 DOM
  3. 确认账号已开通带货/商品权限且处于登录态
  4. 增加等待时长或提高轮询前的稳定性(如先等待网络空闲)

Example fix

// before
return nil, errors.New("等待商品选择弹窗超时")
// after
// 使用 rod 内置等待代替手动轮询,超时可配置
return nil, fmt.Errorf("等待商品选择弹窗超时 (waited %s)", timeout)
Defensive patterns

Strategy: try-catch

Validate before calling

// 调用前确认登录态与页面
u := page.MustInfo().URL
if strings.Contains(u, "login") { return errors.New("未登录或被重定向") }

Try / catch

if err := bindProducts(page, products); err != nil {
	if strings.Contains(err.Error(), "等待商品选择弹窗超时") {
		page.MustScreenshot("product-modal-timeout.png")
		return skipProductBinding
	}
	return err
}

Prevention

When it happens

Trigger: bindProducts → waitForProductModal:在发布页点击'添加商品'按钮后,弹窗选择器在超时窗口内始终匹配不到(弹窗没弹出、DOM 结构变了、页面被风控/跳转到登录、网络慢导致弹窗加载晚于超时)。

Common situations: 小红书前端改版导致弹窗 class 变化;账号无带货权限或店铺未开通导致点击后无响应;页面未登录或被重定向;低网速下弹窗渲染超过等待上限。

Related errors


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