Files
hms/apps/miniprogram/verify-v3.mjs
iven 50eae8b809 feat(miniprogram): 温润东方风全面 UI 重设计
73 文件变更,覆盖全部 40 个页面 SCSS + TabBar 图标 + 组件样式。
统一赤陶主色 #C4623A + 暖米背景 + 衬线标题字体 + 12px 圆角体系。
2026-04-28 00:19:52 +08:00

122 lines
4.7 KiB
JavaScript

import automator from 'miniprogram-automator';
import fs from 'fs';
const WS = 'ws://127.0.0.1:9420';
const TIMEOUT = 15000;
const SS_DIR = 'g:/hms/apps/miniprogram/screenshots';
const TABBAR_PAGES = ['pages/index/index', 'pages/health/index', 'pages/appointment/index', 'pages/article/index', 'pages/profile/index'];
function withTimeout(promise, ms, label) {
return Promise.race([promise, new Promise((_, r) => setTimeout(() => r(new Error(`${label} timeout`)), ms))]);
}
function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }
async function saveScreenshot(mp, name) {
try {
const ss = await withTimeout(mp.screenshot(), 20000, 'screenshot');
const ssPath = `${SS_DIR}/${name}.png`;
if (Buffer.isBuffer(ss)) {
fs.writeFileSync(ssPath, ss);
} else {
fs.writeFileSync(ssPath, Buffer.from(ss, 'base64'));
}
return true;
} catch (e) {
return false;
}
}
async function main() {
console.log('=== HMS 小程序验证 V3 ===\n');
if (!fs.existsSync(SS_DIR)) fs.mkdirSync(SS_DIR, { recursive: true });
const mp = await withTimeout(automator.connect({ wsEndpoint: WS }), TIMEOUT, 'connect');
console.log('[OK] 已连接\n');
// System info
const info = await withTimeout(mp.systemInfo(), TIMEOUT, 'sys');
console.log(`设备: ${info.model} | SDK: ${info.SDKVersion} | 屏幕: ${info.screenWidth}x${info.screenHeight}\n`);
// Test pages - tabBar pages first using switchTab, then non-tabBar using reLaunch
const testPages = [
{ path: '/pages/index/index', name: '首页', tabBar: true },
{ path: '/pages/health/index', name: '健康中心', tabBar: true },
{ path: '/pages/appointment/index', name: '预约列表', tabBar: true },
{ path: '/pages/article/index', name: '资讯文章', tabBar: true },
{ path: '/pages/profile/index', name: '个人中心', tabBar: true },
{ path: '/pages/health/input/index', name: '健康数据录入' },
{ path: '/pages/health/trend/index', name: '健康趋势' },
{ path: '/pages/appointment/create/index', name: '创建预约' },
{ path: '/pages/appointment/detail/index', name: '预约详情' },
{ path: '/pages/article/detail/index', name: '文章详情' },
{ path: '/pages/profile/family/index', name: '就诊人管理' },
{ path: '/pages/profile/reports/index', name: '我的报告' },
{ path: '/pages/profile/followups/index', name: '我的随访' },
{ path: '/pages/profile/medication/index', name: '用药提醒' },
{ path: '/pages/profile/settings/index', name: '设置' },
{ path: '/pages/login/index', name: '登录页' },
{ path: '/pages/legal/user-agreement', name: '用户协议' },
{ path: '/pages/legal/privacy-policy', name: '隐私政策' },
];
let pass = 0, fail = 0, ss = 0;
for (const p of testPages) {
try {
if (p.tabBar) {
await withTimeout(mp.switchTab(p.path), TIMEOUT, `switchTab ${p.path}`);
} else {
await withTimeout(mp.reLaunch(p.path), TIMEOUT, `reLaunch ${p.path}`);
}
await sleep(1500);
const page = await withTimeout(mp.currentPage(), TIMEOUT, 'currentPage');
const ssOk = await saveScreenshot(mp, p.path.replace(/\//g, '_').replace(/^_/, ''));
if (ssOk) ss++;
console.log(` [OK] ${p.name}${page.path}${ssOk ? ' 📸' : ''}`);
pass++;
} catch (e) {
console.log(` [FAIL] ${p.name}: ${e.message}`);
fail++;
// Try to recover connection
try {
await sleep(2000);
await withTimeout(mp.currentPage(), 5000, 'recovery');
} catch {
// Connection might be dead, try reconnecting
console.log(' [RECOVERY] 尝试重新连接...');
try {
const mp2 = await withTimeout(automator.connect({ wsEndpoint: WS }), 10000, 'reconnect');
Object.assign(mp, mp2);
console.log(' [RECOVERY] 重新连接成功');
} catch {
console.log(' [RECOVERY] 重新连接失败');
}
}
}
}
// Page data checks
console.log('\n--- 页面数据检查 ---');
const dataPages = ['/pages/index/index', '/pages/login/index'];
for (const dp of dataPages) {
try {
await withTimeout(mp.reLaunch(dp), TIMEOUT, `nav ${dp}`);
await sleep(1500);
const page = await withTimeout(mp.currentPage(), TIMEOUT, 'page');
const data = await withTimeout(page.data(), TIMEOUT, 'data');
console.log(` ${dp}: keys = ${Object.keys(data).join(', ')}`);
} catch (e) {
console.log(` ${dp}: ${e.message}`);
}
}
console.log(`\n=== 结果: ${pass}/${testPages.length} 通过, ${fail} 失败, ${ss} 截图 ===`);
try { await mp.close(); } catch {}
}
main().catch(err => { console.error('Fatal:', err.message); process.exit(1); });