Files

210 lines
7.5 KiB
JavaScript

// 多页面测试脚本
const { chromium } = require('playwright');
async function testAllPages() {
console.log('🚀 开始多页面测试...\n');
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
const baseUrl = 'http://localhost:5173';
const results = [];
// 1. 测试首页
console.log('📄 测试1: 首页 (Dashboard)');
try {
await page.goto(baseUrl, { waitUntil: 'networkidle', timeout: 30000 });
await page.waitForTimeout(2000);
// 检查关键元素
const title = await page.title();
const balanceCard = await page.$('.balance-card');
const statsGrid = await page.$('.stats-grid');
results.push({
page: '首页',
status: balanceCard && statsGrid ? '✅ 通过' : '⚠️ 部分通过',
title: title,
hasBalance: !!balanceCard,
hasStats: !!statsGrid
});
console.log(` 标题: ${title}`);
console.log(` 余额卡片: ${balanceCard ? '✅' : '❌'}`);
console.log(` 统计网格: ${statsGrid ? '✅' : '❌'}\n`);
} catch (error) {
console.log(` ❌ 错误: ${error.message}\n`);
results.push({ page: '首页', status: '❌ 失败', error: error.message });
}
// 2. 测试记账页面
console.log('📄 测试2: 记账页面 (Record)');
try {
await page.goto(`${baseUrl}/record`, { waitUntil: 'networkidle', timeout: 30000 });
await page.waitForTimeout(2000);
const pageTitle = await page.$('.page-title');
const filterBar = await page.$('.filter-bar');
results.push({
page: '记账',
status: pageTitle || filterBar ? '✅ 通过' : '⚠️ 部分通过',
hasTitle: !!pageTitle,
hasFilter: !!filterBar
});
console.log(` 页面标题: ${pageTitle ? '✅' : '❌'}`);
console.log(` 筛选栏: ${filterBar ? '✅' : '❌'}\n`);
} catch (error) {
console.log(` ❌ 错误: ${error.message}\n`);
results.push({ page: '记账', status: '❌ 失败', error: error.message });
}
// 3. 测试预算页面
console.log('📄 测试3: 预算页面 (Budget)');
try {
await page.goto(`${baseUrl}/budget`, { waitUntil: 'networkidle', timeout: 30000 });
await page.waitForTimeout(2000);
const overviewCard = await page.$('.overview-card');
const budgetList = await page.$('.budget-list');
results.push({
page: '预算',
status: overviewCard || budgetList ? '✅ 通过' : '⚠️ 部分通过',
hasOverview: !!overviewCard,
hasBudget: !!budgetList
});
console.log(` 概览卡片: ${overviewCard ? '✅' : '❌'}`);
console.log(` 预算列表: ${budgetList ? '✅' : '❌'}\n`);
} catch (error) {
console.log(` ❌ 错误: ${error.message}\n`);
results.push({ page: '预算', status: '❌ 失败', error: error.message });
}
// 4. 测试统计页面
console.log('📄 测试4: 统计页面 (Statistics)');
try {
await page.goto(`${baseUrl}/statistics`, { waitUntil: 'networkidle', timeout: 30000 });
await page.waitForTimeout(2000);
const chartCards = await page.$$('.chart-card');
const tabsContainer = await page.$('.chart-tabs');
results.push({
page: '统计',
status: chartCards.length > 0 ? '✅ 通过' : '⚠️ 部分通过',
chartCount: chartCards.length,
hasTabs: !!tabsContainer
});
console.log(` 图表卡片数量: ${chartCards.length}`);
console.log(` 图表切换标签: ${tabsContainer ? '✅' : '❌'}\n`);
} catch (error) {
console.log(` ❌ 错误: ${error.message}\n`);
results.push({ page: '统计', status: '❌ 失败', error: error.message });
}
// 5. 测试侧边栏导航
console.log('📄 测试5: 侧边栏导航');
try {
const navItems = await page.$$('.sidebar-nav-item');
results.push({
page: '导航',
status: navItems.length >= 4 ? '✅ 通过' : '⚠️ 部分通过',
navCount: navItems.length
});
console.log(` 导航项数量: ${navItems.length}`);
console.log(` 导航功能: ${navItems.length >= 4 ? '✅' : '❌'}\n`);
} catch (error) {
console.log(` ❌ 错误: ${error.message}\n`);
results.push({ page: '导航', status: '❌ 失败', error: error.message });
}
// 6. 测试响应式布局
console.log('📄 测试6: 响应式布局');
try {
await page.setViewportSize({ width: 1920, height: 1080 });
await page.waitForTimeout(1000);
const sidebarDesktop = await page.$('.sidebar');
const mainContentDesktop = await page.$('.main-content');
await page.setViewportSize({ width: 375, height: 667 });
await page.waitForTimeout(1000);
const mobileHeader = await page.$('.mobile-header');
const bottomTab = await page.$('.bottom-tab-bar');
results.push({
page: '响应式',
status: (sidebarDesktop && mainContentDesktop) || (mobileHeader && bottomTab) ? '✅ 通过' : '⚠️ 部分通过',
desktopMode: !!(sidebarDesktop && mainContentDesktop),
mobileMode: !!(mobileHeader && bottomTab)
});
console.log(` 桌面模式(1920px): ${sidebarDesktop && mainContentDesktop ? '✅' : '❌'}`);
console.log(` 移动模式(375px): ${mobileHeader && bottomTab ? '✅' : '❌'}\n`);
} catch (error) {
console.log(` ❌ 错误: ${error.message}\n`);
results.push({ page: '响应式', status: '❌ 失败', error: error.message });
}
// 7. 测试侧边栏折叠功能
console.log('📄 测试7: 侧边栏折叠功能');
try {
await page.setViewportSize({ width: 1920, height: 1080 });
await page.goto(baseUrl, { waitUntil: 'networkidle', timeout: 30000 });
const toggleBtn = await page.$('.sidebar-toggle');
if (toggleBtn) {
await toggleBtn.click();
await page.waitForTimeout(500);
const isCollapsed = await page.$('.sidebar.collapsed');
console.log(` 折叠功能: ${isCollapsed ? '✅' : '❌'}`);
await toggleBtn.click();
await page.waitForTimeout(500);
const isExpanded = await page.$('.sidebar:not(.collapsed)');
console.log(` 展开功能: ${isExpanded ? '✅' : '❌'}\n`);
results.push({
page: '折叠功能',
status: isCollapsed && isExpanded ? '✅ 通过' : '⚠️ 部分通过',
collapsible: !!isCollapsed,
expandable: !!isExpanded
});
} else {
console.log(` 折叠按钮: ❌ 未找到\n`);
results.push({ page: '折叠功能', status: '❌ 失败', error: '未找到折叠按钮' });
}
} catch (error) {
console.log(` ❌ 错误: ${error.message}\n`);
results.push({ page: '折叠功能', status: '❌ 失败', error: error.message });
}
// 测试总结
console.log('='.repeat(50));
console.log('📊 测试总结');
console.log('='.repeat(50));
const passed = results.filter(r => r.status.includes('通过')).length;
const total = results.length;
const passRate = ((passed / total) * 100).toFixed(1);
results.forEach(r => {
console.log(`${r.page.padEnd(10)} : ${r.status}`);
});
console.log('='.repeat(50));
console.log(`总计: ${passed}/${total} 通过 (${passRate}%)`);
console.log('='.repeat(50));
if (parseFloat(passRate) >= 80) {
console.log('\n🎉 测试结果:优秀!系统功能正常!');
} else if (parseFloat(passRate) >= 60) {
console.log('\n⚠️ 测试结果:一般,部分功能需要修复');
} else {
console.log('\n❌ 测试结果:不理想,需要修复关键问题');
}
await browser.close();
console.log('\n✅ 测试完成!');
}
testAllPages().catch(console.error);