Add per-site exception fallback (reset + retry), router stays pure dispatch
每个站点模块自带"失败→重置回初始态→重试"兜底(最多 3 次,含首次;每次 失败都重置,含最终放弃那次清场),对外只暴露 xxx_download 公开入口,路由 层无感、只负责调度。 - 各站点模块新增:HOME_URL、xxx_reset、内联 with_retry;原流程拆为 xxx_download(带重试) + xxx_download_impl(单次,供自动化测试探测原始失败)。 - 网页站重置=goto 首页 URL;安能(Electron)重置=关业务 tab+收菜单(实测 reload 会留下杀不掉的僵尸 webContents,故不用 reload)。 - main_router:SITES_CONFIG 改引用各模块 HOME_URL(单一来源);菜单分派回归 朴素调用;run_automation_test 改走 _impl 以保留"暴露问题"的测试本意。 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,44 @@ from playwright.sync_api import sync_playwright
|
||||
from paths import DOWNLOAD_DIR, CONFIG_PATH
|
||||
|
||||
|
||||
def with_retry(site_name, label, flow, reset, max_attempts=3):
|
||||
"""异常兜底:flow 失败 → 重置回初始态 → 重试,最多 max_attempts 次(含首次)。
|
||||
|
||||
每次失败都重置(含最终放弃那一次):既是重试前的清场,也保证最终放弃时环境干净。
|
||||
flow 为零参可调用;返回 False 视为失败,其余视为成功。
|
||||
"""
|
||||
for attempt in range(1, max_attempts + 1):
|
||||
try:
|
||||
ret = flow()
|
||||
if ret is False:
|
||||
raise RuntimeError("流程返回失败状态")
|
||||
if attempt > 1:
|
||||
print(f">> 【{site_name}-{label}】第 {attempt} 次尝试成功 ✅")
|
||||
return
|
||||
except Exception as e:
|
||||
print(f"⚠️ 【{site_name}-{label}】第 {attempt}/{max_attempts} 次失败: {e}")
|
||||
print(f" → 重置【{site_name}】到初始态,清理环境 ...")
|
||||
try:
|
||||
reset()
|
||||
except Exception as re:
|
||||
print(f" ⚠️ 重置异常: {re}")
|
||||
if attempt < max_attempts:
|
||||
continue
|
||||
print(
|
||||
f"❌ 【{site_name}-{label}】已达最大尝试次数 {max_attempts},放弃(环境已清理)。"
|
||||
)
|
||||
|
||||
|
||||
# 站点首页 URL:异常兜底重置用,也供 main_router 的 SITES_CONFIG 引用(单一来源)
|
||||
HOME_URL = "https://v5.800best.com"
|
||||
|
||||
|
||||
def baishi_reset(page):
|
||||
"""异常兜底:重置百世到初始态(跳首页 URL,丢弃当前页面状态,登录态保留)。"""
|
||||
page.goto(HOME_URL)
|
||||
page.wait_for_timeout(1500)
|
||||
|
||||
|
||||
def _close_tab(page, tab_name):
|
||||
"""关闭指定名称的百世标签页。
|
||||
|
||||
@@ -27,7 +65,18 @@ def _close_tab(page, tab_name):
|
||||
|
||||
|
||||
def baishi_download_undelivered_data(page):
|
||||
"""百世:一键提取应到未到(当日未扫)数据"""
|
||||
"""百世:一键提取应到未到(当日未扫)数据(内部含异常兜底重试,路由层无感)。"""
|
||||
|
||||
return with_retry(
|
||||
"百世",
|
||||
"应到未到",
|
||||
lambda: baishi_download_undelivered_data_impl(page),
|
||||
lambda: baishi_reset(page),
|
||||
)
|
||||
|
||||
|
||||
def baishi_download_undelivered_data_impl(page):
|
||||
"""百世:一键提取应到未到(当日未扫)数据(单次执行,无重试;供自动化测试用)。"""
|
||||
print("\n▶ 开始执行【百世 - 一键提取应到未到数据】任务...")
|
||||
|
||||
download_dir = DOWNLOAD_DIR
|
||||
|
||||
Reference in New Issue
Block a user