定位:LLM + Playwright 浏览器 Agent,不用手写 XPath/CSS 选择器,用自然语言写测试步骤,自动完成 E2E 操作、页面断言、截图取证。 环境要求:Python ≥3.11;适合:冒烟测试、探索性测试、业务用例原型;不适合高可靠高频回归流水线。
整体架构
plaintext
自然语言测试用例文本
↓
browser‑use Agent(LLM)
↓
Playwright CDP浏览器驱动
↓
被测Web页面
↓
Agent视觉+DOM解析 → 执行操作、断言判断
↓
输出 PASS/FAIL + 操作日志 + 截图证据
最小可运行 Demo
python
运行
import asyncio
from dotenv import load_dotenv
from browser_use import Agent, Browser, BrowserConfig
from langchain_openai import ChatOpenAI
load_dotenv()
browser = Browser(
config=BrowserConfig(
headless=False,
viewport_width=1440,
viewport_height=900,
)
)
test_case = """
测试目标:验证百度搜索功能
1. 访问 https://www.baidu.com
2. 在搜索框输入 browser‑use UI自动化测试
3. 点击搜索按钮
4. 断言:页面出现搜索结果列表,页面标题包含browser‑use
5. 如果没有出现搜索结果,标记测试失败,说明失败现象
输出格式:测试结果(PASS/FAIL) + 简要测试结论
"""
async def run_ui_test():
llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = Agent(
task=test_case,
llm=llm,
browser=browser,
max_steps=20,
)
history = await agent.run()
result = history.final_result()
print("测试输出:", result)
# 保存截图
for step in history.steps:
if step.screenshot:
with open(f"test_screenshot_{step.index}.png", "wb") as f:
f.write(step.screenshot)
await browser.close()
return result
if __name__ == "__main__":
asyncio.run(run_ui_test())
关键参数说明
temperature=0:测试场景必须设置,减少大模型随机性max_steps:限制最大操作步数,防止 Agent 死循环- 用例内显式写明断言规则,明确什么算 PASS、什么算 FAIL
- 自动保存截图,作为缺陷证据
pytest 工程化封装 test_ui.py
python
运行
import asyncio
import pytest
from dotenv import load_dotenv
from browser_use import Agent, Browser, BrowserConfig
from langchain_openai import ChatOpenAI
load_dotenv()
@pytest.fixture(scope="function")
async def browser_fixture():
browser = Browser(config=BrowserConfig(headless=False))
yield browser
await browser.close()
test_cases = [
(
"百度搜索冒烟用例",
"""
访问https://www.baidu.com
输入"AI自动化测试",执行搜索
断言:页面展示多条搜索结果。
返回 PASS 或者 FAIL,附带失败原因
"""
),
(
"百度首页元素校验",
"""
打开百度首页
断言页面存在搜索输入框、百度logo
返回 PASS 或者 FAIL,附带失败原因
"""
)
]
@pytest.mark.asyncio
@pytest.mark.parametrize("case_name,task", test_cases)
async def test_natural_language_ui(case_name, task, browser_fixture):
llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = Agent(
task=task,
llm=llm,
browser=browser_fixture,
max_steps=15
)
history = await agent.run()
output = history.final_result()
print(f"\n【{case_name}】结果:{output}")
assert "PASS" in output, f"测试用例 {case_name} 失败:{output}"
执行命令:
bash
pytest test_ui.py -v
✅ 高质量自然语言用例模板
plaintext
【测试场景】登录页面正常登录
前置:访问登录页面 http://xxx/login
步骤:
1. 在用户名输入框输入 admin
2. 在密码框输入 123456
3. 点击登录按钮
断言规则:
- 登录成功:页面跳转首页,出现“欢迎admin”文字 → PASS
- 页面停留在登录页、出现错误提示 → FAIL,记录提示文本
输出:只输出:结果(PASS/FAIL) + 现象描述
最大操作步骤:12步
禁止执行网站以外域名,禁止点击广告弹窗
❌ 反例:去登录系统,看看能不能登录成功,描述模糊,AI 判断不可控。
稳定性增强配置
python
运行
agent = Agent(
task=test_case,
llm=llm,
browser=browser,
max_steps=20,
allowed_domains=["your‑test‑domain.com"], # 限制访问域名,避免误点广告跳转
use_vision=True, # 开启视觉理解,复杂UI表现更好
)
局限性 & 落地建议
- LLM 随机性:会出现选错元素,不适合核心强回归流水线;适合冒烟、探索测试、原型验证。
- 弹窗广告会干扰执行,用
allowed_domains+ 用例指令规避。 - 每次操作调用大模型 API,速度慢,存在 Token 成本。
- 推荐混合方案:核心业务流程硬编码 Playwright;次要 / 新页面用 browser‑use 做冒烟。
实用进阶点
- Cookie 复用登录态
python
运行
context = await browser.get_context()
cookies = await context.cookies()
# 保存cookies,下一轮测试加载复用登录态
await context.add_cookies(cookies)
- Web‑UI 调试工具:browser‑use web‑ui 网页录入自然语言用例,可视化调试,调试完成复制 task 到 pytest 脚本。
- 模型替换:可接入 DeepSeek‑V3、Qwen‑VL 开源模型,降低 API 开销,但稳定性会下降。
- 报告扩展:解析
history对象,拿到每一步操作、截图、思考过程,对接 Allure 生成完整测试报告。

7955

被折叠的 条评论
为什么被折叠?



