fix: handle Shopee update confirmation and upload edge cases
This commit is contained in:
+88
@@ -724,3 +724,91 @@
|
||||
- 代码:`app/ai.py` 为标题/封面生成增加 `on_step` 与 `on_event/on_error` 回调,覆盖模型加载、请求构建、请求发送、响应解析、图片保存、写库等步骤;失败错误进入任务 `last_error` 前先脱敏。
|
||||
- UI/日志:`GenerateWorker` 创建 `run_type=generate` 的 `run_logs/run_log_events`,② 页面新增「AI生成运行日志」;图片生成异常同时写本地 `logs/cmshopee.log` 脱敏 traceback。
|
||||
- 测试:新增覆盖 GenerateWorker 图片生成失败时 DB 运行日志、本地诊断日志和 token 脱敏,以及 ② 页面加载最近一次 generate 日志。
|
||||
## 【2026-06-29】T-404 冒烟发现 · Shopee 更新二次确认框
|
||||
|
||||
- 现象:用户用测试商品走完整流程,③ 更新shopee 已替换标题和封面,并自动点击页面主「更新」按钮;随后 Shopee 弹出站点侧确认框 `確定您要更新商品嗎?`,底部按钮为 `立即優化` 和主按钮 `更新`,当前代码没有点击最终确认,因此未真正提交。
|
||||
- 结论:T-404 不能标 DONE;`click_update()` 的提交成功定义需要扩展为“页面主更新按钮已点击,且 Shopee 站点侧确认框未出现或已点击确认框内主按钮「更新」”。
|
||||
- 方案:基于用户提供 HTML,检测可见 `.eds-modal__box`,标题匹配 `確定您要更新商品嗎?`/简繁变体;只在该 modal footer 内点击 `button.eds-button--primary` 且文案为 `更新` 的按钮;明确不点击 `立即優化`。弹窗出现但未确认成功时,该任务返回失败、保留现场、不得写 `committed=1`。
|
||||
- 文档:同步 `docs/04-architecture.md`、`docs/api.md`、`docs/routes.md`、`docs/06-tasks.md`、`docs/current-state.md`。本轮只更新文档,未改代码。
|
||||
## 【2026-06-29】T-404 补丁 · 点击 Shopee 更新确认框主按钮
|
||||
|
||||
- 代码:`app/editor.py` 新增 `JS_FIND_UPDATE_CONFIRM` / `JS_CLICK_UPDATE_CONFIRM`,`click_update(cdp, confirm_timeout=3)` 点击页面主「更新」后等待 Shopee 站点侧确认框;若可见 `.eds-modal__box` 标题匹配 `確定/确定 + 更新商品`,只点击同一 modal 内文案精确为 `更新` 的按钮,优先 `eds-button--primary`,不点击 `立即優化`。
|
||||
- 失败语义:确认框出现但未点到主按钮时返回 `clicked=False` 和 `NO_UPDATE_CONFIRM_BUTTON` / `UPDATE_CONFIRM_NOT_CLICKED`,`apply_task()` 不写 committed 成功,失败商品保留现场。
|
||||
- 测试:`tests/test_editor_login.py` 增加 Shopee 更新确认框成功点击、确认框未确认失败、无确认框保持原成功语义的 mock 覆盖。
|
||||
- 文档:同步 `docs/api.md`、`docs/06-tasks.md`、`docs/current-state.md`。T-404 仍为 TODO,下一步需要用户用测试商品复跑真实提交验收。
|
||||
## 【2026-06-29】设计登记 · ②/③ 选中记录重置
|
||||
|
||||
- 背景:用户真实联调时,② AI生成和③ 更新shopee列表没有重置选中记录功能;商品一旦生成/上传/提交成功,就不方便用同一商品重复测试图片上传和 Shopee 提交流程。
|
||||
- 决策:新增 T-404a「②/③ 选中记录重置(联调重试辅助)」,排在 T-404 真实单条冒烟前。先做单选记录,不做批量重置,避免误操作放大线上风险。
|
||||
- ② 方案:增加「重置生成结果」。确认后只改本地 DB,清空 `new_title/new_cover_path/last_error`,退回 `stage=collected/status=success`,默认不删除本地新封面文件;若记录已提交过线上,确认框必须提示本地重置不回滚 Shopee。
|
||||
- ③ 方案:增加「重置更新状态」。确认后保留 `new_title/new_cover_path`,本地退回 `stage=generated/status=pending`,用于重复测试上传/提交;若 `committed=1`,必须醒目提示线上已提交过、重复更新会再次提交,并保留 committed 历史事实/运行日志。
|
||||
- 日志与边界:两类重置都写 `run_type=reset` 运行日志;运行中禁用;不触碰 Shopee,不自动回写 Excel,后续由用户按需手动回写结果。
|
||||
- 文档:同步 `docs/06-tasks.md`、`docs/routes.md`、`docs/api.md`、`docs/04-architecture.md`、`docs/current-state.md`。本轮只更新文档,未改代码。
|
||||
|
||||
## 【2026-06-30】T-404a 完成 · ②/③ 选中记录重置
|
||||
|
||||
- 代码:`app/db.py` 新增 `get_task()`、`reset_generated()`、`reset_apply_status()`;`app/gui.py` 在② AI生成增加「重置生成结果」,在③ 更新shopee增加「重置更新状态」。两者仅作用当前选中单条,运行中禁用,确认后只改本地 SQLite,不触碰 Shopee,不自动回写 Excel。
|
||||
- 行为:② 清空 `new_title/new_cover_path/last_error` 并退回 `stage=collected/status=success`,默认不删除本地新封面文件;③ 保留 `new_title/new_cover_path`,退回 `stage=generated/status=pending`。已 `committed=1` 的记录会在确认框提示线上已提交过、本地重置不回滚 Shopee、重复更新会再次提交。
|
||||
- 日志:两类重置都创建 `run_type=reset` 的 `run_logs/run_log_events`,记录 action、task_id、alias、item_id。
|
||||
- 测试:新增 `tests/test_db.py` reset 生命周期覆盖;新增 `tests/test_gui.py` 覆盖②重置生成结果、③重置更新状态、确认框提示和 reset 运行日志。已运行 `python -m py_compile app/db.py app/gui.py tests/test_db.py tests/test_gui.py`、`python -m unittest discover -s tests -p "test_db.py"`、`python -m unittest discover -s tests -p "test_gui.py"`。
|
||||
- 文档:`docs/06-tasks.md` 将 T-404a 标为 DONE;同步 `docs/current-state.md`、`docs/api.md`、`docs/04-architecture.md`。下一个任务仍是 T-404 真实 Shopee 单条更新冒烟,必须用测试商品复跑站点侧确认框主按钮「更新」路径后才能标 DONE。
|
||||
|
||||
## 【2026-06-30】T-404 补丁 · 兼容 Shopee `.eds-modal__content` 更新确认框
|
||||
|
||||
- 现象:用户实跑最新代码后仍停在 Shopee 站点侧确认框,真实 DOM 根节点为 `.eds-modal__content`,标题 `確定您要更新商品嗎?`,footer 按钮为 `立即優化` 和主按钮 `更新`。
|
||||
- 原因:确认框检测候选 root 过宽,可能把 `.eds-modal__title` 等子节点当成最后一个候选,导致点击逻辑在没有 footer 按钮的 root 中查找「更新」失败。
|
||||
- 代码:`app/editor.py` 的 `JS_FIND_UPDATE_CONFIRM` / `JS_CLICK_UPDATE_CONFIRM` 改为优先查找 `.eds-modal__content,.eds-modal__box,[role=dialog]`,并要求候选 root 标题匹配更新确认框且包含可点击「更新」按钮;按钮查找优先限定在 `.eds-modal__footer` 内,仍只点击文案精确为「更新」的主按钮,不点击「立即優化」。
|
||||
- 测试:`tests/test_editor_login.py` 增加 `.eds-modal__content` 结构覆盖,防止回退到只支持 `.eds-modal__box`。T-404 仍需用户用测试商品复跑真实提交确认后才能标 DONE。
|
||||
|
||||
## 【2026-06-30】T-404 补丁 · 新封面上传状态诊断
|
||||
|
||||
- 现象:用户实跑最新代码时,新封面上传后页面一直转圈,程序等待一段时间后提示更新失败。
|
||||
- 现状确认:旧 `replace_cover()` 已有上传成功检测,但只判断“图片列表出现新 `susercontent` CDN 地址”;若页面一直 loading/blob 预览或 Shopee 返回页面错误,最终只给 `UPLOAD_TIMEOUT`,无法定位是仍在上传、格式/大小错误还是裁剪弹窗。
|
||||
- 代码:`app/editor.py` 新增 `JS_UPLOAD_STATE` / `_upload_state()`,上传等待期间采集图片管理器状态:当前 src、blob 数、CDN 数、loading/progress 数、错误文案、裁剪弹窗和 toast;默认上传等待从 90 秒调到 180 秒。
|
||||
- 失败语义:`replace_cover()` 现在区分 `UPLOAD_STILL_PROCESSING`(仍在转圈或 blob 预览)、`UPLOAD_PAGE_ERROR`(页面/Toast 出现失败错误)、`UPLOAD_CROP_REQUIRED`(出现裁剪弹窗)、`UPLOAD_TIMEOUT`(没有任何新图/CDN/忙碌状态);失败结果包含 `upload_state`、`count_after`、`blob_seen`、`file_size`。`apply_task()` 会把封面失败转换成更可读的中文错误。
|
||||
- 测试:`tests/test_editor_login.py` 新增上传仍在处理中、页面上传错误、apply_task 封面失败中文错误的覆盖。T-404 仍需用户用测试商品复跑真实上传和提交路径。
|
||||
|
||||
## 【2026-06-30】T-404 补丁 · 删除旧封面后等待图片管理器稳定
|
||||
|
||||
- 现象:用户实跑最新代码后,新封面上传后仍停在转圈并最终提示更新失败;怀疑满 9 张时删除旧图后立刻上传,Shopee 图片管理组件尚未完成重排。
|
||||
- 分析:判断方向成立。旧流程在 `_delete_first_cover()` 里只等待图片数量减少,随后立刻重新取上传 input 并 `DOM.setFileInputFiles`;但数量减少不等于 Vue 组件已重渲染完成、上传入口已恢复、loading/blob 已消失。
|
||||
- 代码:`JS_UPLOAD_STATE` 增加上传 input 存在/禁用状态;`replace_cover()` 上传前先等图片管理器稳定,初始图片稳定后再操作,满 9 张删除确认后等待删除后的数量、无 busy/blob、上传 input 恢复并短暂稳定,再重新获取 input 上传;触发文件选择后等待 2 秒再轮询新图 CDN。新增 `IMAGE_MANAGER_BUSY`、`IMAGE_COUNT_NOT_READY`、`UPLOAD_INPUT_NOT_READY` 等失败语义。
|
||||
- 测试:`tests/test_editor_login.py` 增加“删除后 busy 两轮,必须等稳定后才 setFileInputFiles”的覆盖;`python -m unittest discover -s tests -p "test_editor_login.py"` 通过(23 tests),`python -m compileall app main.py` 通过,`python -m unittest discover -s tests` 通过(130 tests),`git diff --check` 无空白错误(仅 LF/CRLF 提示)。
|
||||
- 边界:本轮仍未直接操作真实 Shopee 测试商品,T-404 仍为 TODO,需要用户复跑单条真实上传与提交路径后才能标 DONE。
|
||||
|
||||
## 【2026-06-30】T-404 补丁 · 记录更新成功后跳回商品列表页
|
||||
|
||||
- 现象:用户复跑最新代码后,Shopee 站点侧确认框里的主按钮「更新」已成功点击,提交成功后当前 tab 跳回 `https://seller.shopee.tw/portal/product/list/all?operationSortBy=modified_time`,但浏览器 tab 没有关闭。
|
||||
- 分析:代码已有可选关闭逻辑:只有 ⑤ 开启 `close_success_tab` 且商品页是 `open_product()` 本轮自动新建 tab,成功提交后才调用 `close_tab()`;默认不关闭,复用用户已有 tab 也不关闭。旧代码没有把“跳回商品列表页”作为提交后观测结果记录。
|
||||
- 代码:`click_update()` 新增提交后状态探测,点击确认框主按钮后等待并记录 `post_update.url`、`redirected_to_list`、toast 结果;若出现失败 toast,则本条视为未提交失败;如果没有可观测跳转/成功 toast,仍沿用点击确认成功的兼容语义。
|
||||
- 测试:`tests/test_editor_login.py` 增加确认后跳回商品列表页的 mock 覆盖;`python -m unittest discover -s tests -p "test_editor_login.py"` 通过(24 tests),`python -m compileall app main.py` 通过,`python -m unittest discover -s tests` 通过(131 tests),`git diff --check` 无空白错误(仅 LF/CRLF 提示)。
|
||||
- 边界:是否关闭 tab 仍由 ⑤“成功后关闭本次新开编辑页”和 `created_by_app` 决定;跳到商品列表页本身不会强制关闭用户原本打开的 tab。
|
||||
|
||||
## 【2026-06-30】T-404 回归分析 · 满 9 张删除前误等上传入口
|
||||
|
||||
- 现象:用户复跑最新代码后,商品详情页加载完成,但没有删除原商品图片第一张图,也没有后续上传和更新确认。
|
||||
- 原因:上次为解决“删除后立刻上传导致转圈”新增了 `_wait_image_manager_stable()`,但在 `replace_cover()` 开头、删除旧图之前就要求上传 input 存在且未禁用。满 9 张时 Shopee 可能因已满格隐藏或禁用上传入口,所以前置等待返回 `UPLOAD_INPUT_NOT_READY`,流程在删除前中断。
|
||||
- 正确顺序:满 9 张时,删除前只等待现有图片列表稳定(无 loading/blob、src 稳定),不检查上传 input;完成第一张删除并确认图片数量减少后,再等待上传 input 恢复可用并短暂稳定,然后上传新图。
|
||||
- 测试缺口:mock 中满 9 张场景默认 `upload_input_ready=True`,没有覆盖真实页面“满格时上传入口不可用”的状态,导致回归未被单测发现。
|
||||
- 修复:`_wait_image_manager_stable()` 增加 `require_upload_input` 参数;`replace_cover()` 初始稳定等待传 `False`,满 9 张先删除第一张;删除后和未满 9 张上传前再传 `True` 等上传入口恢复。
|
||||
- 测试:`tests/test_editor_login.py` 新增 `test_replace_cover_full_slots_deletes_before_upload_input_is_ready`,模拟满 9 张时上传入口初始不可用、删除后恢复;`python -m unittest discover -s tests -p "test_editor_login.py"` 通过(25 tests),`python -m compileall app main.py` 通过,`python -m unittest discover -s tests` 通过(132 tests),`git diff --check` 无空白错误(仅 LF/CRLF 提示)。
|
||||
- 下一步:用户用测试商品复跑真实 T-404 封面上传和更新确认链路。
|
||||
|
||||
## 【2026-06-30】T-404 回归分析 · 物流校验被误判为封面上传失败
|
||||
|
||||
- 现象:用户复跑最新代码后,程序能删除第一张图片,但一直没有上传新图片,最后报 `新封面上传失败:此物流選項不支援較長備貨商品`。
|
||||
- 原因:`JS_UPLOAD_STATE` 在封面上传阶段扫描了全局 toast/message/notice,并把包含 `不支援` 的文本都归入 `error_toasts`。`此物流選項不支援較長備貨商品` 是物流/备货页面级校验,不是图片上传错误;当前代码在删除后等待上传入口恢复时看到该全局错误,提前返回 `UPLOAD_PAGE_ERROR`,因此没有继续执行 `DOM.setFileInputFiles`。
|
||||
- 正确边界:封面上传阶段只应把图片管理器内错误,或图片/文件/上传相关的全局 toast,当作封面上传失败。物流、备货、价格、库存等页面级校验应保留给点击「更新」提交阶段处理,不能阻断上传新图。
|
||||
- 修复:`JS_UPLOAD_STATE` 新增图片/文件/上传相关 `uploadRe` 过滤;全局页面错误仍记录在 `page_error_toasts`,但只有匹配图片上传语义的 toast 才进入 `error_toasts` 并阻断封面上传。`JS_POST_UPDATE_STATE` 同步把 `不支援/不支持/無法/无法` 识别为提交阶段错误,避免真正点击「更新」后误判成功。
|
||||
- 测试:`tests/test_editor_login.py` 新增 `test_replace_cover_ignores_unrelated_logistics_page_error_toast` 和 `test_click_update_reports_logistics_validation_after_confirm`;`python -m unittest discover -s tests -p "test_editor_login.py"` 通过(27 tests),`python -m compileall app main.py` 通过,`python -m unittest discover -s tests` 通过(134 tests),`git diff --check` 无空白错误(仅 LF/CRLF 提示)。
|
||||
- 下一步:用户复跑真实 T-404 链路。
|
||||
|
||||
## 【2026-06-30】T-404 回归分析 · 成功跳转列表页后 GUI 误报 POST_UPDATE_ERROR
|
||||
|
||||
- 现象:用户复跑最新代码后,浏览器上标题和封面都已成功更新,点击 Shopee 确认框主按钮「更新」后跳转到 `https://seller.shopee.tw/portal/product/list/all?operationSortBy=modified_time`,但 GUI 仍提示 `任务 1 商品 28431952912 更新失败:POST_UPDATE_ERROR`。
|
||||
- 原因:`click_update()` 的提交后观测 `_wait_post_update()` 当前先检查 `error_toasts`,再检查 `redirected_to_list`。若页面上存在残留或短暂的物流/备货 error toast,即使 Shopee 已接受提交并跳转到商品列表页,也会先返回 `POST_UPDATE_ERROR`,导致 GUI 把真实成功误判为失败。
|
||||
- 正确判断优先级:跳转到 `/portal/product/list/` 是提交成功的强信号,必须优先于残留/短暂 error toast;只有在未跳转商品列表、无成功 toast,且错误 toast 持续存在到观测窗口结束时,才应判 `POST_UPDATE_ERROR`。
|
||||
- 解决方案:调整 `_wait_post_update()` 顺序与策略:每轮先判断 `redirected_to_list` 或成功 toast;错误 toast 只记录为诊断,延迟到未见成功信号且持续存在时再判失败。GUI 错误显示应尽量带出 `post_update.error_toasts` 的具体文案,避免只显示 `POST_UPDATE_ERROR`。
|
||||
- 修复:`_wait_post_update()` 改为先判断 `redirected_to_list` 或成功 toast;错误 toast 只记录为 `last_error_state`,观测窗口结束仍没有成功信号时才返回 `POST_UPDATE_ERROR`。
|
||||
- 测试:`tests/test_editor_login.py` 新增 `test_click_update_treats_list_redirect_as_success_even_with_stale_error_toast`,保留 `test_click_update_reports_logistics_validation_after_confirm` 覆盖未跳转时错误仍失败;`python -m unittest discover -s tests -p "test_editor_login.py"` 通过(28 tests),`python -m compileall app main.py` 通过,`python -m unittest discover -s tests` 通过(135 tests),`git diff --check` 无空白错误(仅 LF/CRLF 提示)。
|
||||
- 下一步:用户复跑真实 T-404 链路,确认 GUI 与浏览器成功状态一致。
|
||||
|
||||
Reference in New Issue
Block a user