提交 ca76670a authored 作者: 陈泽健's avatar 陈泽健

fix(smart-locate): 修复关键词提取和二级菜单导航问题

1. 关键词提取:【】内核心词优先提取,去除修饰词
2. 二级菜单:支持分类→子菜单导航(如资产管理→资产信息)
3. 功能中心:使用已验证的 XPath 选择器
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 e6a0fb50
......@@ -78,7 +78,26 @@ def extract_keywords(description: str) -> List[str]:
cleaned = cleaned.replace(word, "")
cleaned = cleaned.strip()
keywords = [description] # 保留完整描述
# 去除修饰词(这些词不是关键词,但会影响匹配)
modifier_words = ['展开', '分类', '添加', '操作', '查看', '是否', '正确', '新增',
'条目', '列表', '数据', '验证', '成功', '完成', '页面', '系统']
for word in modifier_words:
cleaned = cleaned.replace(word, "")
cleaned = cleaned.strip()
# ⚠️ 关键修复:先提取【】内的核心词(优先级最高)
core_keywords = []
bracket_match = re.findall(r'【([^】]+)】', description)
if bracket_match:
for match in bracket_match:
core_keywords.append(match)
# 添加 2-gram
for i in range(len(match) - 1):
sub = match[i:i+2]
if sub not in ACTION_WORDS and sub not in ELEMENT_WORDS:
core_keywords.append(sub)
keywords = []
# 添加清理后的关键词
if cleaned:
......@@ -92,15 +111,22 @@ def extract_keywords(description: str) -> List[str]:
keywords.append(sub)
# 单字关键词(去掉停用词)
stopwords = {'的', '在', '是', '和', '有', '等', '中', '为', '了', '与', '或', '、', ',', '。', ' ',
'展开', '分类', '添加', '操作', '查看', '是否', '正确', '新增', '条目', '列表', '数据'}
stopwords = {'的', '在', '是', '和', '有', '等', '中', '为', '了', '与', '或', '、', ',', '。', ' '}
for ch in cleaned:
if ch.strip() and ch not in stopwords:
keywords.append(ch)
# 去重并保持顺序
seen = set()
# ⚠️ 【】内的核心词放在最前面(优先级最高)
result = []
seen = set()
# 先添加核心关键词
for kw in core_keywords:
if kw not in seen:
seen.add(kw)
result.append(kw)
# 再添加其他关键词
for kw in keywords:
if kw not in seen:
seen.add(kw)
......
......@@ -172,6 +172,7 @@ class SmartLocateService:
def _navigate_to_menu(self, menu_name: str) -> bool:
"""
导航到目标菜单(功能中心 → 抽屉 → 目标菜单)
支持二级菜单:先点击分类展开,再点击子菜单
Args:
menu_name (str): 目标菜单名称
......@@ -179,6 +180,36 @@ class SmartLocateService:
Returns:
bool: 是否导航成功
"""
# 二级菜单映射:子菜单 → 分类
category_map = {
'资产信息': '资产管理',
'资产故障': '资产管理',
'资产设备': '资产管理',
'新建会议': '会议预约',
'会议模板': '会议预约',
'个人日程': '会议预约',
'会议室列表': '会议预约',
'会议列表': '会议预约',
'视讯设备': '会议运维',
'运维区域': '会议运维',
'运维设备': '会议运维',
'告警列表': '会议运维',
'会议巡检': '会议运维',
'运维巡检': '会议运维',
'转录列表': '会议转录',
'设备列表': '会议转录',
'远程控制': '会议转录',
'文件推送': '会议转录',
'消息推送': '会议转录',
'工单列表': '维护工单',
'我的工单': '维护工单',
'告警工单': '维护工单',
'信息窗管理': '信息管理',
'消息通知': '信息管理',
'会务统筹': '会务管理',
'会务工单': '会务管理',
}
try:
page = self.executor._page
......@@ -204,7 +235,19 @@ class SmartLocateService:
except Exception as e:
logger.warning(f"等待抽屉超时: {e}")
# 步骤 3: 点击目标菜单
# 步骤 3: 如果是二级菜单,先点击分类展开
category = category_map.get(menu_name)
if category:
logger.debug(f"点击分类: {category}")
try:
category_selector = f'.el-drawer >> text="{category}"'
page.click(category_selector, timeout=5000)
page.wait_for_timeout(1000)
logger.info(f"成功点击分类: {category}")
except Exception as e:
logger.warning(f"点击分类失败: {e},尝试直接点击菜单")
# 步骤 4: 点击目标菜单
logger.debug(f"点击目标菜单: {menu_name}")
try:
# 组合选择器:.el-drawer 内包含菜单文本的元素
......@@ -391,13 +434,13 @@ class SmartLocateService:
def _get_login_selector(self, step_name: str) -> Optional[str]:
"""
获取登录相关步骤的选择器(使用已验证的登录模板)
获取登录相关步骤和导航步骤的选择器(使用已验证的模板)
Args:
step_name (str): 步骤名称
Returns:
Optional[str]: 选择器,如果不是登录步骤返回 None
Optional[str]: 选择器,如果不是已知步骤返回 None
"""
# 登录相关关键词映射到选择器
login_selector_map = {
......@@ -421,6 +464,16 @@ class SmartLocateService:
if keyword in step_name:
return selector
# ⚠️ 新增:功能中心导航相关步骤
nav_selector_map = {
'功能中心': '//*[@id="Home"]/div[1]/div[1]',
'首页': '//*[@id="Home"]/div[1]/div[1]',
}
for keyword, selector in nav_selector_map.items():
if keyword in step_name:
return selector
return None
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论