fix: retry launch page.goto to absorb transient DNS/timeout

Third launch failure this session (after two 顺心 load-timeouts and a 中通 ERR_NAME_NOT_RESOLVED) — each a transient network blip that killed the whole worker because launch_and_prepare opened sites with no retry. Wrap each site open+goto in _open_page: up to 3 attempts (2s apart) on domcontentloaded, so transient DNS/timeout is absorbed; only persistent failure (all 3) aborts. All 5 sites + 安能 now launch clean.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-07-24 09:06:02 +08:00
parent 62c44b262a
commit 79c84a5a0c

View File

@@ -299,23 +299,39 @@ def launch_and_prepare(debug_mode=False, debug_target=""):
print("\n====================================================") print("\n====================================================")
print("【启动】正在打开各站点页面...") print("【启动】正在打开各站点页面...")
print("====================================================") print("====================================================")
def _open_page(label, attempts=3):
"""开一个页面并 goto(url, domcontentloaded);容忍瞬时 DNS/超时抖动重试,全失败才抛。
domcontentloadedDOM 就绪即返回,不等慢资源(广告/图片)的 load 事件,
避免某站 load 超 30s / 瞬时 DNS 失败导致整个 worker 启动失败。就绪轮询自会判登录态。"""
last = None
for i in range(1, attempts + 1):
pg = context.new_page()
try:
pg.goto(url, wait_until="domcontentloaded")
return pg
except Exception as e:
last = e
try:
pg.close()
except Exception:
pass
print(f"⚠️ 打开【{label}】第 {i}/{attempts} 次失败: {e}")
if i < attempts:
time.sleep(2)
raise RuntimeError(f"打开【{label}】连续 {attempts} 次失败: {last}")
for site_name, url in active_sites.items(): for site_name, url in active_sites.items():
if site_name == "顺心": if site_name == "顺心":
# 顺心:两个归属地账号在同一窗口各开一个标签页 # 顺心:两个归属地账号在同一窗口各开一个标签页
sx_pages = [] sx_pages = []
for acct in range(1, 3): for acct in range(1, 3):
print(f">> 正在启动【顺心】账号{acct}标签页: {url}") print(f">> 正在启动【顺心】账号{acct}标签页: {url}")
sx_page = context.new_page() sx_pages.append(_open_page(f"顺心账号{acct}"))
# domcontentloadedDOM 就绪即返回,不等慢资源(广告/图片)的 load 事件,
# 避免顺心等站点 load 超 30s 导致整个 worker 启动失败。就绪轮询自会判登录态。
sx_page.goto(url, wait_until="domcontentloaded")
sx_pages.append(sx_page)
pages_map["顺心"] = sx_pages pages_map["顺心"] = sx_pages
else: else:
print(f">> 正在启动【{site_name}】页面: {url}") print(f">> 正在启动【{site_name}】页面: {url}")
page = context.new_page() pages_map[site_name] = _open_page(site_name)
page.goto(url, wait_until="domcontentloaded")
pages_map[site_name] = page
# 4. 安能 Electron # 4. 安能 Electron
anneng_proc = None anneng_proc = None