xpzouying/xiaohongshu-mcp · error
输入搜索关键词失败
Error message
输入搜索关键词失败
What it means
searchAndSelectProduct 定位到搜索框后(先尝试全选清空,失败仅告警),humanize.Type 输入商品关键词失败:输入框失焦或输入事件被拦截。
Source
Thrown at xiaohongshu/publish.go:1274
// 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)
if err := humanize.Type(ctx, searchInput, keyword); err != nil {
return errors.Wrap(err, "输入搜索关键词失败")
}
time.Sleep(300 * time.Millisecond)
// 3. 触发搜索(模拟键盘 Enter)
if err := page.Keyboard.Press(input.Enter); err != nil {
return errors.Wrap(err, "触发搜索失败")
}
// 4. 等待搜索结果加载
time.Sleep(1 * time.Second)
// 等待 loading 消失(使用与工作代码相同的选择器)
deadline := time.Now().Add(10 * time.Second)
for time.Now().Before(deadline) {
loading, err := modal.Element(".goods-list-loading")
if err != nil || loading == nil {
break
}View on GitHub (pinned to 332d196854)
Solutions
- 展开 wrapped error 查看根因:ctx 超时则放宽上游 deadline;detached 则重新查找输入框后重试
- 输入前确认 searchInput 可交互(Visible + 非只读),必要时先点击聚焦
- 失败后重试:重取 input 句柄再执行 humanize.Type,而不是复用旧句柄
- 确认 keyword 非空且不含导致特殊处理的字符;必要时改用 searchInput.Input(keyword) 简化路径
Example fix
// before
if err := humanize.Type(ctx, searchInput, keyword); err != nil {
return errors.Wrap(err, "输入搜索关键词失败")
}
// after
if err := humanize.Type(ctx, searchInput, keyword); err != nil {
var retryErr error
searchInput, retryErr = modal.Element(`input[placeholder*="搜索商品"]`)
if retryErr != nil {
return errors.Wrap(err, "输入搜索关键词失败")
}
if err := humanize.Type(ctx, searchInput, keyword); err != nil {
return errors.Wrap(err, "输入搜索关键词失败")
}
} Defensive patterns
Strategy: retry
Validate before calling
ro, _ := searchInput.Attribute("readonly")
vis, _ := searchInput.Visible()
if !vis || ro != nil {
return errors.New("搜索框不可输入")
}
if err := ctx.Err(); err != nil {
return err // ctx 已取消,不必尝试输入
} Try / catch
if err := humanize.Type(ctx, searchInput, keyword); err != nil {
if ctx.Err() != nil {
return fmt.Errorf("输入搜索关键词失败(上下文取消): %w", err)
}
// 重新定位输入框重试一次
} Prevention
- 输入前检查 ctx 未取消并保留足够 deadline
- 输入后校验输入框 value 是否为 keyword
- 失败时重取元素句柄再重试
- 保持页面稳定后再输入,避免输入中途重渲染
- keyword 先做 trim/合法性校验
When it happens
Trigger: 输入过程中搜索框被重新渲染导致 detached;元素无法 focus(被禁用/遮挡);ctx 已取消或超时;CDP keyboard 事件注入失败;搜索框被前端重置。
Common situations: 搜索框在聚焦后触发重渲染(React 受控组件重建);ctx 上游 deadline 已到;页面因登录态失效发生跳转;前端改版后 input 为只读或被自定义组件接管。
Related errors
AI-assisted analysis of xpzouying/xiaohongshu-mcp@332d196854 (2026-09-05).
Data as JSON: /api/errors/1c95796c002402fd.
Report an issue: GitHub.