问题描述
推图(ClearMapTask)战斗结束后,结算界面加载转场期间(资源加载中、进度百分比、空帧),
skip_dialogs 的 else 分支(has_dialog=True)反复点右上角 (0.95, 0.04),
干扰了界面过渡。网络正常时转场快无影响,网络波动时持续误点 → 结算界面卡住 →
auto_battle 收尾 wait_ocr 超时 → 抛 WaitFailedException。
复现步骤
- 运行推图任务(ClearMapTask)
- 进入战斗并完成
- 模拟或等待网络波动,使结算界面加载时间延长(日志显示加载帧停留超过 3 秒即可触发)
- 观察到「继续前进」按钮无法正常出现,最终超时报错
日志证据(logs/ok-script.log)
正常网络下(~6s 结算,无问题):
09:44:22 战斗结束「任务完成」
09:44:25 left_click 任务完成 09:44:28 found result: [继续前进_1.00] ← 正常出现
09:44:28 left_click 继续前进 → 进入下一轮
慢网络下(加载帧反复误点右上角):
09:19:57 OCR: 资源加载中 87%
09:19:57 click 1824, 43 ← 误点右上角
09:19:59 OCR: 资源加载中 99%
09:19:59 click 1824, 43 ← 再次误点
09:20:02 OCR: 一物品详情 / 坍塌晶条 ↑ 多次误点后界面状态被破坏,物品详情弹窗出现
click 1824, 43(即 click_relative(0.95, 0.04))共出现 46 次,全部位于加载帧/空帧。
根因分析
BaseGfTask.py:100-103,skip_dialogs 的兜底逻辑是"每帧 OCR 无命中 → 点右上角":
python
else:
if has_dialog:
self.click_relative(0.95, 0.04) # ← 加载帧上也在点
self.sleep(2)
加载帧上的「资源加载中」「99%」「空帧」不属于关键词(跳过/pop_ups/end_match), 每次都走兜底。网络慢时加载帧持续多秒,右上角被反复点击,干扰结算界面过渡。
修复方案
改动1:兜底分支加加载帧判断(BaseGfTask.py:100-103)
# 改前
else:
if has_dialog:
self.click_relative(0.95, 0.04)
self.sleep(2)
# 改后
else:
if has_dialog and not self._is_loading_frame(boxes):
self.click_relative(0.95, 0.04)
self.sleep(2)
改动2:新增加载帧检测方法(紧跟 skip_dialogs)
def _is_loading_frame(self, boxes):
"""检测当前帧是否为网络加载/转场帧——此时不应点右上角,只应等待网络恢复。"""
if not boxes: # 空帧 = 转场过渡
return True
for box in boxes:
name = box.name
if not name:
continue
if '资源加载中' in name:
return True
if re.search(r'\d{1,3}%', name): # "99%", "87%"
return True
return False
影响范围
| 场景 |
改前 |
改后 |
| 加载帧「资源加载中 99%」 |
click 1824,43 + sleep 2 |
只 sleep 2,不点击 |
| 空帧(转场过渡) |
click 1824,43 + sleep 2 |
只 sleep 2,不点击 |
| 剧情「跳过」 |
正常点击 |
不变 |
| 结算「继续前进」 |
正常返回 |
不变 |
| 战斗中「回合/击杀」 |
click 1824,43 + sleep 2 |
不变(非加载帧) |
只影响 has_dialog=True 场景下的加载帧行为,消除无用点击。
验证方法
python -m py_compile src/tasks/BaseGfTask.py 确认无语法错误
python main_debug.py 跑推图,观察日志中加载帧不再出现 click 1824,43
- 回归跑 DailyTask 确认自动战斗/剧情跳过不受影响
环境
- 项目版本:dev
- Python:3.12
- 系统:Windows 10
问题描述
推图(ClearMapTask)战斗结束后,结算界面加载转场期间(资源加载中、进度百分比、空帧),
skip_dialogs 的 else 分支(has_dialog=True)反复点右上角 (0.95, 0.04),
干扰了界面过渡。网络正常时转场快无影响,网络波动时持续误点 → 结算界面卡住 →
auto_battle 收尾 wait_ocr 超时 → 抛 WaitFailedException。
复现步骤
日志证据(logs/ok-script.log)
正常网络下(~6s 结算,无问题):
慢网络下(加载帧反复误点右上角):
click 1824, 43(即 click_relative(0.95, 0.04))共出现 46 次,全部位于加载帧/空帧。
根因分析
BaseGfTask.py:100-103,skip_dialogs 的兜底逻辑是"每帧 OCR 无命中 → 点右上角":
加载帧上的「资源加载中」「99%」「空帧」不属于关键词(跳过/pop_ups/end_match), 每次都走兜底。网络慢时加载帧持续多秒,右上角被反复点击,干扰结算界面过渡。
修复方案
改动1:兜底分支加加载帧判断(BaseGfTask.py:100-103)
改动2:新增加载帧检测方法(紧跟 skip_dialogs)
影响范围
只影响 has_dialog=True 场景下的加载帧行为,消除无用点击。
验证方法
python -m py_compile src/tasks/BaseGfTask.py确认无语法错误python main_debug.py跑推图,观察日志中加载帧不再出现click 1824,43环境