Some checks failed
Deploy / deploy (push) Has been cancelled
Full-stack web application for Telegram management - Frontend: Vue 3 + Vben Admin - Backend: NestJS - Features: User management, group broadcast, statistics 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
177 lines
6.0 KiB
JavaScript
177 lines
6.0 KiB
JavaScript
const { chromium } = require('playwright');
|
||
|
||
async function testMenuClick() {
|
||
const browser = await chromium.launch({
|
||
headless: false,
|
||
slowMo: 1000
|
||
});
|
||
|
||
const context = await browser.newContext({
|
||
viewport: { width: 1920, height: 1080 }
|
||
});
|
||
|
||
const page = await context.newPage();
|
||
|
||
// 监听控制台错误和警告
|
||
page.on('console', msg => {
|
||
if (msg.type() === 'error') {
|
||
console.error(`❌ 控制台错误: ${msg.text()}`);
|
||
} else if (msg.type() === 'warning') {
|
||
console.warn(`⚠️ 控制台警告: ${msg.text()}`);
|
||
}
|
||
});
|
||
|
||
page.on('pageerror', error => {
|
||
console.error(`❌ 页面错误: ${error.message}`);
|
||
console.error(`错误堆栈: ${error.stack}`);
|
||
});
|
||
|
||
console.log('🔍 深度测试菜单点击功能...');
|
||
|
||
try {
|
||
// 登录
|
||
await page.goto('http://localhost:8891/login', { waitUntil: 'networkidle' });
|
||
|
||
console.log('1. 正在登录...');
|
||
const usernameInput = await page.locator('input[placeholder*="用户名"], input[placeholder*="username"], input[type="text"]').first();
|
||
const passwordInput = await page.locator('input[placeholder*="密码"], input[placeholder*="password"], input[type="password"]').first();
|
||
await usernameInput.fill('admin');
|
||
await passwordInput.fill('111111');
|
||
const submitButton = await page.locator('button[type="submit"], button:has-text("登录"), button:has-text("Login")').first();
|
||
await submitButton.click();
|
||
await page.waitForTimeout(3000);
|
||
|
||
// 访问主页
|
||
await page.goto('http://localhost:8891/home', {
|
||
waitUntil: 'networkidle',
|
||
timeout: 30000
|
||
});
|
||
|
||
console.log('2. ✅ 已成功访问主页');
|
||
|
||
// 等待页面完全加载
|
||
await page.waitForTimeout(2000);
|
||
|
||
// 截图保存当前状态
|
||
await page.screenshot({
|
||
path: 'menu-click-test-before.png',
|
||
fullPage: true
|
||
});
|
||
|
||
console.log('3. 🔍 开始测试菜单点击...');
|
||
|
||
// 测试展开的菜单项点击
|
||
console.log(' 测试展开菜单项...');
|
||
const expandedMenuItems = await page.locator('.ivu-menu-item').all();
|
||
console.log(` 找到 ${expandedMenuItems.length} 个展开菜单项`);
|
||
|
||
if (expandedMenuItems.length > 0) {
|
||
console.log(' 尝试点击第一个菜单项...');
|
||
const firstItem = expandedMenuItems[0];
|
||
const itemText = await firstItem.textContent();
|
||
console.log(` 菜单项文本: "${itemText}"`);
|
||
|
||
// 记录点击前的URL
|
||
const urlBefore = page.url();
|
||
console.log(` 点击前URL: ${urlBefore}`);
|
||
|
||
await firstItem.click();
|
||
await page.waitForTimeout(2000);
|
||
|
||
// 记录点击后的URL
|
||
const urlAfter = page.url();
|
||
console.log(` 点击后URL: ${urlAfter}`);
|
||
|
||
if (urlBefore !== urlAfter) {
|
||
console.log(' ✅ 菜单项点击成功!URL发生了变化');
|
||
} else {
|
||
console.log(' ❌ 菜单项点击可能无效,URL没有变化');
|
||
}
|
||
}
|
||
|
||
// 测试子菜单项点击
|
||
console.log(' 测试子菜单项...');
|
||
const submenuTitles = await page.locator('.ivu-menu-submenu-title').all();
|
||
console.log(` 找到 ${submenuTitles.length} 个子菜单标题`);
|
||
|
||
if (submenuTitles.length > 0) {
|
||
console.log(' 尝试展开第一个子菜单...');
|
||
const firstSubmenu = submenuTitles[0];
|
||
const submenuText = await firstSubmenu.textContent();
|
||
console.log(` 子菜单文本: "${submenuText}"`);
|
||
|
||
await firstSubmenu.click();
|
||
await page.waitForTimeout(1000);
|
||
|
||
// 查找展开后的子菜单项
|
||
const submenuItems = await page.locator('.ivu-menu-item').all();
|
||
if (submenuItems.length > 0) {
|
||
console.log(' 尝试点击子菜单中的第一项...');
|
||
const urlBefore = page.url();
|
||
await submenuItems[0].click();
|
||
await page.waitForTimeout(2000);
|
||
const urlAfter = page.url();
|
||
|
||
if (urlBefore !== urlAfter) {
|
||
console.log(' ✅ 子菜单项点击成功!URL发生了变化');
|
||
} else {
|
||
console.log(' ❌ 子菜单项点击可能无效,URL没有变化');
|
||
}
|
||
}
|
||
}
|
||
|
||
// 测试折叠菜单
|
||
console.log('4. 🔍 测试折叠菜单...');
|
||
|
||
// 先折叠侧边栏
|
||
const collapseButton = await page.locator('[class*="trigger"], [class*="collapse"]').first();
|
||
if (await collapseButton.count() > 0) {
|
||
await collapseButton.click();
|
||
await page.waitForTimeout(1000);
|
||
console.log(' ✅ 已折叠侧边栏');
|
||
|
||
// 测试折叠状态下的菜单
|
||
const collapsedMenus = await page.locator('.menu-collapsed a, .drop-menu-a').all();
|
||
console.log(` 找到 ${collapsedMenus.length} 个折叠菜单项`);
|
||
|
||
if (collapsedMenus.length > 0) {
|
||
console.log(' 尝试点击折叠菜单项...');
|
||
const urlBefore = page.url();
|
||
await collapsedMenus[0].click();
|
||
await page.waitForTimeout(2000);
|
||
const urlAfter = page.url();
|
||
|
||
if (urlBefore !== urlAfter) {
|
||
console.log(' ✅ 折叠菜单项点击成功!');
|
||
} else {
|
||
console.log(' ❌ 折叠菜单项点击可能无效');
|
||
}
|
||
}
|
||
}
|
||
|
||
// 截图保存测试后状态
|
||
await page.screenshot({
|
||
path: 'menu-click-test-after.png',
|
||
fullPage: true
|
||
});
|
||
|
||
console.log('5. 📊 测试总结:');
|
||
console.log(' - 已测试展开菜单项点击');
|
||
console.log(' - 已测试子菜单项点击');
|
||
console.log(' - 已测试折叠菜单项点击');
|
||
console.log(' - 检查控制台错误信息');
|
||
|
||
} catch (error) {
|
||
console.error('❌ 测试失败:', error.message);
|
||
console.error('错误堆栈:', error.stack);
|
||
}
|
||
|
||
// 保持浏览器打开15秒以便观察
|
||
console.log('\n⏱️ 保持浏览器打开15秒以便观察...');
|
||
await page.waitForTimeout(15000);
|
||
|
||
await browser.close();
|
||
console.log('🏁 测试完成');
|
||
}
|
||
|
||
testMenuClick().catch(console.error); |