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

docs(smart-locate): 纠正会议室选择为列表复选框,更新优化方案

- 步骤10不是下拉选择,是右侧会议室列表的复选框
- 新增列表内复选框定位策略
- 新增 Tab 切换按钮定位策略
- 更新执行计划
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 238cd456
...@@ -14,15 +14,20 @@ ...@@ -14,15 +14,20 @@
## 缺失选择器的步骤详情 ## 缺失选择器的步骤详情
| 步骤 | 操作 | 步骤名称 | 定位结果 | | 步骤 | 操作 | 步骤名称 | 定位结果 | UI 元素类型 |
|------|------|---------|---------| |------|------|---------|---------|------------|
| 8 | click | 点击【新建会议】按钮 | MISSING | | 8 | click | 点击【新建会议】按钮 | MISSING | 弹窗/页面按钮 |
| 10 | click | 会议室选择:北京展厅会议室 | MISSING | | 10 | click | 会议室选择:北京展厅会议室 | MISSING | **右侧列表复选框** |
| 11 | click | 时间切换为:预定会议 | MISSING | | 11 | click | 时间切换为:预定会议 | MISSING | Tab 切换 |
| 13 | click | 点击左侧会议室框的编辑按钮 | MISSING | | 13 | click | 点击左侧会议室框的编辑按钮 | MISSING | 按钮图标 |
| 15 | click | 点击左侧会议室框的【完成】按钮 | MISSING | | 15 | click | 点击左侧会议室框的【完成】按钮 | MISSING | 弹窗按钮 |
| 16 | click | 点击【确定创建】按钮 | MISSING | | 16 | click | 点击【确定创建】按钮 | MISSING | 弹窗按钮 |
| 19 | click | 点击底部的【取消会议】按钮 | MISSING | | 19 | click | 点击底部的【取消会议】按钮 | MISSING | 页面底部按钮 |
> **纠正说明**:
> - 步骤10"会议室选择"不是下拉框,而是新建会议界面右侧的会议室列表
> - 用户通过复选框勾选会议室(如"北京展厅会议室")
> - 这是列表内复选框定位问题,不是下拉选择问题
--- ---
...@@ -31,8 +36,13 @@ ...@@ -31,8 +36,13 @@
### 缺失步骤的共同特征 ### 缺失步骤的共同特征
1. **全部是 click 操作** - 说明智能定位在处理点击类步骤时存在缺陷 1. **全部是 click 操作** - 说明智能定位在处理点击类步骤时存在缺陷
2. **目标元素是按钮或下拉选项** - 这些元素需要特殊的选择器策略 2. **目标元素类型多样**
- 按钮类(步骤 8, 15, 16, 19)
- 列表内复选框(步骤 10)
- Tab 切换按钮(步骤 11)
- 图标按钮(步骤 13)
3. **步骤描述使用中文** - "点击【新建会议】按钮"、"会议室选择:..." 3. **步骤描述使用中文** - "点击【新建会议】按钮"、"会议室选择:..."
4. **位置限定词** - "左侧"、"底部" 需要解析
### 根因分析 ### 根因分析
...@@ -52,14 +62,21 @@ ...@@ -52,14 +62,21 @@
- 次级匹配:文本内容、aria-label - 次级匹配:文本内容、aria-label
- 问题:**按钮类元素没有优先匹配 button 标签** - 问题:**按钮类元素没有优先匹配 button 标签**
#### 3. 下拉选择框处理缺失 #### 3. 列表内复选框定位缺失
"会议室选择:北京展厅会议室" 这类步骤: "会议室选择:北京展厅会议室" 这类步骤:
- 需要先点击下拉框展开 - 目标是右侧会议室列表中的复选框
- 再点击选项 - 需要结合列表项文本定位对应的复选框
- 当前智能定位没有处理这种两步操作 - 选择器应该类似:`.el-checkbox:has-text("北京展厅会议室")``.el-table__row:has-text("北京展厅会议室") .el-checkbox`
#### 4. 页面状态上下文不足 #### 4. Tab 切换按钮识别缺失
"时间切换为:预定会议" 这类步骤:
- 目标是 Tab 组件中的某个 Tab 项
- 需要识别 Tab 组件并匹配文本
- 选择器应该类似:`.el-tabs__item:has-text("预定会议")`
#### 5. 页面状态上下文不足
步骤13"点击左侧会议室框的编辑按钮": 步骤13"点击左侧会议室框的编辑按钮":
- 需要识别"左侧"位置限定词 - 需要识别"左侧"位置限定词
...@@ -171,32 +188,72 @@ def extract_position_context(description: str) -> dict: ...@@ -171,32 +188,72 @@ def extract_position_context(description: str) -> dict:
return {} return {}
``` ```
#### 优化4:下拉选择两步操作 #### 优化4:列表内复选框定位
**文件**`backend/app/services/smart_locate_service.py` **文件**`backend/app/services/smart_locate_service.py`
**新增逻辑** **新增逻辑**
```python ```python
def _locate_select_option(step_name: str, action: str) -> dict: def _locate_list_checkbox(step_name: str, action: str) -> dict:
""" """
处理下拉选择步骤(两步操作) 处理列表内复选框定位
步骤名称格式:"会议室选择:北京展厅会议室" 步骤名称格式:"会议室选择:北京展厅会议室"
目标:右侧会议室列表中,名称为"北京展厅会议室"的复选框
选择器策略:
1. .el-checkbox:has-text("北京展厅会议室") - 复选框含文本
2. .el-table__row:has-text("北京展厅会议室") .el-checkbox - 表格行内复选框
3. .el-tree-node:has-text("北京展厅会议室") .el-checkbox - 树节点内复选框
""" """
if action == 'click' and '选择:' in step_name: if action == 'click' and '选择:' in step_name:
# 1. 提取下拉框名称和选项名称
parts = step_name.split('选择:') parts = step_name.split('选择:')
select_name = parts[0].strip() # "会议室" if len(parts) == 2:
option_name = parts[1].strip() # "北京展厅会议室" item_name = parts[1].strip() # "北京展厅会议室"
# 2. 返回两步选择器 # 返回候选选择器列表
return { return {
"type": "select_option", "type": "list_checkbox",
"selectors": [ "selectors": [
f'.el-select:has-text("{select_name}")', # 第一步:点击下拉框 f'.el-checkbox:has-text("{item_name}")',
f'.el-select-dropdown:visible li:has-text("{option_name}")' # 第二步:点击选项 f'.el-table__row:has-text("{item_name}") .el-checkbox',
] f'[class*="list"] :has-text("{item_name}") .el-checkbox',
} f'li:has-text("{item_name}") .el-checkbox',
]
}
return None
```
#### 优化5:Tab 切换按钮定位
**文件**`backend/app/services/smart_locate_service.py`
**新增逻辑**
```python
def _locate_tab_item(step_name: str, action: str) -> dict:
"""
处理 Tab 切换定位
步骤名称格式:"时间切换为:预定会议"
目标:Tab 组件中,名称为"预定会议"的 Tab 项
"""
import re
if action == 'click':
# 匹配 "xxx切换为:yyy" 或 "切换到:yyy"
match = re.search(r'切换[为到]?[::]\s*(.+)$', step_name)
if match:
tab_name = match.group(1).strip()
return {
"type": "tab_item",
"selectors": [
f'.el-tabs__item:has-text("{tab_name}")',
f'[role="tab"]:has-text("{tab_name}")',
f'.tab-item:has-text("{tab_name}")',
]
}
return None return None
``` ```
...@@ -266,6 +323,16 @@ def _locate_select_option(step_name: str, action: str) -> dict: ...@@ -266,6 +323,16 @@ def _locate_select_option(step_name: str, action: str) -> dict:
- 新增位置上下文提取 - 新增位置上下文提取
- 在匹配时考虑位置信息 - 在匹配时考虑位置信息
4. **支持列表内复选框定位**(2小时)
- 识别 "xxx选择:yyy" 格式
- 生成基于文本匹配的复选框选择器
- 添加单元测试
5. **支持 Tab 切换定位**(1小时)
- 识别 "xxx切换为:yyy" 格式
- 生成 Tab 选择器
- 添加单元测试
### Phase 3:长期改进(下周) ### Phase 3:长期改进(下周)
1. **建立元素选择器库**(4小时) 1. **建立元素选择器库**(4小时)
...@@ -273,9 +340,9 @@ def _locate_select_option(step_name: str, action: str) -> dict: ...@@ -273,9 +340,9 @@ def _locate_select_option(step_name: str, action: str) -> dict:
- 实现存储和查询 - 实现存储和查询
- 集成到智能定位服务 - 集成到智能定位服务
2. **下拉选择两步操作**(2小时) 2. **弹窗按钮智能定位**(2小时)
- 识别下拉选择步骤 - 识别弹窗上下文
- 实现两步定位逻辑 - 在弹窗内优先匹配按钮
--- ---
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论