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
- Scroll the element into view before clicking.
- Re-query the element immediately before clicking to avoid a stale node.
- Close any overlaying popups before this step.
- 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
- Scroll elements into view before clicking in headless/small viewports.
- Re-query elements right before interaction to avoid stale handles.
- Dismiss tooltip/popover overlays before clicking switches.
- Use humanize.Click consistently so click behavior stays uniform.
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.