From db81fd8f80751ff3cd79bb9d8ffba58cb987f9ff Mon Sep 17 00:00:00 2001 From: tanjun Date: Wed, 4 Mar 2026 02:15:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=95=86=E5=93=81?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E5=90=8E=E5=8D=A1=E4=BD=8F=E5=9C=A8=E7=AD=89?= =?UTF-8?q?=E5=BE=85=E5=BC=B9=E7=AA=97=E5=85=B3=E9=97=AD=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 page.Has 替代 page.Element 检测弹窗关闭,避免阻塞等待 - 简化 clickModalSaveButton,找不到按钮时不返回错误,继续执行 - 删除未使用的 clickConfirmButton 函数 - 添加详细日志输出便于调试 - 商品绑定完成后增加 1 秒等待时间 Co-Authored-By: Claude Opus 4.6 --- xiaohongshu/publish.go | 76 ++++++++++++------------------------------ 1 file changed, 22 insertions(+), 54 deletions(-) diff --git a/xiaohongshu/publish.go b/xiaohongshu/publish.go index 3934615..84ca57e 100644 --- a/xiaohongshu/publish.go +++ b/xiaohongshu/publish.go @@ -842,31 +842,6 @@ func confirmOriginalDeclaration(page *rod.Page) error { return nil } -// clickConfirmButton 点击确定按钮 -func clickConfirmButton(page *rod.Page) error { - // 查找日期选择器弹窗中的确定按钮 - buttons, err := page.Elements("button.el-picker-panel__link-btn") - if err != nil { - return errors.Wrap(err, "查找确定按钮失败") - } - - for _, btn := range buttons { - text, err := btn.Text() - if err != nil { - continue - } - if strings.TrimSpace(text) == "确定" { - if err := btn.Click(proto.InputMouseButtonLeft, 1); err != nil { - return errors.Wrap(err, "点击确定按钮失败") - } - slog.Info("已点击确定按钮") - return nil - } - } - - return errors.New("未找到确定按钮") -} - // bindProducts 绑定商品到发布内容 func bindProducts(page *rod.Page, products []string) error { if len(products) == 0 { @@ -899,13 +874,17 @@ func bindProducts(page *rod.Page, products []string) error { } // 点击保存按钮 + slog.Info("准备点击保存按钮") if err := clickModalSaveButton(page, modal); err != nil { return errors.Wrap(err, "点击保存按钮失败") } + slog.Info("保存按钮点击完成,开始等待弹窗关闭") // 等待弹窗关闭 if err := waitForModalClose(page); err != nil { slog.Warn("等待弹窗关闭超时", "error", err) + } else { + slog.Info("弹窗已关闭") } if len(failedProducts) > 0 { @@ -913,6 +892,7 @@ func bindProducts(page *rod.Page, products []string) error { } slog.Info("商品绑定完成", "total", len(products)) + time.Sleep(1000 * time.Millisecond) return nil } @@ -1077,22 +1057,12 @@ func searchAndSelectProduct(page *rod.Page, modal *rod.Element, keyword string) // clickModalSaveButton 点击保存按钮 func clickModalSaveButton(page *rod.Page, modal *rod.Element) error { - // 查找保存按钮 - buttons, err := modal.Elements(".goods-selected-footer button") - if err != nil { - return errors.Wrap(err, "查找保存按钮失败") - } - - for _, btn := range buttons { - text, err := btn.Text() - if err != nil { - continue - } - // 保存按钮通常包含"保存"或"确定"文字 - if strings.Contains(text, "保存") || strings.Contains(text, "确定") { - if err := btn.Click(proto.InputMouseButtonLeft, 1); err != nil { - return errors.Wrap(err, "点击保存按钮失败") - } + // 查找保存按钮(参考工作代码:直接查找并点击,不强制要求找到) + btn, err := modal.Element(".goods-selected-footer button") + if err == nil && btn != nil { + if err := btn.Click(proto.InputMouseButtonLeft, 1); err != nil { + slog.Warn("点击保存按钮失败", "error", err) + } else { slog.Info("已点击保存按钮") return nil } @@ -1102,29 +1072,27 @@ func clickModalSaveButton(page *rod.Page, modal *rod.Element) error { primaryBtn, err := modal.Element(".goods-selected-footer .d-button--primary") if err == nil && primaryBtn != nil { if err := primaryBtn.Click(proto.InputMouseButtonLeft, 1); err != nil { - return errors.Wrap(err, "点击主按钮失败") + slog.Warn("点击主按钮失败", "error", err) + } else { + slog.Info("已点击主按钮") + return nil } - slog.Info("已点击主按钮") - return nil } - return errors.New("未找到保存按钮") + slog.Warn("未找到保存按钮,继续执行") + return nil } // waitForModalClose 等待弹窗关闭 func waitForModalClose(page *rod.Page) error { deadline := time.Now().Add(5 * time.Second) + slog.Info("开始等待弹窗关闭") for time.Now().Before(deadline) { - modal, err := page.Element(".multi-goods-selector-modal") - if err != nil { - return nil // 弹窗已关闭 - } - if modal == nil { - return nil - } - visible, _ := modal.Visible() - if !visible { + // 使用 Has 代替 Element,避免等待元素出现的阻塞 + has, _, err := page.Has(".multi-goods-selector-modal") + if err != nil || !has { + slog.Info("弹窗已关闭") return nil } time.Sleep(200 * time.Millisecond)