Files
mcn-short-video/project/短视频脚本创作/V1.0/mcn-work-shop/cdp-verify-ranktabs.mjs
T
maogeigei 53621279a5 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
2026-08-31 15:27:54 +08:00

52 lines
3.3 KiB
JavaScript

// 验证:首页周榜 tab 切换(账号周榜/作品热榜/点赞日榜/涨粉日榜,后 3 个占位)
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, 200) }; return r.result.value; };
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
await send('Page.enable'); await send('Runtime.enable');
await send('Page.navigate', { url: 'http://localhost:8899/#/' }); await sleep(1500);
await send('Page.reload', { ignoreCache: true }); await sleep(3000);
// 初始状态 + 逐个点击 tab
const states = [];
const initial = await ev(`(() => ({
tabs: [...document.querySelectorAll('.rank-tab')].map((t) => ({ txt: t.textContent.trim(), active: t.classList.contains('active') })),
toolsHidden: document.getElementById('rankTools').hidden,
listHidden: document.getElementById('rankPreviewList').hidden,
phHidden: document.getElementById('rankPlaceholder').hidden,
}))()`);
states.push({ clicked: '(初始)', ...initial });
for (const name of ['作品热榜', '点赞日榜', '涨粉日榜', '账号周榜']) {
const s = await ev(`(() => {
const t = [...document.querySelectorAll('.rank-tab')].find((x) => x.textContent.trim() === ${JSON.stringify(name)});
t.click();
return {
active: [...document.querySelectorAll('.rank-tab')].find((x) => x.classList.contains('active')).textContent.trim(),
toolsHidden: document.getElementById('rankTools').hidden,
listHidden: document.getElementById('rankPreviewList').hidden,
phHidden: document.getElementById('rankPlaceholder').hidden,
phText: document.getElementById('rankPlaceholder').textContent.trim(),
};
})()`);
await sleep(150);
states.push({ clicked: name, ...s });
}
console.log(JSON.stringify(states, null, 1));
const ok = states[0].tabs.length === 4
&& states[0].tabs[0].active && !states[0].toolsHidden && !states[0].listHidden && states[0].phHidden
&& states[1].clicked === '作品热榜' && states[1].toolsHidden && states[1].listHidden && !states[1].phHidden && states[1].phText.includes('建设中')
&& states[2].clicked === '点赞日榜' && states[2].toolsHidden && states[2].phText.includes('建设中')
&& states[3].clicked === '涨粉日榜' && states[3].phText.includes('建设中')
&& states[4].clicked === '账号周榜' && !states[4].toolsHidden && !states[4].listHidden && states[4].phHidden;
console.log(ok ? 'PASS' : 'CHECK');
ws.close();