学习周记 #05 | 2026 年 AI Web UI 自动化进阶:多 Agent 协作测试平台实战(Planner + Coder + Executor + Reviewer)
·
前言
大家好,前几期我们从 RAG 到单 Agent 再到 Self-Healing,已经逐步把 AI 融入 Web UI 自动化。本期实现质的飞跃:构建多 Agent 协作测试平台,让不同 Agent 分工协作,显著提升生成代码的质量和稳定性。
核心架构:Planner(规划) → Coder(编码) → Executor(执行) → Reviewer(评审) 循环优化。
一、多 Agent 协作整体流程
- Planner Agent:理解需求,拆解测试步骤,生成测试计划
- Coder Agent:根据计划生成规范的 POM 代码 + Self-Healing
- Executor Agent:执行测试,收集结果和截图
- Reviewer Agent:评审代码和执行结果,提出改进意见(如需则返回 Coder 优化)
二、环境准备(沿用前几期)
Bash
pip install langchain langchain-ollama langgraph # langgraph 用于多 Agent 编排
三、核心代码实现(细致版)
1. 定义四个 Agent 的 Prompt(核心灵魂)
Python
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOllama(model="qwen2.5:14b", temperature=0.1)
# Planner Agent
planner_prompt = ChatPromptTemplate.from_template(
"""你是一位测试架构师。根据用户需求,输出结构化的测试计划。
需求:{input}
输出格式(严格遵守):
- 测试目标:
- 核心流程步骤:
- 需要检查的关键点:
- 可能的风险点:
- 建议使用的 Page 类"""
)
# Coder Agent
coder_prompt = ChatPromptTemplate.from_template(
"""你是一位 Playwright 专家,使用 POM + Self-Healing 模式编写代码。
测试计划:{plan}
要求:
1. 继承 BasePage 类
2. 所有点击使用 safe_click 或 self_healing_click
3. 加入详细的 try-except + 截图
4. 使用稳定定位器
只输出完整可运行的 Python 代码,不要解释。"""
)
# Reviewer Agent
reviewer_prompt = ChatPromptTemplate.from_template(
"""你是一位严苛的测试代码 Reviewer。
代码:{code}
执行结果:{execution_result}
请从以下维度评审并给出改进建议:
- 代码规范性
- 健壮性(错误处理)
- 定位器稳定性
- 是否需要优化"""
)
2. 使用 LangGraph 构建多 Agent 工作流(2026 推荐方式)
Python
from langgraph.graph import StateGraph, END
from typing import TypedDict
class TestState(TypedDict):
input: str
plan: str
code: str
execution_result: str
review_feedback: str
final_code: str
def planner_node(state: TestState):
response = llm.invoke(planner_prompt.format(input=state["input"]))
state["plan"] = response.content
return state
def coder_node(state: TestState):
response = llm.invoke(coder_prompt.format(plan=state["plan"]))
state["code"] = response.content
return state
def executor_node(state: TestState):
result = execute_playwright_test(state["code"]) # 使用前几期定义的 tool
state["execution_result"] = result
return state
def reviewer_node(state: TestState):
response = llm.invoke(reviewer_prompt.format(
code=state["code"],
execution_result=state["execution_result"]
))
state["review_feedback"] = response.content
# 如果需要优化,可返回 coder_node
if "需要优化" in response.content:
return coder_node(state)
state["final_code"] = state["code"]
return state
# 构建工作流
workflow = StateGraph(TestState)
workflow.add_node("planner", planner_node)
workflow.add_node("coder", coder_node)
workflow.add_node("executor", executor_node)
workflow.add_node("reviewer", reviewer_node)
workflow.set_entry_point("planner")
workflow.add_edge("planner", "coder")
workflow.add_edge("coder", "executor")
workflow.add_edge("executor", "reviewer")
workflow.add_edge("reviewer", END)
app = workflow.compile()
使用示例:
Python
result = app.invoke({"input": "测试电商网站完整下单流程:登录 → 加入购物车 → 结算 → 支付"})
print(result["final_code"])
四、常见报错及解决方案(实战总结)
- "TimeoutError: waiting for selector" 解决:加强 page.wait_for_load_state("networkidle") + 使用 self_healing_click
- "Playwright code execution failed: No module named 'playwright'" 解决:在 Executor 中动态安装或确保虚拟环境一致
- Agent 生成代码使用 XPath 或 脆弱的 CSS 选择器 解决:在 Coder Prompt 中强约束:“必须优先使用 getByRole、getByLabel、getByTestId”
- Reviewer Agent 一直循环优化(死循环) 解决:添加最大迭代次数(max_iterations=3),或在 Reviewer Prompt 中加入“如果达到可接受标准则停止”
- Ollama 显存不足 / 推理过慢 解决:使用更小模型(qwen2.5:7b)做 Coder,llava 用于视觉;或升级硬件
- 截图路径不存在 解决:在 BasePage 初始化时自动创建 os.makedirs("screenshots", exist_ok=True)
- 多 Agent 协作时上下文丢失 解决:使用 LangGraph 的持久化状态或手动传递关键信息
- 生成的代码缩进错误或语法问题 解决:在 Executor 执行前增加代码格式化(使用 black 库)或让 Reviewer 重点检查语法
五、生产落地建议
- 将工作流封装成 Web 服务(FastAPI)
- 集成 Allure 报告 + 测试管理平台(TestRail / Xray)
- 核心流程固定人工规则 + AI 自愈混合使用
- 定期收集失败案例,反馈优化 Agent Prompt
六、今日感悟
从单 Agent 到多 Agent 协作,我深刻体会到:构建 AI 测试平台的核心不是单个模型,而是合理的 Agent 分工和 Review 机制。这套系统已经接近生产可用,极大降低了测试脚本的维护成本。
下一期预告(AI Web UI 自动化专栏 #04): AI 自动化测试平台 Web 界面实战(FastAPI + React/Vue 简单前端 + 一键生成执行测试)
更多推荐


所有评论(0)