第一次

This commit is contained in:
dengqichen 2025-03-05 17:31:53 +08:00
parent 837001779f
commit 1111e06aaa

View File

@ -108,79 +108,7 @@ class LongiMainPage extends BasePage {
// 检查是否成功加载数据
if (menuItems && Array.isArray(menuItems) && menuItems.length > 0) {
console.log(`从文件 ${process.env.MENU_DATA_FILE_PATH} 成功加载了 ${menuItems.length} 个菜单项`);
//这里因为是序列化回来的所以没有对应每个menu的element元素需要补充回来。
console.log('开始恢复菜单项的element元素...');
// 等待菜单加载完成
await this.page.waitForSelector(this.selectors.sideNav, {
timeout: parseInt(process.env.MENU_TIME_OUT || '30000', 10)
});
// 获取当前页面上的所有菜单元素
const currentMenuElements = await this.page.locator(this.selectors.menuItems).all();
console.log(`当前页面上找到 ${currentMenuElements.length} 个菜单元素`);
// 为每个菜单项恢复element元素
for (const menuItem of menuItems) {
let foundElement = null;
let sameTextElements = [];
// 首先找到所有文本匹配的元素
for (const element of currentMenuElements) {
const elementText = await element.textContent();
if (elementText.trim() === menuItem.text) {
// 检查是否是一级菜单
const isTopMenu = await element.locator(this.selectors.firstLevelIndicator).count() > 0;
if (!isTopMenu) {
sameTextElements.push(element);
}
}
}
// 如果找到多个同名菜单,根据是否有三级菜单来区分
if (sameTextElements.length > 0) {
for (const element of sameTextElements) {
// 检查是否有三级菜单指示器
const hasThirdMenu = await element.evaluate(el => {
return el.classList.contains('el-sub-menu__title') ||
el.querySelector('.el-submenu__icon-arrow') !== null;
});
if (hasThirdMenu === menuItem.hasThirdMenu) {
foundElement = element;
break;
}
}
// 如果还没找到,就用第一个匹配的元素
if (!foundElement && sameTextElements.length > 0) {
foundElement = sameTextElements[0];
}
}
if (foundElement) {
menuItem.element = foundElement;
console.log(`✅ 成功恢复菜单项 "${menuItem.text}" (${menuItem.hasThirdMenu ? '有' : '无'}三级菜单) 的element元素`);
} else {
console.warn(`⚠️ 无法恢复菜单项 "${menuItem.text}" (${menuItem.hasThirdMenu ? '有' : '无'}三级菜单) 的element元素`);
}
}
// 检查是否所有菜单项都恢复了element元素
const missingElementCount = menuItems.filter(item => !item.element).length;
if (missingElementCount > 0) {
console.warn(`⚠️ 有 ${missingElementCount} 个菜单项未能恢复element元素`);
// 如果大部分菜单项都没有恢复element元素可能需要重新查找
if (missingElementCount > menuItems.length / 2) {
console.log('由于大部分菜单项未能恢复element元素将重新查找所有菜单项');
await this.expandSideMenu();
return await this.findAndSaveMenuItems();
}
}
console.log(`从文件 ${process.env.BASE_URL} 成功加载了 ${menuItems.length} 个菜单项`);
return menuItems;
} else {
await this.expandSideMenu();
@ -559,8 +487,76 @@ class LongiMainPage extends BasePage {
}
}
/**
* 恢复菜单项的element元素
* @param {Object} menuItem 需要恢复element的菜单项
* @returns {Promise<Object>} 返回更新后的菜单项
* @private
*/
async restoreMenuElement(menuItem) {
try {
// 获取当前页面上的所有菜单元素
const currentMenuElements = await this.page.locator(this.selectors.menuItems).all();
let foundElement = null;
let sameTextElements = [];
// 首先找到所有文本匹配的元素
for (const element of currentMenuElements) {
const elementText = await element.textContent();
if (elementText.trim() === menuItem.text) {
// 检查是否是一级菜单
const isTopMenu = await element.locator(this.selectors.firstLevelIndicator).count() > 0;
if (!isTopMenu) {
sameTextElements.push(element);
}
}
}
// 如果找到多个同名菜单,根据是否有三级菜单来区分
if (sameTextElements.length > 0) {
for (const element of sameTextElements) {
// 检查是否有三级菜单指示器
const hasThirdMenu = await element.evaluate(el => {
return el.classList.contains('el-sub-menu__title') ||
el.querySelector('.el-submenu__icon-arrow') !== null;
});
if (hasThirdMenu === menuItem.hasThirdMenu) {
foundElement = element;
break;
}
}
// 如果还没找到,就用第一个匹配的元素
if (!foundElement && sameTextElements.length > 0) {
foundElement = sameTextElements[0];
}
}
if (foundElement) {
menuItem.element = foundElement;
console.log(`✅ 成功恢复菜单项 "${menuItem.text}" (${menuItem.hasThirdMenu ? '有' : '无'}三级菜单) 的element元素`);
} else {
console.warn(`⚠️ 无法恢复菜单项 "${menuItem.text}" (${menuItem.hasThirdMenu ? '有' : '无'}三级菜单) 的element元素`);
}
return menuItem;
} catch (error) {
console.error(`恢复菜单项element时出错 [${menuItem.text}]:`, error.message);
return menuItem;
}
}
async handleSingleMenu(menu) {
await this.expandSideMenu();
// 在处理菜单前重新获取最新的element
menu = await this.restoreMenuElement(menu);
if (!menu.element) {
console.error(`无法找到菜单项 "${menu.text}" 的element跳过处理`);
return;
}
if (menu.hasThirdMenu) {
await this.handleThreeLevelMenu(menu);
} else {