// 整页截图:遍历页面清单,截取完整页面并写入 public/screenshots/。 import { resolve } from 'node:path' import { pathToFileURL } from 'node:url' import type { Page } from 'playwright-core' import { injectSession, launchBrowser, login, newContext, waitPage } from './browser.js' import { BASE_URL, OUT_DIR } from './config.js' /** 整页截图清单:文件名、路由、视口宽度、视口高度、关键元素选择器 */ const PAGES: Array<[string, string, number, number, string]> = [ ['login', '/login', 1440, 900, '.n-card'], ['register', '/register', 1440, 900, '.n-card'], ['dashboard', '/dashboard', 1440, 1280, 'canvas'], ['sql-query', '/smart-query', 1440, 1180, '.n-card'], ['transactions', '/transactions', 1720, 1200, '.n-data-table-tbody tr'], ['categories', '/categories', 1440, 1100, '.n-data-table-tbody tr'], ['tags', '/tags', 1440, 1100, '.n-data-table-tbody tr'], ['rules', '/rules', 1440, 1100, '.n-data-table-tbody tr'], ['channels', '/channels', 1440, 1000, '.n-data-table-tbody tr'], ['email-bills-configs', '/email-bills/configs', 1440, 1000, '.n-data-table-tbody tr'], ['email-bills-sender-rules', '/email-bills/senderRules', 1440, 1000, '.n-data-table-tbody tr'], ['email-bills-messages', '/email-bills/messages', 1440, 1000, '.n-data-table-tbody tr'], ['bill-import', '/bill-import', 1440, 1000, '.n-card'], ['settings', '/settings', 1440, 1900, '.config-card'], ['ai-usage', '/ai-usage', 1440, 1000, '.n-card'], ['logs-http', '/logs/http', 1440, 1000, '.n-data-table-tbody tr'], ['logs-login', '/logs/login', 1440, 1000, '.n-data-table-tbody tr'], ['logs-app', '/logs/app', 1440, 1000, '.n-log'], ] /** * 截取全部整页。 * * @param page Page 实例 */ export async function capturePages(page: Page): Promise { for (const [name, path, width, height, selector] of PAGES) { try { await page.setViewportSize({ width, height }) await page.goto(BASE_URL + path) await waitPage(page, { selector }) await page.screenshot({ path: resolve(OUT_DIR, `${name}.png`) }) console.log(`[OK] page/${name}`) } catch (err) { console.log(`[FAIL] page/${name}: ${err}`) } } } async function main(): Promise { const browser = await launchBrowser() try { const token = await login() const context = await newContext(browser) await injectSession(context, token) const page = await context.newPage() await capturePages(page) await context.close() } finally { await browser.close() } } if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { main().catch((err) => { console.error('FAIL', err) process.exit(1) }) }