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

feat(smart-locate): 智能定位执行稳定性优化

- 修正功能中心选择器为已验证的 XPath (//*[@id='Home']/div[1]/div[1]/i)
- 增加抽屉展开等待逻辑(等待动画完成+宽度检测)
- 优化菜单点击(滚动到可见区域+选择器候选回退)
- 实现二级菜单导航支持(使用 menu_mapping 统一配置)
- 增加选择器回退机制(4种选择器格式按优先级尝试)
- playwright_executor 点击前增加 scroll_into_view_if_needed
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 d4a4221b
......@@ -1062,6 +1062,15 @@ class PlaywrightExecutor:
# 等待元素可见(宽松等待,不阻塞后续操作)
self._wait_for_element(selector, timeout=10000, state="visible")
# 滚动到可见区域(确保元素不被遮挡)
try:
el = self._page.query_selector(selector)
if el:
el.scroll_into_view_if_needed()
self._page.wait_for_timeout(200)
except Exception:
pass # 滚动失败不阻塞后续操作
# 策略1: 主页面普通点击
try:
self._page.click(selector, timeout=5000, force=force)
......
......@@ -181,35 +181,23 @@ class SmartLocateService:
Returns:
bool: 是否导航成功
"""
# 二级菜单映射:子菜单 → 分类
category_map = {
'资产信息': '资产管理',
'资产故障': '资产管理',
'资产设备': '资产管理',
'新建会议': '会议预约',
'会议模板': '会议预约',
'个人日程': '会议预约',
'会议室列表': '会议预约',
'会议列表': '会议预约',
'视讯设备': '会议运维',
'运维区域': '会议运维',
'运维设备': '会议运维',
'告警列表': '会议运维',
'会议巡检': '会议运维',
'运维巡检': '会议运维',
'转录列表': '会议转录',
'设备列表': '会议转录',
'远程控制': '会议转录',
'文件推送': '会议转录',
'消息推送': '会议转录',
'工单列表': '维护工单',
'我的工单': '维护工单',
'告警工单': '维护工单',
'信息窗管理': '信息管理',
'消息通知': '信息管理',
'会务统筹': '会务管理',
'会务工单': '会务管理',
}
# 二级菜单映射:子菜单 → 分类(使用 menu_mapping 统一配置)
try:
from app.utils.menu_mapping import get_menu_parent, is_direct_menu
category = get_menu_parent(menu_name)
except ImportError:
# 回退:本地映射
category_map = {
'资产信息': '资产管理', '资产故障': '资产管理', '资产设备': '资产管理',
'壁纸推送': '集控控制', '脚本命令': '集控控制', '应用管理': '集控控制',
'屏幕管理': '集控控制', '软件卸载': '集控控制', '设备网络': '集控控制',
'门口屏发布': '集控控制', '播放器发布': '集控控制',
'运维设备': '会议运维', '运维巡检': '会议运维',
'工单列表': '维护工单', '我的工单': '维护工单', '告警工单': '维护工单',
'信息窗管理': '信息管理', '消息通知': '信息管理',
'会务统筹': '会务管理', '会务工单': '会务管理',
}
category = category_map.get(menu_name)
try:
page = self.executor._page
......@@ -217,48 +205,121 @@ class SmartLocateService:
# 步骤 1: 点击功能中心图标
logger.debug("点击功能中心图标...")
try:
# XPath 选择器(已验证)
page.click('//*[@id="Home"]/div[1]/div[1]', timeout=5000)
page.wait_for_timeout(1000)
# XPath 选择器(已验证,指向 i 元素
page.click("//*[@id='Home']/div[1]/div[1]/i", timeout=5000)
logger.info("成功点击功能中心图标(XPath选择器)")
except Exception as e:
logger.warning(f"点击功能中心图标失败: {e}")
logger.warning(f"XPath选择器点击失败: {e}")
# 回退:尝试 class 选择器
try:
page.click('.home_nav_left', timeout=5000)
except Exception:
logger.error("无法点击功能中心图标")
logger.info("成功点击功能中心图标(class选择器回退)")
except Exception as e2:
logger.error(f"无法点击功能中心图标: {e2}")
return False
# 步骤 2: 等待功能抽屉打开
# 步骤 2: 等待功能抽屉打开并完成动画
logger.debug("等待功能抽屉打开...")
try:
# 2.1 等待抽屉元素出现
page.wait_for_selector('.el-drawer', timeout=5000)
logger.debug("抽屉元素已出现")
# 2.2 等待抽屉动画完成(检测抽屉是否展开)
# Element Plus 抽屉展开动画约 300ms
import time
time.sleep(0.3)
# 2.3 确认抽屉已完全展开
for _ in range(10): # 最多等待 1 秒
try:
drawer = page.query_selector('.el-drawer')
if drawer:
# 检查抽屉是否展开(宽度大于 0 且可见)
is_open = drawer.evaluate("""
el => {
const style = window.getComputedStyle(el);
const width = parseFloat(style.width);
return width > 100; // 抽屉展开后宽度应该大于 100px
}
""")
if is_open:
logger.debug("抽屉已完全展开")
break
except Exception:
pass
time.sleep(0.1)
# 2.4 额外稳定等待
time.sleep(0.2)
except Exception as e:
logger.warning(f"等待抽屉超时: {e}")
logger.warning(f"等待抽屉超时: {e},继续尝试后续步骤")
# 步骤 3: 如果是二级菜单,先点击分类展开
category = category_map.get(menu_name)
if category:
logger.debug(f"点击分类: {category}")
logger.debug(f"二级菜单导航: {category} -> {menu_name}")
try:
category_selector = f'.el-drawer >> text="{category}"'
page.click(category_selector, timeout=5000)
page.wait_for_timeout(1000)
logger.info(f"成功点击分类: {category}")
# 检查元素是否存在
cat_element = page.query_selector(category_selector)
if cat_element:
# 滚动到可见区域
cat_element.scroll_into_view_if_needed()
page.wait_for_timeout(300)
cat_element.click(timeout=5000)
page.wait_for_timeout(800)
logger.info(f"成功点击分类: {category}")
else:
logger.warning(f"未找到分类元素: {category}")
except Exception as e:
logger.warning(f"点击分类失败: {e},尝试直接点击菜单")
# 步骤 4: 点击目标菜单
# 步骤 4: 点击目标菜单(带滚动和重试)
logger.debug(f"点击目标菜单: {menu_name}")
try:
# 组合选择器:.el-drawer 内包含菜单文本的元素
menu_selector = f'.el-drawer >> text="{menu_name}"'
page.click(menu_selector, timeout=5000)
page.wait_for_timeout(2000)
# 菜单选择器候选列表(按优先级排序)
menu_selectors = [
f'.el-drawer >> text="{menu_name}"', # 优先:直接文本匹配
f'.el-drawer a:has-text("{menu_name}")', # 备选:链接元素
f'.el-drawer button:has-text("{menu_name}")', # 备选:按钮元素
f'.el-drawer [role="menuitem"]:has-text("{menu_name}")', # 备选:菜单项
]
click_success = False
for i, menu_selector in enumerate(menu_selectors):
try:
logger.debug(f"尝试选择器 {i+1}/{len(menu_selectors)}: {menu_selector}")
# 检查元素是否存在
element = page.query_selector(menu_selector)
if not element:
logger.debug(f"选择器 {i+1} 未找到元素")
continue
# 滚动到可见区域
element.scroll_into_view_if_needed()
page.wait_for_timeout(300) # 滚动后稳定
# 等待元素可点击状态
page.wait_for_selector(menu_selector, state="visible", timeout=3000)
# 执行点击
element.click(timeout=5000)
click_success = True
logger.info(f"成功点击菜单(选择器 {i+1}): {menu_name}")
break
except Exception as e:
logger.warning(f"选择器 {i+1} 点击失败: {e}")
continue
if click_success:
page.wait_for_timeout(1500) # 等待页面加载
logger.info(f"成功导航到菜单: {menu_name}")
return True
except Exception as e:
logger.error(f"点击菜单失败: {e}")
else:
logger.error(f"所有选择器都无法点击菜单: {menu_name}")
return False
except Exception as e:
......
"""
模块名称:menu_mapping.py
模块描述:菜单层级映射配置
用于智能定位时正确导航二级菜单。
探索结果:
- 新建会议: /#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FCreateMeeting
URL 模式分析:
- 会议相关: /#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2F{Page}
- 数据统计: /#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2F{Page}
@author czj
@date 2026-08-04
最后修改:2026-08-05
"""
# ==================== 功能中心抽屉菜单层级 ====================
# 二级菜单层级关系:分类 → 子菜单列表
# 这些菜单在功能中心抽屉内需要先点击分类展开
DRAWER_MENU_HIERARCHY = {
# 集控控制(二级菜单)
"集控控制": [
"壁纸推送", "脚本命令", "应用管理", "屏幕管理",
"软件卸载", "设备网络", "门口屏发布", "播放器发布"
],
# 资产管理(二级菜单)
"资产管理": ["资产信息", "资产设备"],
# 会议运维(二级菜单)
"会议运维": ["运维设备", "运维巡检"],
# 维护工单(二级菜单)
"维护工单": ["工单列表", "我的工单", "告警工单"],
# 信息管理(二级菜单)
"信息管理": ["信息窗管理", "消息通知"],
# 会务管理(二级菜单)
"会务管理": ["会务统筹", "会务工单"],
}
# 直接菜单(无子菜单,点击后直接跳转)
DIRECT_MENUS = [
"信息发布", "数据统计", "预定2.0",
"会议管理", "数据分析", "运维管理",
"管理看板", "通知公告", "会议室管理",
"系统设置", "其他分类"
]
def get_menu_parent(menu_name: str) -> str | None:
"""
获取菜单的父分类
Args:
menu_name: 菜单名称
Returns:
父分类名称,如果是直接菜单返回 None
"""
# 检查是否是直接菜单
if menu_name in DIRECT_MENUS:
return None
# 查找父分类
for parent, children in DRAWER_MENU_HIERARCHY.items():
if menu_name in children:
return parent
# 默认认为是直接菜单
return None
def is_direct_menu(menu_name: str) -> bool:
"""
判断是否为直接菜单
Args:
menu_name: 菜单名称
Returns:
True 表示直接菜单,False 表示二级菜单
"""
return get_menu_parent(menu_name) is None
def get_all_menus() -> list:
"""
获取所有菜单名称(包括直接菜单和二级菜单)
Returns:
所有菜单名称列表
"""
all_menus = list(DIRECT_MENUS)
for children in DRAWER_MENU_HIERARCHY.values():
all_menus.extend(children)
return all_menus
# ==================== 首页菜单 URL 映射 ====================
# 首页菜单卡片 URL 映射
MENU_BLOCK_ROUTES = {
# 会议管理相关
'新建会议': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FCreateMeeting',
'会议模板': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FMeetingTemplate',
'个人日程': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FPersonalSchedule',
'会议室列表': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FMeetingRoomList',
'会议列表': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FMeetingList',
# 数据统计相关
'预定数据': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FReservationData',
'使用数据': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FUsageData',
'管理看板': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FManagementBoard',
'故障数据': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FFaultData',
'运维数据': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FOperationData',
# 运维统计
'运维统计': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FOperationStatistics',
'巡检报表': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FInspectionReport',
'会议统计': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FMeetingStatistics',
'通知统计': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FNotificationStatistics',
'会议服务统计': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FMeetingServiceStatistics',
'会议室统计': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FMeetingRoomStatistics',
# 第三方集成统计
'Welink会议统计': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FWelinkStatistics',
'历史记录-WeLink': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FWelinkHistory',
'SMC3.0会议统计': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FSMCStatistics',
'历史记录-SMC3.0': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FSMCHistory',
'RSE会议统计': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FRSEStatistics',
'历史记录-RSE': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FRSEHistory',
# 概览
'会议概览': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FMeetingOverview',
'会议室概览': '/#/meetingV3?meetingV3=%2FmeetingV3%2F%23%2FMeetingRoomOverview',
}
# 一级菜单到子菜单的映射(用于智能推断)
MENU_HIERARCHY = {
'会议管理': ['新建会议', '会议模板', '个人日程', '会议室列表', '会议列表'],
'数据统计': ['预定数据', '使用数据', '管理看板', '故障数据', '运维数据'],
'运维管理': ['运维统计', '巡检报表'],
'统计报表': ['会议统计', '通知统计', '会议服务统计', '会议室统计'],
'第三方集成': ['Welink会议统计', '历史记录-WeLink', 'SMC3.0会议统计', '历史记录-SMC3.0', 'RSE会议统计', '历史记录-RSE'],
'概览': ['会议概览', '会议室概览'],
}
if __name__ == "__main__":
import json
print("首页菜单 URL 映射:")
print("=" * 60)
for menu, url in MENU_BLOCK_ROUTES.items():
print(f"{menu:20s} -> {url}")
print("\n一级菜单层级:")
print("=" * 60)
for parent, children in MENU_HIERARCHY.items():
print(f"{parent}: {', '.join(children)}")
# 保存到 JSON
with open("menu_mapping.json", 'w', encoding='utf-8') as f:
json.dump({
"block_routes": MENU_BLOCK_ROUTES,
"hierarchy": MENU_HIERARCHY
}, f, ensure_ascii=False, indent=2)
print("\n映射已保存到: menu_mapping.json")
\ No newline at end of file
......@@ -57,8 +57,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击集控控制分类", "action": "click", "params": {"selector": ".el-drawer >> text='集控控制'"}},
{"order": 5, "name": "点击壁纸推送菜单", "action": "click", "params": {"selector": ".el-drawer >> text='壁纸推送'"}},
{"order": 6, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
......@@ -74,8 +74,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击集控控制分类", "action": "click", "params": {"selector": ".el-drawer >> text='集控控制'"}},
{"order": 5, "name": "点击脚本命令菜单", "action": "click", "params": {"selector": ".el-drawer >> text='脚本命令'"}},
{"order": 6, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
......@@ -91,8 +91,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击集控控制分类", "action": "click", "params": {"selector": ".el-drawer >> text='集控控制'"}},
{"order": 5, "name": "点击应用管理菜单", "action": "click", "params": {"selector": ".el-drawer >> text='应用管理'"}},
{"order": 6, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
......@@ -112,8 +112,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击信息发布菜单", "action": "click", "params": {"selector": ".el-drawer >> text='信息发布'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -132,8 +132,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击数据统计菜单", "action": "click", "params": {"selector": ".el-drawer >> text='数据统计'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -152,8 +152,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击信息管理菜单", "action": "click", "params": {"selector": ".el-drawer >> text='信息管理'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -172,8 +172,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击预定2.0菜单", "action": "click", "params": {"selector": ".el-drawer >> text='预定2.0'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -192,8 +192,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击会议管理菜单", "action": "click", "params": {"selector": ".el-drawer >> text='会议管理'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -212,8 +212,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击数据分析菜单", "action": "click", "params": {"selector": ".el-drawer >> text='数据分析'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -232,8 +232,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击运维管理菜单", "action": "click", "params": {"selector": ".el-drawer >> text='运维管理'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -252,8 +252,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击管理看板菜单", "action": "click", "params": {"selector": ".el-drawer >> text='管理看板'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -272,8 +272,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击会议运维菜单", "action": "click", "params": {"selector": ".el-drawer >> text='会议运维'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -292,8 +292,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击资产管理菜单", "action": "click", "params": {"selector": ".el-drawer >> text='资产管理'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -312,8 +312,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击会务管理菜单", "action": "click", "params": {"selector": ".el-drawer >> text='会务管理'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -332,8 +332,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击维护工单菜单", "action": "click", "params": {"selector": ".el-drawer >> text='维护工单'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -352,8 +352,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击通知公告菜单", "action": "click", "params": {"selector": ".el-drawer >> text='通知公告'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -372,8 +372,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击会议室管理菜单", "action": "click", "params": {"selector": ".el-drawer >> text='会议室管理'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -392,8 +392,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击系统设置菜单", "action": "click", "params": {"selector": ".el-drawer >> text='系统设置'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......@@ -412,8 +412,8 @@ def build_cases():
"config": DEFAULT_CONFIG,
"steps": [
{"order": 1, "name": "等待首页加载", "action": "wait", "params": {"selector": ".block", "timeout": 15000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": ".home_nav_left"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 10000}},
{"order": 2, "name": "点击功能中心图标", "action": "click", "params": {"selector": "//*[@id='Home']/div[1]/div[1]/i"}},
{"order": 3, "name": "等待抽屉打开", "action": "wait", "params": {"selector": ".el-drawer", "timeout": 15000}},
{"order": 4, "name": "点击其他分类菜单", "action": "click", "params": {"selector": ".el-drawer >> text='其他分类'"}},
{"order": 5, "name": "等待页面加载", "action": "wait", "params": {"selector": "body", "timeout": 15000}},
{"order": 6, "name": "验证页面内容存在", "action": "assert", "params": {"type": "element_exists", "selector": "body"}},
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论