请联系管理员在「权限管理」页面为您分配项目权限

刷新 总计:{{zoneStats.total}} 完成:{{zoneStats.type_1wc}} 运行:{{zoneStats.type_2run}} 等待:{{zoneStats.type_3wait}} 成功率:{{zoneTotalStats.success}} / {{zoneTotalStats.total}}({{zoneTotalStats.pct}}%) 停止:{{zoneStats.type_5stop}}
分片#{{zoneActiveRow.zid}}
加载中...
实时日志 - 分片#{{zoneActiveRow.zid}}
刷新
{{zoneLogContent[zoneActiveRow.zid] || '加载中...'}}
暂无记录
{{line.time}} {{line.content}}

AI 正在分析报告,请稍候...

分析耗时通常在 10-60 秒

点击"开始分析"让 AI 分析本分片的报告

耗时: {{formatAIDuration(aiAnalyzeDuration)}} (缓存)
开始分析 复制结果 关闭
分片 #{{updateNodeRow.zid}} 当前节点: {{updateNodeRow.node_ip || '未分配'}}
{{n.ip}} {{n.name}} 启用 禁用 隐藏
修改后分片将在新节点上等待调度(不会触发重跑)
取消 确认
提交修改 清空 添加项目 刷新项目列表
P0ALL 发布任务 重置
自动化占用超时设置
保存
子节点IP占用为自动化占用,超时自动释放
超时设置
刷新 每15秒自动同步
{{col.label}}
列设置
复制表格 总计 {{iosDevices.length}} 台 | 空闲 {{iosDevices.filter(function(d){return d.status==='idle'}).length}} | 占用 {{iosDevices.filter(function(d){return d.status==='busy'}).length}} | 离线 {{iosDevices.filter(function(d){return d.status==='offline'}).length}} 批量修改项目 已选 {{iosSelectedDevices.length}} 台
刷新 数据库存储,包含所有历史设备
{{col.label}}
列设置
复制表格 总计 {{(iosDevicesAll||[]).length}} 台 | 空闲 {{(iosDevicesAll||[]).filter(function(d){return d.status==='idle'}).length}} | 占用 {{(iosDevicesAll||[]).filter(function(d){return d.status==='busy'}).length}} | 在线 {{(iosDevicesAll||[]).filter(function(d){return d.online_status==='online'}).length}} | 离线 {{(iosDevicesAll||[]).filter(function(d){return d.online_status==='offline'}).length}}
>
新增项目 刷新
{{iosProjectEditingId?'编辑项目':'新增项目'}}
iOS Android 保存 取消
加载中...
{{commit.hash}} {{commit.message}}
{{commit.author}} - {{commit.date}}
更新代码(全部节点)
正在向各节点发送更新指令,请稍候...
关闭
iOS Android
{{p.display_name}} ({{p.project_name}})
暂无项目
打开目录 刷新目录 包管理
{{tag.tag_name}}
暂无标签
重命名
删除
任务名称 重跑次数 AJ包
App URL
下载到本地
解析到 {{parsedUrlList.length}} 个链接 全部下载到本地
{{idx+1}}. {{_extractFileName(u)}}
检测到非局域网链接,设备无法直接访问,请先下载到本地(或按 Enter) 立即下载到本地
{{appDownloadStatus==='pending'?'准备下载...':appDownloadStatus==='downloading'?'正在下载...':appDownloadStatus==='completed'?'下载完成':'下载失败'}} {{appBatchDownloads[0] && appBatchDownloads[0].sourceName}} 取消
速度: {{formatDownloadSpeed(appDownloadSpeed)}} 已用: {{_formatElapsed(appDownloadElapsed)}} 预计: {{_formatElapsed(appDownloadEstimated)}}
预计超时,下载速度过慢
{{appDownloadError}}
已替换为局域网地址,可直接提交
批量下载 {{appBatchDownloads.length}} 个包  {{appBatchDownloads.filter(function(i){return i.status==='completed'}).length}} 完成 {{appBatchDownloads.filter(function(i){return i.status==='failed'}).length}} 失败 取消
{{item.sourceName}} {{formatDownloadSpeed(item.speed)}} 完成 失败
{{item.error}}
目录: apps/{{iosRunForm.system}}/{{iosRunForm.project || '(未选项目)'}}
{{file.remark}}{{file.name}}({{file.uploader_name}})
已选 {{selectedAppFiles.length}} 个文件,提交时将为每个文件创建独立任务
本次上传 ({{appUploadFiles.length}}) 清空
{{f.name}} {{f.progress}}% {{_formatElapsed(f.elapsed)}} {{_formatElapsed(f.elapsed)}} 失败
文件总进度
{{appUploadCurrent}} / {{appUploadTotal}}
已耗时: {{_formatElapsed(appUploadElapsed)}}
上传完成
共 {{appUploadFiles.length}} 个文件,总耗时 {{_formatElapsed(appUploadLastElapsed)}}
点击继续上传
多个包体拖拉至此批量上传
文件20M+需要挂机等较久,着急建议走内网
设备池 ({{iosRunForm.device_ids.length}}/{{iosRunDeviceList.length}}) 空闲-{{iosRunDeviceList.filter(function(d){return d.status==='idle'}).length}} 忙碌-{{iosRunDeviceList.filter(function(d){return d.status!=='idle'}).length}} 电量-{{iosRunAvgBattery}}% 全选 清空
{{iosDeviceLabel(d)}} [{{d.status==='idle'?'空闲':'忙碌'}}] {{d.battery_level>=0 ? d.battery_level : d.battery}}%
暂无设备
用例 ({{manualSelectedCases.length}}/{{iosRunFilteredCases.length}}) 全选 清空
{{c.name}}
暂无用例
运行节点 ({{iosRunForm.node_ips.length}}/{{iosRunNodes.length}}) 全选 清空
{{n.name}} ({{n.ip}}) [禁用]
暂无节点
已选: 设备 {{iosRunForm.device_ids.length}} 台, 用例 {{manualSelectedCases.length}} 条, 节点 {{iosRunForm.node_ips.length}} 个
提交运行
包管理
目录: apps/{{iosRunForm.system}}/{{iosRunForm.project || '(未选项目)'}}  {{appsFileList.length}} 个包 刷新
暂无包文件
全部 apps 目录的上传记录(按时间倒序) 刷新
暂无上传记录
编辑备注
{{remarkDialogFile && remarkDialogFile.name}}
取消 确定

iOS 设备掉线记录 (最近7天)

刷新
总掉线次数
{{iosDisconnectStats.total || 0}}
WDA掉线
{{iosDisconnectStats.wda_count || 0}}
USB掉线
{{iosDisconnectStats.usb_count || 0}}
按设备统计:
{{name}}: {{count}}次
按节点统计:
{{ip}}: {{count}}次
暂无掉线记录

iOS 设备释放记录 (最近7天)

刷新
总释放次数
{{iosReleaseStats.total || 0}}
进程死亡
{{iosReleaseStats.process_dead_count || 0}}
节点离线
{{iosReleaseStats.node_offline_count || 0}}
占用超时
{{iosReleaseStats.occupy_timeout || 0}}
强制释放
{{iosReleaseStats.force_release || 0}}
按设备统计:
{{name}}: {{count}}次
按节点统计:
{{ip}}: {{count}}次
暂无释放记录
IP:{{clientIP}} 欢迎你
QA Platform 自动化测试平台
404
页面未找到
请求的路由不存在,请检查菜单配置或URL地址
返回主页
自动化占用超时设置
保存
子节点IP占用为自动化占用,超时自动释放
超时设置
刷新 每15秒
{{col.label}}
列设置
复制表格 总计 {{(androidDevices||[]).length}} 台 | 空闲 {{(androidDevices||[]).filter(function(d){return d.status==='idle'}).length}} | 占用 {{(androidDevices||[]).filter(function(d){return d.status==='busy'}).length}} | 离线 {{(androidDevices||[]).filter(function(d){return d.status==='offline'}).length}} 批量修改项目 批量安装 已选 {{(androidSelectedDevices||[]).length}} 台
刷新 数据库存储,包含所有历史设备
{{col.label}}
列设置
复制表格 总计 {{(androidDevicesAll||[]).length}} 台 | 空闲 {{(androidDevicesAll||[]).filter(function(d){return d.status==='idle'}).length}} | 占用 {{(androidDevicesAll||[]).filter(function(d){return d.status==='busy'}).length}} | 在线 {{(androidDevicesAll||[]).filter(function(d){return d.online_status==='online'}).length}} | 离线 {{(androidDevicesAll||[]).filter(function(d){return d.online_status==='offline' || !d.online_status}).length}}

Android 设备掉线记录 (最近7天)

刷新
总掉线次数
{{androidDisconnectStats.total || 0}}
ADB掉线
{{androidDisconnectStats.adb_count || 0}}
USB掉线
{{androidDisconnectStats.usb_count || 0}}
ATX 7912掉线
{{androidDisconnectStats.atx_count || 0}}
Gin 8080掉线
{{androidDisconnectStats.gin_count || 0}}
按设备统计:
{{name}}: {{count}}次
按节点统计:
{{ip}}: {{count}}次
暂无掉线记录

Android 设备释放记录 (最近7天)

刷新
总释放次数
{{androidReleaseStats.total || 0}}
进程死亡
{{androidReleaseStats.process_dead_count || 0}}
节点离线
{{androidReleaseStats.node_offline_count || 0}}
占用超时
{{androidReleaseStats.occupy_timeout || 0}}
强制释放
{{androidReleaseStats.force_release || 0}}
按设备统计:
{{name}}: {{count}}次
按节点统计:
{{ip}}: {{count}}次
暂无释放记录

iOS Monkey 测试 (Fastbot)

分钟 ms
设备 ({{monkeyForm.device_ids.length}}/{{monkeyDevices.length}}) 全选 清空
{{monkeyDeviceLabel(d)}}
暂无在线设备
节点 ({{monkeyForm.node_ips.length}}/{{monkeyNodes.length}}) 全选 清空
{{n.name}} ({{n.ip}})
暂无节点
已选: 设备 {{monkeyForm.device_ids.length}} 台, 节点 {{monkeyForm.node_ips.length}} 个
刷新设备 启动Monkey

Monkey 任务列表

刷新
设备 ({{robustnessIosForm.device_ids.length}}/{{robustnessIosDevices.length}}) 全选 清空
{{robustnessIosDeviceLabel(d)}}
节点 ({{robustnessIosForm.node_ips.length}}/{{robustnessIosNodes.length}}) 全选 清空
{{n.name}} ({{n.ip}})
启动测试

Android健壮性测试

设备 ({{robustnessAndroidForm.device_ids.length}}/{{robustnessAndroidDevices.length}}) 全选 清空
{{robustnessAndroidDeviceLabel(d)}}
暂无在线设备
节点 ({{robustnessAndroidForm.node_ips.length}}/{{robustnessAndroidNodes.length}}) 全选 清空
{{n.name}} ({{n.ip}})
暂无节点
已选: 设备 {{robustnessAndroidForm.device_ids.length}} 台, 节点 {{robustnessAndroidForm.node_ips.length}} 个
刷新设备 启动测试
新增定时任务 刷新
至
分钟
即每 {{ formatInterval(cronTaskForm.interval) }} 执行一次
取消 保存
新增强制重跑 刷新 任务完成后绕过成功率直接重跑所有分片,用于压测调度器
至
分钟
任务完成后等待 {{ formatInterval(forceRerunForm.interval) }} 再次重跑
取消 保存
启动脚本 刷新
正在启动投屏...
{{ anchorScreenMode === 'scrcpy' ? 'scrcpy' : '截图模式' }}
{{ anchorActiveRow.device_name || anchorActiveRow.device_ip }}
实时日志 - {{ anchorActiveRow.script_name }} {{ anchorLogStatus === 'running' ? '运行中' : '已停止' }} 刷新
{{ line }}
暂无日志
取消 启动
AI 图片元素定位
上传本地图片
已选:{{ aiLocateFileName }}
次数:
{{ aiLocateLoading && aiLocateProgress ? '定位中 ' + aiLocateProgress : '开始定位' }} {{ aiBooleanLoading && aiBooleanProgress ? '判断中 ' + aiBooleanProgress : 'AI 判断 (T/F)' }} {{ aiQueryLoading && aiQueryProgress ? '提取中 ' + aiQueryProgress : 'AI 提取 (Query)' }}
手动打点(绿)
X: Y:
绝对:({{ aiLocateManualX }}, {{ aiLocateManualY }})
相对:({{ (aiLocateManualX / aiLocateImgNaturalW).toFixed(4) }}, {{ (aiLocateManualY / aiLocateImgNaturalH).toFixed(4) }})
截图:{{ aiLocateImgNaturalW }} x {{ aiLocateImgNaturalH }}
AI #{{ idx + 1 }}: ({{ res.center_pixel[0].toFixed(1) }}, {{ res.center_pixel[1].toFixed(1) }}) / {{ res.center_percent[0].toFixed(4) }}, {{ res.center_percent[1].toFixed(4) }}
AI #{{ idx + 1 }}: {{ res._error }}
点击: ({{ aiLocateClickPixel[0] }}, {{ aiLocateClickPixel[1] }}) / {{ aiLocateClickPercent[0].toFixed(4) }}, {{ aiLocateClickPercent[1].toFixed(4) }}
手动: ({{ aiLocateManualX }}, {{ aiLocateManualY }}) / {{ (aiLocateManualX / aiLocateImgNaturalW).toFixed(4) }}, {{ (aiLocateManualY / aiLocateImgNaturalH).toFixed(4) }}
{{ aiLocateError }}
#{{ idx + 1 }}
{{ res._error }}
上传图片或粘贴 URL 后预览
点击图片获取坐标 | 红=AI 蓝=点击 绿=手动
AI 调用详情 #{{ idx + 1 }}
{{ res._error }}
坐标: ({{ res.center_pixel[0].toFixed(1) }}, {{ res.center_pixel[1].toFixed(1) }}) / {{ res.center_percent[0].toFixed(4) }}, {{ res.center_percent[1].toFixed(4) }} 未检测到
AI 分析:
{{ res.reasoning }}
AI 调用详情
提示词:{{ aiLocateResult._ai_prompt || aiLocatePrompt }}
图片尺寸:{{ aiLocateResult.image_size.width }} x {{ aiLocateResult.image_size.height }}
AI 分析:
{{ aiLocateResult.reasoning }}
AI 判断 #{{ idx + 1 }} {{ res.result ? 'True' : 'False' }} 置信度: {{ res.confidence.toFixed(2) }}
{{ res._error }}
结果:{{ res.result ? 'True' : 'False' }}
说明:{{ res.message }}
AI 分析:
{{ res.reasoning }}
{{ aiBooleanError }}
AI 提取 #{{ idx + 1 }} 置信度: {{ res.confidence.toFixed(2) }}
{{ res._error }}
提取结果:
{{ typeof res.data === 'object' ? JSON.stringify(res.data, null, 2) : res.data }}
AI 分析:
{{ res.reasoning }}
{{ aiQueryError }}
执行操作后,结果将在此显示
OCR 定位 AI 模型定位(Qwen2.5-VL)
OCR 元素定位
设备实时截图
获取截图
上传本地图片
OCR文字 底部控件
次数
定位元素
检测中...
图片预览 已缓存 base64 ({{Math.round(visionCachedBase64.length/1024)}}KB) · 右键图片可复制/另存为
复制 base64
图片另存为
上传图片或粘贴 URL 后预览
匹配结果
识别后显示匹配结果
第 {{round.round}} 次 {{round.items.length}} 个
{{item.type}} {{item.label}} ({{item.x}}, {{item.y}}) 点击
OCR 定位 AI 模型定位(Qwen2.5-VL) AI 图片元素定位
上传本地图片 开始定位
手动打点(绿)
X: Y:
绝对:({{ visionAIManualX }}, {{ visionAIManualY }})
相对:({{ (visionAIManualX/visionAIImgNaturalW).toFixed(4) }}, {{ (visionAIManualY/visionAIImgNaturalH).toFixed(4) }})
截图:{{ visionAIImgNaturalW }} x {{ visionAIImgNaturalH }}
AI:({{ visionAIResult.center_pixel[0].toFixed(1) }}, {{ visionAIResult.center_pixel[1].toFixed(1) }}) / {{ visionAIResult.center_percent[0].toFixed(4) }}, {{ visionAIResult.center_percent[1].toFixed(4) }}
点击:({{ visionAIClickPixel[0] }}, {{ visionAIClickPixel[1] }}) / {{ visionAIClickPercent[0].toFixed(4) }}, {{ visionAIClickPercent[1].toFixed(4) }}
手动:({{ visionAIManualX }}, {{ visionAIManualY }}) / {{ (visionAIManualX/visionAIImgNaturalW).toFixed(4) }}, {{ (visionAIManualY/visionAIImgNaturalH).toFixed(4) }}
{{ visionAIError }}
上传图片或粘贴 URL 后预览
点击图片获取坐标 | 红=AI 蓝=点击 绿=手动
AI 调用详情
私有提示词:{{ visionAIResult._ai_prompt || visionAIPrompt }}
图片尺寸:{{ visionAIResult.image_size.width }} x {{ visionAIResult.image_size.height }}
公共提示词: {{ visionAIShowSystemPrompt?'收起':'展开' }}
{{ visionAIResult._system_prompt || '(未返回)' }}
AI 分析:
{{ visionAIResult.reasoning }}
AI 原始响应:
{{ visionAIResult._ai_raw_response }}
CV 模板匹配
上传截图
已选:{{ cvFileName }}
匹配模板 匹配所有模板 自动切割控件
阈值:
框选保存模板
在图片上拖拽框选区域,然后输入名称保存
区域:({{ cvCropRegion[0] }}, {{ cvCropRegion[1] }}) - ({{ cvCropRegion[2] }}, {{ cvCropRegion[3] }})
尺寸:{{ cvCropRegion[2] - cvCropRegion[0] }} x {{ cvCropRegion[3] - cvCropRegion[1] }}
保存为模板
匹配结果
匹配成功
坐标:({{ cvMatchResult.x }}, {{ cvMatchResult.y }})
置信度:{{ (cvMatchResult.confidence * 100).toFixed(1) }}%
区域:{{ JSON.stringify(cvMatchResult.region) }}
未匹配到
全模板匹配 ({{ cvMatchAllResults.length }})
{{ r.template }}
坐标 ({{ r.x }}, {{ r.y }}) | {{ (r.confidence * 100).toFixed(1) }}%
模板库 ({{ cvTemplates.length }}) 刷新
{{ t }} 删
暂无模板
上传截图后预览,可在图片上框选区域保存为模板
图片尺寸: {{ cvImgNaturalW }} x {{ cvImgNaturalH }} | 拖拽框选区域保存模板 | 红点=匹配位置 蓝框=框选区域
AES 加解密工具 (ECB/CBC + PKCS7)
输入文本(明文/密文)
加密模式
密钥(16/24/32字节)
偏移量IV(16字节)
加密 >> 解密 >> 交换
输出结果
{{ cryptoJsonPath }} (点击复制)
{{ cryptoJsonValue }} (点击复制)
{{ cryptoEditMode ? '切换树形视图' : '切换编辑模式' }}
复制 格式化 压缩 校验 Unicode转中文 中文转Unicode
复制 Key
复制 Value
复制路径
展开到 1 级
展开到 2 级
展开到 3 级
展开到 4 级
展开全部
收起全部
大组件
小组件
{{ cryptoEditMode ? '树形视图' : '编辑模式' }}
条 刷新
iOS 调度日志
Android 调度日志
首页路由设置
镜像路由 空白欢迎页 保存首页设置
设备自动化占用超时设置
保存超时设置
说明:子节点IP发起的占用视为自动化占用,超时后自动释放;非子节点占用为人工占用,不限制时间。
异常任务巡检设置
保存巡检设置
说明:分片运行超过指定时间无更新则标记为异常并释放设备;等待中的分片由调度器管理不做干预。任务的所有分片结束后自动汇总标记完成。
点点系统代理设置
保存
说明:点点系统的代理目标地址,默认 http://192.168.31.185:5273,后续迁移到其他服务器时修改此地址。
新增一级菜单 保存配置 重置 移动排序 思维导图
一级 添加子菜单 删除
二级 移动到 {{g.title || '(未命名)'}} 删除
直接拖拽节点调整顺序和层级,支持一级菜单互换位置、子菜单跨组移动。
{{ data.label }} {{ (data.children || []).length }} 项 隐藏
取消 应用排序
拖拽节点可调整顺序和层级,修改后点「保存排序」生效。 全部展开 全部收起
{{ data.label }} ({{ data.routeKey }})
取消 保存排序
创建账号
用户名已存在
取消 创建

点击左侧用户,中间勾选路由权限,右侧实时预览该用户能看到的菜单。管理员自动全权限。

用户列表
飞书账号
账密账号
暂无用户
全部路由
全选 清空 保存
请先选择左侧用户

管理员自动拥有全部权限

{{ data.label }} ({{data.routeKey}})
{{ permEditName ? permEditName + ' 的视图' : '权限预览' }} 管理员 全路由
选择用户后显示视图
{{ data.label }}

该用户暂无路由权限

{{ data.label }}

任务设置

自动重跑与通知规则
分片成功率低于此值自动触发重跑 低于此数量每小时报告会@告警 关闭后不再发送每小时设备统计 每个任务最多自动重跑次数

规则说明:

1. 分片完成时,如果成功率低于阈值,自动触发重跑(放到调度队列尾部)

2. 任务全部完成后,如果所有分片成功率都高于阈值但整体不是100%,群里 @ 低成功率用户

3. 任务全部完成后,如果成功率为0%,群里 @ 成功率0%用户

运行节点管理 刷新
暂无节点数据
启用:正常可选; 禁用:显示但不可选中; 隐藏:发起任务页面不显示。 状态实时生效。
禅道 Bug 统计
新增产品 批量刷新
禅道链接: 查询 飞书推送 缓存数据
缓存于 {{ item.cacheTime }} 耗时 {{ item.elapsed }}s {{ item.dateRangeLabel }}
获取失败
{{ item.error }}
产品名称
{{ item.data.product_name }}
产品ID
{{ item.data.product_id }}
Bug总数
{{ item.data.total }}
统计周期
{{ item.dateRangeLabel || '最近3个月' }}
每日统计

选择时间范围后点击"查询"获取数据

正在获取数据...

暂无产品配置

点击上方"新增产品"按钮添加禅道产品链接

新增产品
数据库
加载中...
{{ data.label }} ({{ data.children ? data.children.length : 0 }})
{{ sqlMeta.selectedTable.name }} {{ sqlMeta.selectedDb }}
{{ col.name }} {{ col.type }} [PK]
执行查询 重置 仅支持 SELECT,最多 1000 条
{{ sqlQueryResult.error }}
历史记录
暂无历史记录
{{ item.sql.substring(0, 150) }}{{ item.sql.length > 150 ? '...' : '' }}
{{ item.user }} {{ formatHistoryTime(item.last_used) }}
删除用户
删除操作不可逆

点点系统已在新窗口中打开

重新打开点点系统