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

  1. 展开 wrapped error 查看根因:ctx 超时则放宽上游 deadline;detached 则重新查找输入框后重试
  2. 输入前确认 searchInput 可交互(Visible + 非只读),必要时先点击聚焦
  3. 失败后重试:重取 input 句柄再执行 humanize.Type,而不是复用旧句柄
  4. 确认 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

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.