xpzouying/xiaohongshu-mcp · error

未找到商品选择框

Error message

未找到商品选择框

What it means

searchAndSelectProduct 在等待搜索结果列表渲染后,用 .goods-list-normal .good-card-container .d-checkbox 定位第一个商品的勾选框失败:无搜索结果或结果列表/勾选框选择器与页面不符。

Source

Thrown at xiaohongshu/publish.go:1313

			break
		}
		time.Sleep(100 * time.Millisecond)
	}

	// 等待商品列表渲染完成(使用与工作代码相同的选择器)
	for time.Now().Before(deadline) {
		productList, err := modal.Element(".goods-list-normal .good-card-container")
		if err == nil && productList != nil {
			break
		}
		time.Sleep(100 * time.Millisecond)
	}
	time.Sleep(500 * time.Millisecond) // 额外等待确保渲染完成

	// 5. 点击第一个商品的 checkbox(使用与工作代码相同的选择器)
	checkbox, err := modal.Element(".goods-list-normal .good-card-container .d-checkbox")
	if err != nil {
		return errors.Wrap(err, "未找到商品选择框")
	}

	// 检查是否已经选中
	isChecked, err := checkbox.Eval(`(el) => {
		return el.querySelector('.d-checkbox-simulator.checked') !== null ||
			   el.querySelector('input[type="checkbox"]:checked') !== null;
	}`)
	if err == nil && isChecked.Value.Bool() {
		slog.Info("商品已选中,跳过", "keyword", keyword)
		return nil
	}

	if err := humanize.Click(checkbox); err != nil {
		return errors.Wrap(err, "点击商品选择框失败")
	}

	randomDelay := 800 + rand.Intn(700)
	time.Sleep(time.Duration(randomDelay) * time.Millisecond)

View on GitHub (pinned to 332d196854)

Solutions

  1. 先手动验证关键词在小红书选品弹窗里能搜到商品,换个确定有结果的关键词重试
  2. 增加列表渲染等待:用 rod 的 page.Timeout().Element() 或 WaitStable 轮询 `.goods-list-normal .good-card-container`,而不是固定 time.Sleep
  3. 打印 modal 的 HTML(modal.MustElement("*").Page() 或 Eval outerHTML)确认实际 DOM 结构,更新选择器
  4. 检查登录态和选品权限,重新登录后再跑

Example fix

// before
checkbox, err := modal.Element(".goods-list-normal .good-card-container .d-checkbox")
if err != nil {
    return errors.Wrap(err, "未找到商品选择框")
}
// after
var checkbox *rod.Element
err := rod.Try(func() {
    checkbox = modal.Timeout(5 * time.Second).Element(".goods-list-normal .good-card-container .d-checkbox")
})
if err != nil {
    html, _ := modal.Eval(`(el) => el.innerHTML`)
    slog.Warn("商品选择框未找到", "keyword", keyword, "modalHTML", html.Value.String())
    return errors.Wrap(err, "未找到商品选择框")
}
Defensive patterns

Strategy: retry

Validate before calling

// 调用前确认页面有选品弹窗且列表已渲染
var hasList bool
for i := 0; i < 50; i++ {
    el, err := page.Element(".goods-list-normal .good-card-container")
    if err == nil && el != nil {
        hasList = true
        break
    }
    time.Sleep(200 * time.Millisecond)
}
if !hasList {
    return errors.New("商品列表未渲染,可能无匹配商品")
}

Type guard

func hasCheckbox(modal *rod.Element) bool {
    el, err := modal.Element(".goods-list-normal .good-card-container .d-checkbox")
    return err == nil && el != nil
}

Try / catch

if err := searchAndSelectProduct(page, keyword); err != nil {
    var wrapped *errors.wrapError
    slog.Warn("选品失败,跳过该商品", "keyword", keyword, "err", err)
    _ = wrapped
    // 记录日志后跳过该商品,不中断整个发布流程
    return nil
}

Prevention

When it happens

Trigger: 调用 searchAndSelectProduct 时:关键词搜索无结果/零商品;页面改版导致 .d-checkbox 类名变化;搜索结果仍在 loading(.goods-list-loading 未消失)或列表容器 .goods-list-normal 尚未渲染;弹窗 modal 元素已失效(页面刷新或弹窗被关闭)。

Common situations: 选品库中没有匹配关键词的商品(拼写错误、类目下无该商品);小红书前端升级改了 DOM 结构;网络慢导致固定 sleep 后列表仍未加载完;账号无选品/带货权限导致弹窗内容为空。

Related errors


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