xpzouying/xiaohongshu-mcp · error

等待弹窗关闭超时

Error message

等待弹窗关闭超时

What it means

waitForModalClose 轮询 5 秒后 .multi-goods-selector-modal 仍存在于 DOM:确认按钮点击后弹窗未真正关闭,可能是选择未生效或页面渲染卡住。

Source

Thrown at xiaohongshu/publish.go:1380

	return nil
}

// waitForModalClose 等待弹窗关闭
func waitForModalClose(page *rod.Page) error {
	deadline := time.Now().Add(5 * time.Second)
	slog.Info("开始等待弹窗关闭")

	for time.Now().Before(deadline) {
		// 使用 Has 代替 Element,避免等待元素出现的阻塞
		has, _, err := page.Has(".multi-goods-selector-modal")
		if err != nil || !has {
			slog.Info("弹窗已关闭")
			return nil
		}
		time.Sleep(200 * time.Millisecond)
	}

	return errors.New("等待弹窗关闭超时")
}

View on GitHub (pinned to 332d196854)

Solutions

  1. 手动复现绑定流程,观察选择商品后弹窗是否正常关闭
  2. 检查 searchAndSelectProduct 中确认按钮的点击是否成功,必要时校验点击后的 DOM 状态
  3. 更新弹窗关闭检测所用选择器
  4. 延长超时窗口,并在超时错误中附带当前页面截图/HTML 便于排查

Example fix

// before
return errors.New("等待弹窗关闭超时")
// after
html, _ := page.HTML()
return fmt.Errorf("等待弹窗关闭超时, page snapshot: %.500s", html)
Defensive patterns

Strategy: try-catch

Validate before calling

// 选择商品前确认搜索结果非空,否则弹窗不会关闭
if !modalContainsResults(modal) { return errors.New("商品搜索无结果") }

Try / catch

if err := bindProducts(page, products); err != nil {
	if strings.Contains(err.Error(), "等待弹窗关闭超时") {
		page.MustScreenshot("modal-close-timeout.png")
		_ = tryCloseModal(page) // 兜底:ESC/关闭按钮
	}
	return err
}

Prevention

When it happens

Trigger: bindProducts → searchAndSelectProduct 完成选择后,弹窗关闭动作(确认按钮点击/自动关闭)在等待窗口内未发生:确认按钮选择器失效、商品搜索无结果导致弹窗停在报错态、点击事件未生效。

Common situations: 小红书弹窗 DOM 改版导致确认按钮定位失败;搜索关键词匹配不到商品,弹窗停留在空结果页;页面卡顿/JS 报错阻断关闭逻辑。

Related errors


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