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

docs(smart-locate): 智能定位元素选择器缺失问题分析和执行计划

问题:会议管理-新建会议用例 20 个步骤中 7 个缺少选择器(35%)
根因:关键词提取不完善、点击操作匹配优先级低、下拉选择未处理、位置限定词缺失
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 54c0b13d
# 问题处理:智能定位元素选择器缺失问题
## 问题描述
**用例名称**:会议管理-新建会议-czj录入
**总步骤**:20
**定位结果**
- 有选择器:13(65%)
- 缺少选择器:7(35%)
---
## 缺失选择器的步骤详情
| 步骤 | 操作 | 步骤名称 | 定位结果 |
|------|------|---------|---------|
| 8 | click | 点击【新建会议】按钮 | MISSING |
| 10 | click | 会议室选择:北京展厅会议室 | MISSING |
| 11 | click | 时间切换为:预定会议 | MISSING |
| 13 | click | 点击左侧会议室框的编辑按钮 | MISSING |
| 15 | click | 点击左侧会议室框的【完成】按钮 | MISSING |
| 16 | click | 点击【确定创建】按钮 | MISSING |
| 19 | click | 点击底部的【取消会议】按钮 | MISSING |
---
## 问题分析
### 缺失步骤的共同特征
1. **全部是 click 操作** - 说明智能定位在处理点击类步骤时存在缺陷
2. **目标元素是按钮或下拉选项** - 这些元素需要特殊的选择器策略
3. **步骤描述使用中文** - "点击【新建会议】按钮"、"会议室选择:..."
### 根因分析
#### 1. 关键词匹配策略不完善
当前 `keyword_matcher.py` 的关键词提取逻辑:
```python
# 步骤名称:"点击【新建会议】按钮"
# 提取关键词:["新建会议"]
# 问题:【】符号未正确处理,导致关键词不完整
```
#### 2. 元素匹配优先级问题
点击操作时,智能定位的匹配策略:
- 优先匹配:ID、name、data-testid
- 次级匹配:文本内容、aria-label
- 问题:**按钮类元素没有优先匹配 button 标签**
#### 3. 下拉选择框处理缺失
"会议室选择:北京展厅会议室" 这类步骤:
- 需要先点击下拉框展开
- 再点击选项
- 当前智能定位没有处理这种两步操作
#### 4. 页面状态上下文不足
步骤13"点击左侧会议室框的编辑按钮":
- 需要识别"左侧"位置限定词
- 需要识别"会议室框"容器
- 当前智能定位没有处理位置限定词
---
## 解决方案
### 短期方案(临时修复)
#### 方案A:手动补充选择器
通过实际探索页面,手动为缺失步骤补充精确选择器:
```python
# 步骤8:点击【新建会议】按钮
selector = "button:has-text('新建会议')"
# 步骤10:会议室选择
selector = ".el-select:has-text('会议室')"
# 步骤16:点击【确定创建】按钮
selector = "button.el-button--primary:has-text('确定')"
```
#### 方案B:使用录制器重新定位
1. 在功能中心打开会议预约 → 新建会议页面
2. 使用录制器重新录制操作
3. 录制器会捕获精确选择器
---
### 中期方案(智能定位优化)
#### 优化1:改进关键词提取
**文件**`backend/app/services/keyword_matcher.py`
**改动**
```python
def extract_keywords(description: str) -> List[str]:
"""
改进:正确处理【】符号内的核心词
"""
import re
# 1. 先提取【】内的内容
bracket_match = re.findall(r'【([^】]+)】', description)
if bracket_match:
return bracket_match # 直接返回【】内的词
# 2. 去除动作词
# ... 原有逻辑
```
#### 优化2:点击操作优先匹配按钮
**文件**`backend/app/services/keyword_matcher.py`
**改动**
```python
def match_element_by_keywords(page, step_name: str, action: str):
"""
点击操作时,优先匹配 button 元素
"""
keywords = extract_keywords(step_name)
if action == 'click':
# 优先级1:button 标签
for kw in keywords:
selector = f'button:has-text("{kw}")'
el = page.query_selector(selector)
if el and el.is_visible():
return selector
# 优先级2:带 button role 的元素
# ...
```
#### 优化3:支持位置限定词
**文件**`backend/app/services/keyword_matcher.py`
**新增**
```python
def extract_position_context(description: str) -> dict:
"""
提取位置限定词
返回:
{
"position": "left" | "right" | "top" | "bottom",
"container": "会议室框" | "弹窗" | ...
}
"""
position_keywords = {
"左侧": "left", "左边": "left", "左": "left",
"右侧": "right", "右边": "right", "右": "right",
"顶部": "top", "上部": "top",
"底部": "bottom", "下部": "bottom"
}
for kw, pos in position_keywords.items():
if kw in description:
return {"position": pos}
return {}
```
#### 优化4:下拉选择两步操作
**文件**`backend/app/services/smart_locate_service.py`
**新增逻辑**
```python
def _locate_select_option(step_name: str, action: str) -> dict:
"""
处理下拉选择步骤(两步操作)
步骤名称格式:"会议室选择:北京展厅会议室"
"""
if action == 'click' and '选择:' in step_name:
# 1. 提取下拉框名称和选项名称
parts = step_name.split('选择:')
select_name = parts[0].strip() # "会议室"
option_name = parts[1].strip() # "北京展厅会议室"
# 2. 返回两步选择器
return {
"type": "select_option",
"selectors": [
f'.el-select:has-text("{select_name}")', # 第一步:点击下拉框
f'.el-select-dropdown:visible li:has-text("{option_name}")' # 第二步:点击选项
]
}
return None
```
---
### 长期方案(架构改进)
#### 1. 建立元素选择器库
为常用操作维护已验证的选择器:
```json
{
"新建会议": {
"page": "会议预约",
"selectors": {
"新建会议按钮": "button:has-text('新建会议')",
"会议名称输入框": "input[placeholder*='会议名称']",
"确定创建按钮": "button.el-button--primary:has-text('确定')"
}
}
}
```
#### 2. 智能定位与执行分离
- 智能定位只负责提取选择器
- 执行时再实际验证选择器有效性
- 失败时自动尝试备用选择器
#### 3. 引入视觉定位辅助
对于纯文本按钮(如"确定"、"取消"),使用视觉定位:
- 截图识别按钮位置
- 结合 OCR 提取按钮文字
- 生成基于坐标的点击操作
---
## 执行计划
### Phase 1:临时修复(立即执行)
1. **手动补充选择器**(30分钟)
- 打开会议预约 → 新建会议页面
- 使用浏览器 DevTools 获取精确选择器
- 更新用例步骤
2. **验证用例执行**(10分钟)
- 单独执行用例
- 确认所有步骤通过
### Phase 2:智能定位优化(本周内)
1. **优化关键词提取**(2小时)
- 修改 `keyword_matcher.py`
- 添加【】符号处理
- 添加单元测试
2. **优化点击操作匹配**(2小时)
- 修改 `keyword_matcher.py`
- 按钮元素优先匹配
- 添加单元测试
3. **支持位置限定词**(2小时)
- 新增位置上下文提取
- 在匹配时考虑位置信息
### Phase 3:长期改进(下周)
1. **建立元素选择器库**(4小时)
- 设计数据结构
- 实现存储和查询
- 集成到智能定位服务
2. **下拉选择两步操作**(2小时)
- 识别下拉选择步骤
- 实现两步定位逻辑
---
## 验收标准
1. ✅ 用例执行通过率达到 100%
2. ✅ 新增步骤的智能定位成功率达到 80%+
3. ✅ 下拉选择类步骤自动识别
4. ✅ 位置限定词正确解析
---
## 创建记录
- **创建时间**:2026-08-06
- **创建者**:Claude
- **关联用例**:会议管理-新建会议-czj录入
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论