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
- 先手动验证关键词在小红书选品弹窗里能搜到商品,换个确定有结果的关键词重试
- 增加列表渲染等待:用 rod 的 page.Timeout().Element() 或 WaitStable 轮询 `.goods-list-normal .good-card-container`,而不是固定 time.Sleep
- 打印 modal 的 HTML(modal.MustElement("*").Page() 或 Eval outerHTML)确认实际 DOM 结构,更新选择器
- 检查登录态和选品权限,重新登录后再跑
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
- 不要依赖固定 sleep,用轮询/WaitStable 等待列表渲染
- 关键词先在页面上人工验证有搜索结果
- 前端改版后用截图/HTML dump 及时更新选择器
- 对非核心步骤(选品)做降级:失败跳过而非中断发布
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.