当前位置: 首页 > news >正文

系列09-Playwright UI 自动化平台怎么设计?MQ 调度与 Runner 执行架构

系列09-Playwright UI 自动化平台怎么设计?MQ 调度与 Runner 执行架构

本地用 Playwright 写脚本很顺;做成团队平台会撞上四类硬问题:

  1. 浏览器不能长期跑在 FastAPI worker 里(资源、隔离、Linux 无桌面)
  2. 多台 Windows/Mac 测试机如何认领任务、不串台
  3. 截图/视频存哪、报告如何三级汇总
  4. Runner 在公网如何安全连 MQ/Redis/MinIO

BrickCore 的答案:平台编排 + RabbitMQ 解耦 + Runner 执行 Playwright。本文基于 CE 可读源码讲架构;引擎WebEngine闭源,但MQ 协议与调度逻辑完全开源


演示与源码

地址
功能演示http://43.142.83.156/showcase/ (「UI 录制」「UI Agent 生成步骤」等录屏;平台 admin / BrickCore123456)
开源仓库https://gitee.com/BanZhuanKeOrz/BrickCore
Runner 安装包https://gitee.com/BanZhuanKeOrz/BrickCore/releases

试跑页:http://43.142.83.156/showcase/demo-ui.html(demo / demo123)。AI 定位器自愈见系列06;本文聚焦调度与执行架构


一、为什么 UI 执行必须外置

Web 内嵌浏览器后果
与 API/压测抢 CPUUI 任务饿死或拖垮接口回归
容器无 DISPLAYXvfb 稳定性差
用户步骤任意 URL安全隔离难
Web 水平扩容与浏览器进程无关,浪费

结论调度在平台,执行在 Runner(桌面或专用机)。


二、平台 vs Runner 职责边界

平台(FastAPI + Vue)Runner(BrickCoreRunner)
步骤 JSON 编辑 / 录制入口
计划触发、权限、报告
Playwright 执行
截图/视频上传 MinIO存 URL✅ 上传
设备上线、心跳设备管理
AI 自愈 LLM 调用Backend API失败时 POST internal

三、四层数据模型

Case(steps JSON:keyword / method / params / desc) → Suite(用例顺序、stop_on_failure、setup SQL) → Task/Plan(多套件、定时 cron) → Execution(Plan / Suite / Case 三级执行记录)

步骤示例:

{"keyword":"点击元素","method":"click_ele","params":{"locator":"get_by_role=button,name=提交","timeout":20000},"desc":"点击提交按钮"}

支持条件分支步骤片段数据库断言(Backend 代跑 SQL,Runner 不持库密码)。


四、端到端时序

用户触发 UI 计划/套件/单用例 → 平台创建 *Execution 记录(status=running) → resolve_locator_heal、headless 等写入 env_config → dispatch_to_device(device_id) — 校验设备「在线」且含 web 引擎 → MQ send_test_task(env_config, run_suite, device_id) → Runner 消费 → Playwright 逐步执行 → HTTP post_results(截图 URL、步骤日志、locator_healed) → 平台汇总报告,可选邮件推送
┌──────────────┐ queue=device_id ┌─────────────────┐ │ 平台 FastAPI │ ───────────────► │ Runner Playwright│ │ MySQL 记录 │ ◄─────────────── │ MinIO 截图 │ └──────────────┘ HTTP 回写 └─────────────────┘ │ ▲ └──────── RabbitMQ / Redis ──────────┘

五、源码视角:发任务与队列模型

5.1 落库再发 MQ

# routers/ui/exec.pyasyncdefdispatch_to_device(env_payload,suite_payload,device_id):device=awaitDevice.get_or_none(id=device_id)ifnotdeviceordevice.status!="在线":returnFalsemq.send_test_task(env_payload,suite_payload,device_id)

先写 Execution 再发消息:Runner 回写时有关联 ID;设备离线则不分发,避免消息进无人队列。

5.2 队列名 = device_id

# core/mq_producer.pyself.channel.queue_declare(queue=device_id,durable=True)self.channel.basic_publish(exchange='',routing_key=device_id,body=msg,properties=pika.BasicProperties(delivery_mode=2))
设计作用
routing_key=device_id每台 Runner 独占队列,不串台
durable=True+delivery_mode=2Broker 重启不丢队列/消息

5.3 MQ 消息体(自建 Runner 可对照)

{"env_config":{"base_url":"https://demo.example.com","headless":true,"ai_heal_enabled":true,"project_id":1,"environment_id":2},"run_suite":{"suite_id":12,"case_id":101,"cases":[{"case_id":101,"steps":[...]}]}}

六、Runner 消费与经典踩坑

runner/tools/mq_consumer.py

# IO 线程收到消息 → 尽快 basic_ack# Playwright 在工作线程 execute → 禁止在工作线程 ackdef_process_message(...):runner=Runner(env_config,run_suite)result=runner.run()self._save_result(run_suite,result)

现象:用例实际成功,平台一直running,日志MQ 连接丢失
原因:PikaBlockingConnection跨线程 ack
处理:CE 安装包已在 IO 线程 ack;自建 Runner 须遵守同样约束。

失败步骤若开AI 自愈basecase.py捕获异常 →try_heal_step→ 重试本步(详见系列06)。


七、结果回写与安全

模式认证场景
桌面客户端 connectX-Runner-Token测试同学本机 Runner
演示机 / 无头X-Internal-Token/runner/results/internal

connect 模式routers/runner/connect.py):provision_device_middleware每设备独立 MQ/Redis 账号,Runner不拿业务库密码


八、RabbitMQ、Redis、MinIO 与部署

组件作用
RabbitMQ任务队列(25672)
Redis执行日志流、实时进度(26379)
MinIO截图/视频;公网 URL 需配MINIO_PUBLIC_ENDPOINT(9200)

Docker 全栈部署时,Runner 在容器外连公网中间件——安全组除 80 外须放行25672 / 26379 / 9200,否则任务永久排队。


九、Runner 生命周期(实操)

  1. 安装BrickCoreRunner(Release,注意 arm64/intel)
  2. 配置平台 URL,登录,上线→ 设备管理显示「在线」
  3. UI 模块运行套件/计划,选该device_id
  4. 解压路径勿含中文/空格

十、与 Selenium Grid / 纯脚本对比

纯 Playwright 脚本Selenium Grid平台 + Runner
维护载体Git 代码Grid 节点Web 步骤 JSON
非开发参与较易(录制/Agent)
报告自建部分三级落库 + HTML
水平扩展CI shard加 Grid加 Runner 机器
AI 自愈自建平台 Backend+Runner

十一、CE 开源边界

Gitee CE 可读安装包闭源
backend调度、MQ、设备、报告runner/WebEngine引擎
frontend步骤编辑器Runner 打包脚本
MQ 消息结构、runner/connect

全功能可体验;二次开发引擎需 Pro/商业授权或自研 Playwright 层。


十二、常见排错

现象处理
任务一直排队Runner 未上线;MQ 端口未开
设备离线心跳超时;重启 Runner
报告无截图MinIO 公网地址/9200 安全组
用例成功平台 runningMQ 跨线程 ack(见 §6)
发错机器检查选用的 device_id

十三、小结

  1. UI 平台 =编排 + 记录;Runner =Playwright 执行
  2. MQ 按设备队列分发,易水平加机器。
  3. MinIO统一截图;connect模式隔离中间件账号。
  4. 架构可复用到任意「Web 测管 + 远程执行器」方案。

附录 A:源码文件索引

顺序文件关注点
1routers/ui/exec.pyExecution、dispatch_to_device
2core/mq_producer.pysend_test_task
3routers/runner/connect.pyconnect bundle、中间件隔离
4core/runner_results.py结果落库、通知
5runner/tools/mq_consumer.py消费、ack 策略
6runner/tools/runner_api.pypost_results

支持与交流

  • 演示:http://43.142.83.156/showcase/ · 源码:https://gitee.com/BanZhuanKeOrz/BrickCore
  • 觉得有用欢迎Star⭐,问题评论区留言或 Gitee Issues
http://www.jsqmd.com/news/1106165/

相关文章:

  • 前后端分离考研互助交流平台系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • Go escape逃逸分析
  • AI文生图技术解析与商业应用实战指南
  • 网络变压器行业的全球前十强品牌主要分为国际头部厂商和国产领先企业两大阵营。
  • 深信服SangFor 8.0.95版本防火墙配置
  • Codex 用了一个月,SSD 少了 4.8TB——AI 编程工具暗藏的 5 个资源陷阱与终极方案
  • 孤能子视角:Karpathy LLM Wiki,一个人工观察符自动编织系统
  • 被需要是一种高级自由,这种被需要感能激发出你最深层的智慧和韧性。
  • 全书目录与章节地图 《AI Agent 开发平台资深技术专家 AI Agent 应用架构师 CTO 面试题库详解》
  • 第4章 RAG 检索增强生成全链路架构《AI Agent 开发平台资深技术专家 AI Agent 应用架构师 CTO 面试题库详解》
  • 下面设计实现的是:交换机Hlr指令处理任务模块。当然,在后续的业务发展过程中,还可能出现,其他类型指令的任务处理,所以根据“开闭”原则的定义,要抽象出一个接口类:BusinessEvent
  • Agent记忆中RAG难题,浙大MemGate盘活了
  • 终极指南:HS2-HF Patch - Honey Select 2游戏体验的完整革命
  • 智能合约开发中的威胁建模:代码生成前的安全基线构建
  • 生成式引擎优化(GEO)在酒店民宿行业的落地实践:对抗 OTA 流量截流
  • Adobe破解终极指南:三步免费激活Photoshop等专业软件
  • 【中小学AI人工智能教育】强化学习范例——平衡杆
  • Claude 桌面版(macOS / Windows)工具分享
  • DFT:IST和ROM BIST能不能同时跑?特别是在mission mode下
  • 多模态AI系统性能优化:从3.2秒到1.5秒的实战经验
  • 新160个CrackMe042-crackme、043-riijj_cm_20041121、044-tsrh-crackme逆向分析
  • 前端应用离线暂停更新策略:构建稳定可靠的渐进式部署方案
  • 第9章 MCP 协议与 Skills 工具生态《AI Agent 开发平台资深技术专家 AI Agent 应用架构师 CTO 面试题库详解》
  • 在C++基础上理解CSharp-6
  • AI 编译优化入门:算子融合不是为了少写几行代码
  • utpasswd命令详解:10个实用参数让密码管理更高效
  • SolidWorks_装配体设计5_自上而下设计
  • AI Agent 编排实战:别让多个智能体互相抢麦
  • 特种行业加固计算机配套的固态硬盘,兼容性问题通常出在哪里?
  • Kiran Biometrics:开源生物识别认证系统的完整指南