xpzouying/xiaohongshu-mcp · error

点击定时发布开关失败

Error message

点击定时发布开关失败

What it means

Thrown by clickScheduleSwitch when the toggle element was found but humanize.Click could not complete the click. The element existed but the simulated interaction failed — typically because it was not visible/interactable, was detached and re-rendered, or the click was intercepted.

Source

Thrown at xiaohongshu/publish.go:944

	// 2. 设置日期时间
	if err := setDateTime(ctx, page, t); err != nil {
		return err
	}
	time.Sleep(500 * time.Millisecond)

	return nil
}

// clickScheduleSwitch 点击定时发布开关
func clickScheduleSwitch(page *rod.Page) error {
	switchElem, err := page.Element(".post-time-wrapper .d-switch")
	if err != nil {
		return errors.Wrap(err, "查找定时发布开关失败")
	}

	if err := humanize.Click(switchElem); err != nil {
		return errors.Wrap(err, "点击定时发布开关失败")
	}
	slog.Info("已点击定时发布开关")
	return nil
}

// setDateTime 设置日期时间
func setDateTime(ctx context.Context, page *rod.Page, t time.Time) error {
	dateTimeStr := t.Format("2006-01-02 15:04")

	elem, err := page.Element(".date-picker-container input")
	if err != nil {
		return errors.Wrap(err, "查找日期时间输入框失败")
	}

	// SelectAllText 走 Eval(this.select()),只改选区、不额外派发事件,暂时保留。
	// 换成键盘全选要区分 Ctrl/Cmd,换成三击又可能触发日期控件的其他行为。
	if err := elem.SelectAllText(); err != nil {
		return errors.Wrap(err, "选择日期时间文本失败")

View on GitHub (pinned to 332d196854)

Solutions

  1. Scroll the element into view before clicking.
  2. Re-query the element immediately before clicking to avoid a stale node.
  3. Close any overlaying popups before this step.
  4. Retry the click once after a short wait; if it persists, inspect live DOM state at failure time.

Example fix

// before
if err := humanize.Click(switchElem); err != nil {
	return errors.Wrap(err, "点击定时发布开关失败")
}
// after
switchElem.MustScrollIntoView()
switchElem, err = page.Element(".post-time-wrapper .d-switch")
if err != nil {
	return errors.Wrap(err, "查找定时发布开关失败")
}
if err := humanize.Click(switchElem); err != nil {
	return errors.Wrap(err, "点击定时发布开关失败")
}
Defensive patterns

Strategy: retry

Validate before calling

ready, err := page.Eval(`() => { const el = document.querySelector('.post-time-wrapper .d-switch'); return !!el && el.offsetParent !== null; }`)
if !ready.Value.Bool() {
	return fmt.Errorf("定时发布开关不可点击")
}

Try / catch

for i := 0; i < 2; i++ {
	if err := clickScheduleSwitch(page); err == nil {
		break
	} else if i == 1 {
		return fmt.Errorf("点击定时发布开关失败: %w", err)
	}
	time.Sleep(1 * time.Second)
}

Prevention

When it happens

Trigger: The .d-switch is hidden until the schedule section is expanded, the element is re-rendered between lookup and click (stale node), an overlay intercepts the pointer, or the page/browser context closed mid-click.

Common situations: Switch offscreen in a small/headless viewport; anti-automation overlays; page navigation during automation; stale element handles from earlier re-renders.

Related errors


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