系列09-Playwright UI 自动化平台怎么设计?MQ 调度与 Runner 执行架构
系列09-Playwright UI 自动化平台怎么设计MQ 调度与 Runner 执行架构本地用 Playwright 写脚本很顺做成团队平台会撞上四类硬问题浏览器不能长期跑在 FastAPI worker 里资源、隔离、Linux 无桌面多台 Windows/Mac 测试机如何认领任务、不串台截图/视频存哪、报告如何三级汇总Runner 在公网如何安全连 MQ/Redis/MinIOBrickCore 的答案平台编排 RabbitMQ 解耦 Runner 执行 Playwright。本文基于 CE 可读源码讲架构引擎WebEngine闭源但MQ 协议与调度逻辑完全开源。演示与源码地址功能演示http://43.142.83.156/showcase/ 「UI 录制」「UI Agent 生成步骤」等录屏平台 admin / BrickCore123456开源仓库https://gitee.com/BanZhuanKeOrz/BrickCoreRunner 安装包https://gitee.com/BanZhuanKeOrz/BrickCore/releases试跑页http://43.142.83.156/showcase/demo-ui.htmldemo / demo123。AI 定位器自愈见系列06本文聚焦调度与执行架构。一、为什么 UI 执行必须外置Web 内嵌浏览器后果与 API/压测抢 CPUUI 任务饿死或拖垮接口回归容器无 DISPLAYXvfb 稳定性差用户步骤任意 URL安全隔离难Web 水平扩容与浏览器进程无关浪费结论调度在平台执行在 Runner桌面或专用机。二、平台 vs Runner 职责边界平台FastAPI VueRunnerBrickCoreRunner步骤 JSON 编辑 / 录制入口✅❌计划触发、权限、报告✅❌Playwright 执行❌✅截图/视频上传 MinIO存 URL✅ 上传设备上线、心跳设备管理✅AI 自愈 LLM 调用Backend API失败时 POST internal三、四层数据模型Casesteps JSONkeyword / method / params / desc → Suite用例顺序、stop_on_failure、setup SQL → Task/Plan多套件、定时 cron → ExecutionPlan / Suite / Case 三级执行记录步骤示例{keyword:点击元素,method:click_ele,params:{locator:get_by_rolebutton,name提交,timeout:20000},desc:点击提交按钮}支持条件分支、步骤片段、数据库断言Backend 代跑 SQLRunner 不持库密码。四、端到端时序用户触发 UI 计划/套件/单用例 → 平台创建 *Execution 记录statusrunning → 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 → 平台汇总报告可选邮件推送┌──────────────┐ queuedevice_id ┌─────────────────┐ │ 平台 FastAPI │ ───────────────► │ Runner Playwright│ │ MySQL 记录 │ ◄─────────────── │ MinIO 截图 │ └──────────────┘ HTTP 回写 └─────────────────┘ │ ▲ └──────── RabbitMQ / Redis ──────────┘五、源码视角发任务与队列模型5.1 落库再发 MQ# routers/ui/exec.pyasyncdefdispatch_to_device(env_payload,suite_payload,device_id):deviceawaitDevice.get_or_none(iddevice_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(queuedevice_id,durableTrue)self.channel.basic_publish(exchange,routing_keydevice_id,bodymsg,propertiespika.BasicProperties(delivery_mode2))设计作用routing_keydevice_id每台 Runner 独占队列不串台durableTruedelivery_mode2Broker 重启不丢队列/消息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(...):runnerRunner(env_config,run_suite)resultrunner.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/internalconnect 模式routers/runner/connect.pyprovision_device_middleware为每设备独立 MQ/Redis 账号Runner不拿业务库密码。八、RabbitMQ、Redis、MinIO 与部署组件作用RabbitMQ任务队列25672Redis执行日志流、实时进度26379MinIO截图/视频公网 URL 需配MINIO_PUBLIC_ENDPOINT9200Docker 全栈部署时Runner 在容器外连公网中间件——安全组除 80 外须放行25672 / 26379 / 9200否则任务永久排队。九、Runner 生命周期实操安装BrickCoreRunnerRelease注意 arm64/intel配置平台 URL登录上线→ 设备管理显示「在线」UI 模块运行套件/计划选该device_id解压路径勿含中文/空格十、与 Selenium Grid / 纯脚本对比纯 Playwright 脚本Selenium Grid平台 Runner维护载体Git 代码Grid 节点Web 步骤 JSON非开发参与难中较易录制/Agent报告自建部分三级落库 HTML水平扩展CI shard加 Grid加 Runner 机器AI 自愈自建无平台 BackendRunner十一、CE 开源边界Gitee CE 可读安装包闭源backend调度、MQ、设备、报告runner/WebEngine引擎frontend步骤编辑器Runner 打包脚本MQ 消息结构、runner/connect—全功能可体验二次开发引擎需 Pro/商业授权或自研 Playwright 层。十二、常见排错现象处理任务一直排队Runner 未上线MQ 端口未开设备离线心跳超时重启 Runner报告无截图MinIO 公网地址/9200 安全组用例成功平台 runningMQ 跨线程 ack见 §6发错机器检查选用的 device_id十三、小结UI 平台 编排 记录Runner Playwright 执行。MQ 按设备队列分发易水平加机器。MinIO统一截图connect模式隔离中间件账号。架构可复用到任意「Web 测管 远程执行器」方案。附录 A源码文件索引顺序文件关注点1routers/ui/exec.pyExecution、dispatch_to_device2core/mq_producer.pysend_test_task3routers/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