chore(core/qa): function-audit toolchain + parity/audit reports + pixel-perfect skill
- qa/function-audit: playwright 行为审计工具(audit.mjs/verify-modals.mjs/pages.json) + 18 页审计产出(*.audit.md/json、summary、运行日志) - qa/visual-parity: 调试/测量辅助脚本(_dbg*.mjs/_measure.mjs/_off.mjs) - core/还原度核对报告.md: 18 页 pixelmatch 核对结果(含 vite 代理陈旧坑记录) - core/还原与接口待办.md: 逐页还原度/真实数据/交互接入待办总表 - .claude/skills/pixel-perfect-react: 像素级还原 React 的 SKILL 文档 - frontend/public/_devlogin.html: 临时本地登录辅助页(可删) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
import { chromium } from "playwright";
|
||||
const TOK = process.argv[2];
|
||||
const b = await chromium.launch();
|
||||
const ctx = await b.newContext({ viewport:{width:1440,height:900}, deviceScaleFactor:1 });
|
||||
async function ys(url){
|
||||
const p = await ctx.newPage();
|
||||
await p.goto("http://127.0.0.1:5173/",{waitUntil:"domcontentloaded"});
|
||||
await p.evaluate((t)=>localStorage.setItem("airshelf_token",t),TOK);
|
||||
await p.goto(url,{waitUntil:"networkidle"}); await p.waitForTimeout(1000);
|
||||
return await p.evaluate(()=>{
|
||||
const g=(sel)=>{const e=document.querySelector(sel);return e?Math.round(e.getBoundingClientRect().top):null;};
|
||||
return { h1:g("h1"), heroTop:g(".factory-hero,.fx-hero,[class*='hero']"), card:g(".factory-card,[class*='factory-card']"), cta:g(".factory-cta .btn,[class*='factory'] .btn-primary"), section:g(".section-h"), tabs:g(".tabs"), toolbar:g(".toolbar") };
|
||||
});
|
||||
}
|
||||
console.log("MIRROR:", JSON.stringify(await ys("http://127.0.0.1:5173/exact/asset-factory.html")));
|
||||
console.log("IMPL :", JSON.stringify(await ys("http://127.0.0.1:5173/asset-factory")));
|
||||
await b.close();
|
||||
Reference in New Issue
Block a user