test(frontend): BUG-001验收脚本 3页面x10连刷无卡加载中 (入库留存,2026-09-03)
This commit is contained in:
@@ -0,0 +1,88 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""BUG-001 验收:3页面×10次整页刷新,无卡"加载中"超10s(2026-09-03 修复后)
|
||||||
|
判据: location.href 整页刷新 → 轮询(0.5s)直到 body>100 且非壳页"加载中" → 耗时 <= 10s
|
||||||
|
"""
|
||||||
|
import sys, json, time
|
||||||
|
sys.path.insert(0, "/root/.hermes/profiles/wecom-yanxue/skills/operations/cdp-browser-automation/scripts")
|
||||||
|
from cdp_helpers import CDPBrowser
|
||||||
|
|
||||||
|
CDP = "http://127.0.0.1:9226"
|
||||||
|
BASE = "https://cma.sxbh.ltd"
|
||||||
|
|
||||||
|
def pick_tab(url_needle):
|
||||||
|
tabs = json.loads(__import__("urllib.request").request.urlopen(CDP + "/json", timeout=5).read())
|
||||||
|
for t in tabs:
|
||||||
|
if t.get("type") == "page" and url_needle in t.get("url", ""):
|
||||||
|
return t
|
||||||
|
raise LookupError("无匹配tab: " + url_needle)
|
||||||
|
|
||||||
|
def fresh_browser(url_needle):
|
||||||
|
"""复用已登录 tab(每轮重连,防导航断ws)"""
|
||||||
|
b = CDPBrowser(cdp=CDP, base_url=BASE)
|
||||||
|
b.use_existing_tab(url_needle)
|
||||||
|
return b
|
||||||
|
|
||||||
|
def reload_and_time(url, url_needle, max_wait=12):
|
||||||
|
"""整页刷新并计时到渲染完成。返回 (耗时秒, body_len, 超时?)"""
|
||||||
|
b = fresh_browser(url_needle)
|
||||||
|
t0 = time.time()
|
||||||
|
try:
|
||||||
|
b.js("location.href='" + url + "'")
|
||||||
|
except Exception:
|
||||||
|
pass # 导航即断ws属正常
|
||||||
|
body = ""
|
||||||
|
waited = 0
|
||||||
|
last_err = None
|
||||||
|
while waited < max_wait:
|
||||||
|
time.sleep(0.5)
|
||||||
|
waited += 0.5
|
||||||
|
try:
|
||||||
|
body = b.js("document.body ? document.body.innerText : ''") or ""
|
||||||
|
except Exception as e:
|
||||||
|
last_err = e
|
||||||
|
try:
|
||||||
|
b = fresh_browser(url_needle)
|
||||||
|
body = b.js("document.body ? document.body.innerText : ''") or ""
|
||||||
|
except Exception as e2:
|
||||||
|
last_err = e2
|
||||||
|
body = ""
|
||||||
|
if len(body) > 100 and "加载中" not in body[:60]:
|
||||||
|
return round(time.time() - t0, 2), len(body), False, ""
|
||||||
|
return round(time.time() - t0, 2), len(body), True, str(last_err or "")
|
||||||
|
|
||||||
|
targets = [
|
||||||
|
("/ai-suggestions", "ai-suggestions"),
|
||||||
|
("/alerts", "alerts"),
|
||||||
|
("/my-dashboard", "my-dashboard"),
|
||||||
|
]
|
||||||
|
N = 10
|
||||||
|
all_pass = True
|
||||||
|
for url, needle in targets:
|
||||||
|
print(f"\n===== {url} =====")
|
||||||
|
# 预热 1 次(下载新版hash资源入缓存)
|
||||||
|
try:
|
||||||
|
t, bl, to, err = reload_and_time(url, needle)
|
||||||
|
print(f"[预热] {t}s body={bl} timeout={to}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[预热失败] {e} —— 检查tab是否存在/登录态")
|
||||||
|
sys.exit(1)
|
||||||
|
times = []
|
||||||
|
for i in range(1, N + 1):
|
||||||
|
try:
|
||||||
|
t, bl, to, err = reload_and_time(url, needle)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[{i}] 异常: {e}")
|
||||||
|
all_pass = False
|
||||||
|
times.append(99.0)
|
||||||
|
continue
|
||||||
|
flag = "❌" if to else "✅"
|
||||||
|
if to:
|
||||||
|
all_pass = False
|
||||||
|
times.append(t)
|
||||||
|
print(f"[{i:02d}] {flag} {t}s body={bl}" + (f" err={err[:60]}" if err else ""))
|
||||||
|
over = [x for x in times if x > 10]
|
||||||
|
print(f" 最快{min(times)}s 最慢{max(times)}s 平均{sum(times)/len(times):.2f}s 超10s次数={len(over)}")
|
||||||
|
|
||||||
|
print("\n=== 验收结论 ===")
|
||||||
|
print("PASS: 10连刷无卡'加载中'超10s" if all_pass else "FAIL: 存在卡'加载中'超10s")
|
||||||
Reference in New Issue
Block a user