- 修改默认路由重定向到首页 (/home) - 配置开发服务器使用5667端口 - 整理测试文件到temp-tests目录 - 优化项目结构便于开发和部署 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
187 lines
7.2 KiB
JavaScript
187 lines
7.2 KiB
JavaScript
import { chromium } from 'playwright';
|
||
|
||
(async () => {
|
||
const browser = await chromium.launch({
|
||
headless: false,
|
||
});
|
||
const context = await browser.newContext();
|
||
const page = await context.newPage();
|
||
|
||
// 监听控制台错误
|
||
page.on('console', msg => {
|
||
if (msg.type() === 'error') {
|
||
console.error('浏览器控制台错误:', msg.text());
|
||
}
|
||
});
|
||
|
||
try {
|
||
console.log('🚀 开始完整测试分析功能...\n');
|
||
|
||
// 1. 访问首页并登录
|
||
console.log('1. 登录系统...');
|
||
await page.goto('http://localhost:5669/', { waitUntil: 'networkidle' });
|
||
await page.waitForTimeout(2000);
|
||
|
||
// 检查是否需要登录
|
||
const needLogin = await page.locator('button:has-text("登录")').isVisible();
|
||
if (needLogin) {
|
||
await page.fill('input[placeholder*="账号"]', 'vben');
|
||
await page.fill('input[placeholder*="密码"]', '123456');
|
||
await page.locator('button:has-text("登录")').click();
|
||
await page.waitForTimeout(3000);
|
||
console.log(' ✅ 登录成功');
|
||
}
|
||
|
||
// 2. 刷新页面让菜单重新加载
|
||
console.log('\n2. 刷新页面重新加载菜单...');
|
||
await page.reload({ waitUntil: 'networkidle' });
|
||
await page.waitForTimeout(3000);
|
||
|
||
// 3. 查找并点击数据分析菜单
|
||
console.log('\n3. 导航到分析页面...');
|
||
|
||
// 尝试查找数据分析菜单
|
||
const analyticsMenu = await page.locator('span:has-text("数据分析")').first();
|
||
if (await analyticsMenu.isVisible()) {
|
||
console.log(' ✅ 找到"数据分析"菜单');
|
||
await analyticsMenu.click();
|
||
await page.waitForTimeout(1500);
|
||
|
||
// 查找数据概览子菜单
|
||
const overviewMenu = await page.locator('span:has-text("数据概览")').first();
|
||
if (await overviewMenu.isVisible()) {
|
||
console.log(' ✅ 找到"数据概览"子菜单');
|
||
await overviewMenu.click();
|
||
await page.waitForTimeout(3000);
|
||
} else {
|
||
console.log(' ❌ 未找到"数据概览"子菜单,尝试直接访问URL');
|
||
await page.goto('http://localhost:5669/analytics/overview', { waitUntil: 'networkidle' });
|
||
await page.waitForTimeout(3000);
|
||
}
|
||
} else {
|
||
console.log(' ❌ 未找到"数据分析"菜单,尝试直接访问URL');
|
||
await page.goto('http://localhost:5668/analytics/overview', { waitUntil: 'networkidle' });
|
||
await page.waitForTimeout(3000);
|
||
}
|
||
|
||
// 4. 检查页面是否正确加载
|
||
console.log('\n4. 检查页面加载状态...');
|
||
const currentUrl = page.url();
|
||
console.log(' 当前URL:', currentUrl);
|
||
|
||
// 检查是否还是404
|
||
const is404 = await page.locator('text="404"').isVisible();
|
||
if (is404) {
|
||
console.log(' ❌ 页面仍然显示404错误');
|
||
console.log('\n 尝试访问财务管理页面作为备选...');
|
||
|
||
// 访问财务管理
|
||
await page.goto('http://localhost:5669/finance/dashboard', { waitUntil: 'networkidle' });
|
||
await page.waitForTimeout(3000);
|
||
|
||
const financeLoaded = !await page.locator('text="404"').isVisible();
|
||
if (financeLoaded) {
|
||
console.log(' ✅ 财务管理页面加载成功');
|
||
}
|
||
} else {
|
||
console.log(' ✅ 分析页面加载成功!');
|
||
|
||
// 5. 详细检查功能组件
|
||
console.log('\n5. 检查关键功能组件...');
|
||
|
||
// 等待组件加载
|
||
await page.waitForTimeout(2000);
|
||
|
||
// 检查关键指标卡片
|
||
const hasMetricsCards = await page.locator('.key-metrics-cards').isVisible();
|
||
console.log(` 关键指标卡片: ${hasMetricsCards ? '✅' : '❌'}`);
|
||
|
||
if (hasMetricsCards) {
|
||
const metricsCount = await page.locator('.metric-card').count();
|
||
console.log(` - 发现 ${metricsCount} 个指标卡片`);
|
||
|
||
// 检查具体指标
|
||
const indicators = [
|
||
{ selector: '.ant-statistic-title:has-text("总收入")', name: '总收入' },
|
||
{ selector: '.ant-statistic-title:has-text("总支出")', name: '总支出' },
|
||
{ selector: '.ant-statistic-title:has-text("净收益")', name: '净收益' },
|
||
{ selector: '.ant-statistic-title:has-text("日均收支")', name: '日均收支' },
|
||
];
|
||
|
||
for (const ind of indicators) {
|
||
const visible = await page.locator(ind.selector).isVisible();
|
||
console.log(` - ${ind.name}: ${visible ? '✅' : '❌'}`);
|
||
}
|
||
}
|
||
|
||
// 检查标签页
|
||
const hasTabs = await page.locator('.ant-tabs').isVisible();
|
||
console.log(`\n 标签页导航: ${hasTabs ? '✅' : '❌'}`);
|
||
|
||
if (hasTabs) {
|
||
const tabs = [
|
||
{ name: '核心指标', selector: '.trend-chart' },
|
||
{ name: '预算分析', selector: '.budget-comparison' },
|
||
{ name: '智能洞察', selector: '.smart-insights' },
|
||
{ name: '标签分析', selector: '.tag-cloud-analysis' },
|
||
{ name: '时间维度', selector: '.time-dimension-analysis' },
|
||
];
|
||
|
||
for (const tab of tabs) {
|
||
console.log(`\n 测试"${tab.name}"标签页...`);
|
||
const tabElement = await page.locator(`.ant-tabs-tab:has-text("${tab.name}")`);
|
||
|
||
if (await tabElement.isVisible()) {
|
||
await tabElement.click();
|
||
await page.waitForTimeout(2000);
|
||
|
||
// 检查对应组件是否加载
|
||
const componentVisible = await page.locator(tab.selector).isVisible();
|
||
console.log(` 组件加载: ${componentVisible ? '✅' : '❌'}`);
|
||
|
||
// 截取每个标签页的截图
|
||
await page.screenshot({
|
||
path: `analytics-tab-${tab.name.replace(/[^a-z0-9]/gi, '-')}.png`,
|
||
fullPage: false
|
||
});
|
||
} else {
|
||
console.log(` 标签不可见 ❌`);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 6. 测试交互功能
|
||
console.log('\n6. 测试交互功能...');
|
||
|
||
// 测试日期选择器
|
||
const dateRangePicker = await page.locator('.ant-picker-range');
|
||
if (await dateRangePicker.isVisible()) {
|
||
console.log(' 日期范围选择器: ✅');
|
||
}
|
||
|
||
// 测试刷新按钮
|
||
const refreshButton = await page.locator('button:has-text("刷新数据")');
|
||
if (await refreshButton.isVisible()) {
|
||
console.log(' 刷新数据按钮: ✅');
|
||
await refreshButton.click();
|
||
await page.waitForTimeout(2000);
|
||
console.log(' 数据刷新完成');
|
||
}
|
||
|
||
// 最终成功截图
|
||
await page.screenshot({ path: 'analytics-complete-success.png', fullPage: true });
|
||
console.log('\n📸 完整功能测试截图已保存: analytics-complete-success.png');
|
||
|
||
console.log('\n✅ 🎉 分析功能测试完全成功!所有组件正常工作!');
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error('\n❌ 测试过程中出错:', error);
|
||
await page.screenshot({ path: 'analytics-complete-error.png' });
|
||
console.log('错误截图已保存: analytics-complete-error.png');
|
||
} finally {
|
||
console.log('\n测试完成,5秒后关闭浏览器...');
|
||
await page.waitForTimeout(5000);
|
||
await browser.close();
|
||
}
|
||
})(); |