Files
blog/blog-admin/tools/check-list-height.mjs
T

67 lines
2.7 KiB
JavaScript
Raw Normal View History

// 诊断:错误态下评论容器们的实际高度来源
import { spawn } from 'node:child_process';
import { mkdtempSync, writeFileSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
const CHROME = 'C:/Users/QunLIn/.agent-browser/browsers/chrome-154.0.8037.92/chrome.exe';
const PORT = 9411;
const URL_ = process.argv[2] || 'http://127.0.0.1:1313/comment.html';
const OUT = process.argv[3] || 'C:/Users/QunLIn/WorkBuddy/2026-10-02-15-13-24/.workbuddy/listdiag.json';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const userDir = mkdtempSync(join(tmpdir(), 'cdp-lsd-'));
const chrome = spawn(CHROME, [
'--headless=new', `--remote-debugging-port=${PORT}`, `--user-data-dir=${userDir}`,
'--no-first-run', '--disable-gpu', '--window-size=1280,1400', 'about:blank',
], { stdio: 'ignore' });
try {
for (let i = 0; i < 40; i++) {
try { const r = await fetch(`http://127.0.0.1:${PORT}/json/version`); if (r.ok) break; } catch { /* */ }
await sleep(300);
}
const tab = await (await fetch(`http://127.0.0.1:${PORT}/json/new?${encodeURIComponent(URL_)}`, { method: 'PUT' })).json();
const ws = new WebSocket(tab.webSocketDebuggerUrl);
let id = 0; const pending = new Map();
ws.addEventListener('message', (ev) => { const m = JSON.parse(ev.data); if (m.id && pending.has(m.id)) { pending.get(m.id)(m); pending.delete(m.id); } });
await new Promise((res) => ws.addEventListener('open', res));
const send = (method, params = {}) => new Promise((res) => { const mid = ++id; pending.set(mid, res); ws.send(JSON.stringify({ id: mid, method, params })); });
const ev = async (expr) => {
const r = await send('Runtime.evaluate', { expression: expr, returnByValue: true, awaitPromise: true });
return r.result?.result?.value ?? r.result?.value ?? null;
};
await send('Runtime.enable');
await send('Page.enable');
await sleep(9000);
const out = await ev(`(() => {
const pick = (sel) => {
const el = document.querySelector(sel);
if (!el) return null;
const b = el.getBoundingClientRect();
const cs = getComputedStyle(el);
return {
h: Math.round(b.height),
minH: cs.minHeight,
inline: (el.getAttribute('style') || '').slice(0, 80),
children: el.children.length,
};
};
return JSON.stringify({
list: pick('.atk-list'),
listBody: pick('.atk-list-body'),
commentsWrap: pick('.atk-list-comments-wrap'),
errorLayer: pick('.atk-error-layer'),
errCard: pick('.atk-err-card'),
editor: pick('.atk-main-editor'),
}, null, 1);
})()`);
writeFileSync(OUT, String(out));
ws.close();
} catch (e) {
writeFileSync(OUT, 'ERR ' + e.message);
} finally {
chrome.kill();
}