| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /* eslint-disable */
- // 自动截图脚本:登录后逐页访问、等待加载、截图保存到 prd/汇丰银行/screenshots/
- // 用法:node pc/scripts/capture-screenshots.js
- // 前置:pc/ 下 npm run serve 已在 http://localhost:8080 运行
- const { chromium } = require('playwright')
- const path = require('path')
- const fs = require('fs')
- const BASE = 'http://localhost:8080'
- const OUT_DIR = path.resolve(__dirname, '../../prd/汇丰银行/screenshots')
- // 页面清单:{ name: 输出文件名(不带扩展名), path: 路由, step?: 多步骤页的某一步, wait?: 额外等待 ms, action?: 截图前执行的函数 }
- const PAGES = [
- // §2 借记卡权益
- { name: '2-1-equity-products-list', path: '/customization/hsbc/equity-products' },
- { name: '2-2-equity-add-step1', path: '/customization/hsbc/equity-products/add' },
- { name: '2-2-equity-add-step2', path: '/customization/hsbc/equity-products/add', step: 2 },
- { name: '2-2-equity-add-step3', path: '/customization/hsbc/equity-products/add', step: 3 },
- { name: '2-3-equity-edit', path: '/customization/hsbc/equity-products/edit/Q100006' },
- { name: '2-4-equity-view', path: '/customization/hsbc/equity-products/view/Q100001' },
- // §3 信用卡权益
- { name: '3-credit-card-equity-list', path: '/customization/hsbc/credit-card-equity' },
- // §6 权益审核
- { name: '6-audit-list', path: '/customization/hsbc/audit' },
- { name: '6-audit-detail', path: '/customization/hsbc/audit/AR202605150001' },
- // §三 人群管理
- { name: 'crowd-task-list', path: '/customization/hsbc/crowd-tasks' },
- { name: 'crowd-task-add-step1', path: '/customization/hsbc/crowd-tasks/add' },
- { name: 'crowd-task-add-step2', path: '/customization/hsbc/crowd-tasks/add', step: 2 },
- { name: 'crowd-name-list-add-step1', path: '/customization/hsbc/crowd-name-lists/add' },
- { name: 'crowd-name-list-add-step2', path: '/customization/hsbc/crowd-name-lists/add', step: 2 },
- { name: 'rule-group-list', path: '/customization/hsbc/rule-groups' },
- { name: 'rule-group-add-step1', path: '/customization/hsbc/rule-groups/add' },
- { name: 'rule-group-add-step2', path: '/customization/hsbc/rule-groups/add', step: 2 },
- // §四 发放计划
- { name: '4-grant-campaign-list', path: '/customization/hsbc/equity-grant-campaign' },
- { name: '4-grant-campaign-add', path: '/customization/hsbc/equity-grant-campaign/add' },
- // §五 页面管理
- { name: '5-page-home', path: '/customization/hsbc/pages/home' },
- { name: '5-page-zone', path: '/customization/hsbc/pages/zone' },
- { name: '5-page-assembly', path: '/customization/hsbc/pages/assembly' },
- // Channel/Campaign
- { name: 'channel-management', path: '/customization/hsbc/channel' },
- { name: 'campaign-management', path: '/customization/hsbc/campaign' },
- // §六 短信管理
- { name: '6-sms-template-list', path: '/customization/hsbc/sms-templates' },
- { name: '6-sms-send-record', path: '/customization/hsbc/sms-send-records' },
- // §七 报表中心
- { name: '7-points-detail', path: '/customization/hsbc/points-detail' },
- { name: '7-customer-equity-grant', path: '/customization/hsbc/equity-grant' },
- { name: '7-cash-discount-grant', path: '/customization/hsbc/cash-discount-grant' }
- ]
- async function waitDevServer() {
- const fetchUrl = BASE + '/'
- for (let i = 0; i < 60; i++) {
- try {
- const res = await fetch(fetchUrl)
- if (res.ok || res.status === 200) return true
- } catch (_) { /* not ready */ }
- await new Promise(r => setTimeout(r, 1000))
- }
- throw new Error('dev server 未在 60s 内就绪,请确认 npm run serve 已启动')
- }
- async function gotoStep(page, stepIdx) {
- // 三步骤向导(添加/编辑/规则组/客群任务)通过点击「下一步」翻到目标 step
- // stepIdx 是 1-based 业务步骤;首屏已是 step 1,则点击 stepIdx-1 次「下一步」
- for (let i = 1; i < stepIdx; i++) {
- const nextBtn = page.locator('button:has-text("下一步")').first()
- if (await nextBtn.count() === 0) break
- await nextBtn.click().catch(() => {})
- await page.waitForTimeout(400)
- }
- }
- ;(async () => {
- console.log('[1/4] 等待 dev server 就绪...')
- await waitDevServer()
- console.log(' dev server OK')
- console.log('[2/4] 启动 chromium...')
- const browser = await chromium.launch({ headless: true })
- // 视口宽高按 1/0.8 放大,让一屏容纳更多内容(等价于"缩放 80%"的视觉效果)
- const context = await browser.newContext({ viewport: { width: 1800, height: 1125 }, deviceScaleFactor: 2 })
- const page = await context.newPage()
- console.log('[3/4] 注入 token 跳过登录...')
- await page.goto(BASE + '/#/login', { waitUntil: 'domcontentloaded' })
- await page.evaluate(() => {
- localStorage.setItem('token', 'mock-token-' + Date.now())
- localStorage.setItem('username', 'admin')
- })
- console.log(`[4/4] 开始截图(共 ${PAGES.length} 张)...`)
- const results = []
- for (const item of PAGES) {
- const url = BASE + '/#' + item.path
- try {
- await page.goto(url, { waitUntil: 'networkidle', timeout: 15000 })
- } catch (_) {
- // networkidle 在 dev server 热更新场景下可能 timeout,降级用 domcontentloaded
- await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 15000 })
- }
- await page.waitForTimeout(800)
- if (item.step && item.step > 1) {
- await gotoStep(page, item.step)
- await page.waitForTimeout(400)
- }
- const file = path.join(OUT_DIR, item.name + '.png')
- await page.screenshot({ path: file, fullPage: true })
- const size = (fs.statSync(file).size / 1024).toFixed(0)
- console.log(` ✓ ${item.name}.png (${size}KB)`)
- results.push({ name: item.name, file })
- }
- await browser.close()
- console.log(`\n完成。共 ${results.length} 张,输出目录:${OUT_DIR}`)
- })()
|