59 lines
4.4 KiB
JavaScript
59 lines
4.4 KiB
JavaScript
// R70 验证:AI写脚本页「自定义选题创作」→「原创选题创作」+ 空态句末「→ 去账号列表」点击跳转 #/accounts
|
|
const CDP = 9223;
|
|
const list = await fetch(`http://localhost:${CDP}/json`).then((r) => r.json());
|
|
const page = list.find((t) => t.type === 'page' && (t.url || '').includes('8900')) || list.find((t) => t.type === 'page');
|
|
if (!page) { console.log('ERR: no page'); 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'); await send('Network.enable');
|
|
await send('Network.setCacheDisabled', { cacheDisabled: true });
|
|
const waitFor = async (expr, ms = 15000) => { const t0 = Date.now(); while (Date.now() - t0 < ms) { if (await ev(expr)) return true; await sleep(300); } return false; };
|
|
const fail = (m) => { console.log('FAIL@' + m); process.exit(1); };
|
|
|
|
await send('Page.navigate', { url: `http://127.0.0.1:8900/?t=${Date.now()}#/rewrites` });
|
|
if (!(await waitFor(`location.hash === '#/rewrites' && !!document.querySelector('#view .rw-tabs') && [...document.scripts].some((s) => (s.src || '').includes('data-pages.js?v=20260904u'))`, 15000))) fail('rewrites route+load');
|
|
await sleep(400);
|
|
|
|
// ① tab 显示名
|
|
const tabNames = await ev(`[...document.querySelectorAll('#view .rw-tabs [data-tab]')].map((b) => b.textContent.replace(/\\d+$/, '').trim())`);
|
|
console.log('[1] tabs:', JSON.stringify(tabNames));
|
|
if (!tabNames.some((t) => t === '原创选题创作')) { console.log('FAIL: tab 未改名'); process.exit(1); }
|
|
if (tabNames.some((t) => t.includes('自定义选题'))) { console.log('FAIL: 旧名残留'); process.exit(1); }
|
|
console.log('[1] tab 改名 原创选题创作: PASS');
|
|
|
|
// ② 切到 custom tab 看空态 + 箭头
|
|
await ev(`document.querySelector('#view .rw-tabs [data-tab="custom"]').click()`);
|
|
if (!(await waitFor(`document.querySelector('#view .rw-tabs [data-tab="custom"]').classList.contains('tab-active')`, 8000))) fail('custom tab active');
|
|
await sleep(600);
|
|
const emptyState = await ev(`(() => {
|
|
const td = document.querySelector('#view .rw-tabs [data-tab="custom"]').closest('.page').querySelector('.empty');
|
|
if (!td) return 'NO-EMPTY';
|
|
const a = td.querySelector('a.link[href="#/accounts"]');
|
|
return { txt: td.textContent.trim().slice(0, 120), hasArrow: !!a, href: a ? a.getAttribute('href') : '', linkText: a ? a.textContent.trim() : '' };
|
|
})()`);
|
|
console.log('[2] custom 空态:', JSON.stringify(emptyState));
|
|
if (!emptyState || emptyState === 'NO-EMPTY') {
|
|
// 有数据时不显示空态——查 note 文案确认命名 + 从 note 验证即可
|
|
const note = await ev(`document.querySelector('#view .rw-note').textContent`);
|
|
console.log('[2b] custom note:', note.slice(0, 100));
|
|
if (!note.includes('原创选题创作')) { console.log('FAIL: note 未改名'); process.exit(1); }
|
|
console.log('[2b] note 改名: PASS (custom 有数据,无空态,跳转逻辑待空态场景)');
|
|
} else {
|
|
if (!emptyState.txt.includes('原创选题脚本')) { console.log('FAIL: 空态文案未改', emptyState.txt); process.exit(1); }
|
|
if (!emptyState.hasArrow || emptyState.href !== '#/accounts' || !emptyState.linkText.includes('去账号列表')) { console.log('FAIL: 箭头跳转缺失'); process.exit(1); }
|
|
console.log('[2] 空态文案 + → 去账号列表链接: PASS');
|
|
// ③ 点击跳转
|
|
await ev(`document.querySelector('#view .empty a.link[href="#/accounts"]').click()`);
|
|
if (!(await waitFor(`location.hash === '#/accounts' && !!document.querySelector('#view #accUpdate')`, 10000))) fail('jump to accounts');
|
|
console.log('[3] 点击 → 跳转账号列表: PASS');
|
|
}
|
|
|
|
console.log('\n=== PASS ===');
|
|
ws.close();
|
|
process.exit(0);
|