feat(账号分析+工作台): 功能三自动联动生成设定卡+双向联动维护+玫瑰金配色定稿+首页数据预览/周榜优化+CDP验证脚本
- mcn-dou-analysis: 功能三产出设定后自动生成设定卡(Step7); 设定md与卡片SVG双向联动维护规则固化(06文档+03文档+SKILL.md); 浅色系配色定稿玫瑰金(#D6A3A9→#9A5563)+背景文字提亮规则; 新增06生成账号设定卡片文档+模板样例 - mcn-work-shop: 首页数据预览条/周榜预览表加宽/改名AI脚本诊断/tab切换/添加账号弹窗等优化 - 新增 cdp-*.mjs 验证脚本14个(可复用); .gitignore 忽略运行日志/截图/tmp
This commit is contained in:
1 parent
ab97842030
commit
268ce29aae
35 files changed
+2567
-117
No files matched your search
@@ -0,0 +1,49 @@
|
||||
// 验证「首页账号周榜预览」5 数值列加宽 + 功能列按钮「分析」→「关注」:只读测量
|
||||
const list = await fetch('http://localhost:9223/json').then((r) => r.json());
|
||||
let page = list.find((t) => t.type === 'page' && t.url.includes('localhost:8899'));
|
||||
if (!page) { console.log('ERR: no workbuddy page open'); process.exit(1); }
|
||||
const ws = new WebSocket(page.webSocketDebuggerUrl);
|
||||
let id = 0; const pending = new Map();
|
||||
const send = (method, params = {}) => new Promise((res, rej) => { const i = ++id; pending.set(i, { res, rej }); ws.send(JSON.stringify({ id: i, method, params })); });
|
||||
ws.onmessage = (e) => { const m = JSON.parse(e.data); if (m.id && pending.has(m.id)) { const p = pending.get(m.id); pending.delete(m.id); m.error ? p.rej(new Error(m.error.message)) : p.res(m.result); } };
|
||||
await new Promise((r) => (ws.onopen = r));
|
||||
const ev = async (expr) => { const r = await send('Runtime.evaluate', { expression: expr, returnByValue: true, awaitPromise: true }); if (r.exceptionDetails) return { __err: (r.exceptionDetails.exception?.description || r.exceptionDetails.text).slice(0, 300) }; return r.result.value; };
|
||||
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
||||
await send('Page.enable'); await send('Runtime.enable');
|
||||
|
||||
// 1) 导航首页 + 强制刷新(hash 变化不重载文档)
|
||||
await send('Page.navigate', { url: 'http://localhost:8899/#/' });
|
||||
await sleep(1500);
|
||||
await send('Page.reload', { ignoreCache: true });
|
||||
await sleep(3500);
|
||||
|
||||
// 2) 测量首页预览表各列宽 + 功能列按钮
|
||||
const check = await ev(`(() => {
|
||||
const head = document.querySelector('#rankPreviewList .rank-head');
|
||||
if (!head) return { err: 'no rank preview', html: (document.getElementById('rankPreviewList') || {}).innerHTML ? 'has content' : 'empty' };
|
||||
const row = document.querySelector('#rankPreviewList .rank-row:not(.rank-head)');
|
||||
const W = (sel) => { const el = row && row.querySelector(sel); return el ? Math.round(el.getBoundingClientRect().width) : null; };
|
||||
const cols = [...head.children];
|
||||
const actBtn = row ? row.querySelector('.rk-act .btn') : null;
|
||||
const headTxt = [...head.children].map((c) => c.textContent.trim());
|
||||
return {
|
||||
headCols: headTxt,
|
||||
widths: { score: W('.rk-score'), fans: W('.rk-num:nth-child(5)'), likes: W('.rk-num:nth-child(6)'), comments: W('.rk-num:nth-child(7)'), shares: W('.rk-num:nth-child(8)') },
|
||||
actBtnText: actBtn ? actBtn.textContent.trim() : null,
|
||||
actBtnTitle: actBtn ? actBtn.title : null,
|
||||
actBtnHref: actBtn ? (actBtn.getAttribute('href') || null) : null,
|
||||
rowCount: document.querySelectorAll('#rankPreviewList .rank-row').length - 1,
|
||||
dataCardsStill: !!document.querySelector('.data-cards'),
|
||||
statsStill: !!document.getElementById('homeStats'),
|
||||
};
|
||||
})()`);
|
||||
console.log(JSON.stringify(check, null, 1));
|
||||
|
||||
// 3) 校验:5 列 >= 80px 且按钮为「关注」
|
||||
const widths = check.widths || {};
|
||||
const colsOk = ['score', 'fans', 'likes', 'comments', 'shares'].every((k) => widths[k] >= 80);
|
||||
const btnOk = check.actBtnText === '关注' && (check.actBtnTitle || '').includes('关注');
|
||||
console.log('列宽达标(>=80):', colsOk, '| 按钮为关注:', btnOk);
|
||||
console.log(colsOk && btnOk ? 'PASS' : 'CHECK');
|
||||
|
||||
ws.close();
|
||||
Reference in new issue
Block a user