feat: PLANNING体系首版(00路线图/02任务总表/03执行协议/I-03/I-04/registry42口径)+M1止血交付
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
from playwright.sync_api import sync_playwright
|
||||
|
||||
URLS = [
|
||||
("Home", "http://192.168.5.9:5173/"),
|
||||
("Utility", "http://192.168.5.9:5173/utility"),
|
||||
("Settings", "http://192.168.5.9:5173/settings"),
|
||||
("Register", "http://192.168.5.9:5173/register"),
|
||||
("Chat", "http://192.168.5.9:5173/chat"),
|
||||
("Articles", "http://192.168.5.9:5173/articles"),
|
||||
]
|
||||
|
||||
JS_OVERFLOW = """() => {
|
||||
return {
|
||||
vw: window.innerWidth,
|
||||
vh: window.innerHeight,
|
||||
bSW: document.body.scrollWidth,
|
||||
bCW: document.body.clientWidth,
|
||||
hSW: document.documentElement.scrollWidth,
|
||||
hCW: document.documentElement.clientWidth,
|
||||
hO: document.body.scrollWidth > document.body.clientWidth + 1
|
||||
};
|
||||
}"""
|
||||
|
||||
JS_WIDE = """() => {
|
||||
const vw = window.innerWidth;
|
||||
return Array.from(document.querySelectorAll('*'))
|
||||
.filter(el => {
|
||||
const r = el.getBoundingClientRect();
|
||||
return r.width > vw + 10 && el.tagName !== 'HTML' && el.tagName !== 'BODY';
|
||||
})
|
||||
.slice(0, 10)
|
||||
.map(el => ({
|
||||
tag: el.tagName,
|
||||
cls: (el.className || '').toString().substring(0, 60),
|
||||
w: Math.round(el.getBoundingClientRect().width),
|
||||
x: Math.round(el.getBoundingClientRect().x),
|
||||
}));
|
||||
}"""
|
||||
|
||||
def audit(page, name, url):
|
||||
page.goto(url, wait_until="networkidle", timeout=15000)
|
||||
page.wait_for_timeout(2000)
|
||||
safe = name.replace(" ", "_").lower()
|
||||
page.screenshot(path=f"C:/Users/12914/Desktop/vscode/mobile_audit_{safe}.png")
|
||||
data = page.evaluate(JS_OVERFLOW)
|
||||
large = page.evaluate(JS_WIDE)
|
||||
flag = "X" if data["hO"] else "OK"
|
||||
print(f"=== {name} [{flag}] === vw={data['vw']}x{data['vh']} body={data['bSW']}x{data['bCW']} html={data['hSW']}x{data['hCW']}")
|
||||
for l in large:
|
||||
print(f" WIDER: <{l['tag']}> .{l['cls'][:40]} w={l['w']} x={l['x']}")
|
||||
if not large:
|
||||
print(" No oversized elements")
|
||||
return data
|
||||
|
||||
with sync_playwright() as p:
|
||||
browser = p.chromium.launch()
|
||||
ctx = browser.new_context(
|
||||
viewport={"width": 390, "height": 844},
|
||||
device_scale_factor=3,
|
||||
user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)",
|
||||
)
|
||||
page = ctx.new_page()
|
||||
for name, url in URLS:
|
||||
try:
|
||||
audit(page, name, url)
|
||||
except Exception as e:
|
||||
print(f" ERROR: {e}")
|
||||
browser.close()
|
||||
Reference in New Issue
Block a user