在 AI 大模型飞速发展的今天,浏览器自动化领域正迎来一场深刻的变革。本文将系统介绍 Page Agent 的原理与实践,带你感受“用自然语言做自动化测试”的全新范式。
软件测试行业经历了从纯手工测试 → 脚本化自动化测试 → 数据驱动/关键字驱动 → AI 辅助测试的演进。Selenium、Appium、Playwright 等工具的出现,让“写脚本代替人点按钮”成为主流实践,自动化覆盖率也随之大幅提升。
然而,随着产品迭代速度越来越快,测试工程师们发现:自动化本身也越来越难维护。
|
|
|
| 脚本维护成本高 |
UI 稍有变动(元素 ID、布局调整),大量脚本需要同步修改
|
| 学习门槛不低 |
Playwright/Selenium API 需要专门学习,非开发人员难以上手
|
| 用例描述与执行割裂 |
测试用例写在 Excel/Xmind,执行代码写在 py/ts 文件,两者长期不一致
|
| 动态页面识别难 |
异步加载、iframe 嵌套、Shadow DOM 等场景让元素定位变得脆弱
|
| 测试意图难以表达 |
代码表达的是“怎么做”,而非“做什么”,用例可读性差
|
| 回归效率低 |
每次版本迭代都要重新录制/修改脚本,成本与收益失衡
|
一句话总结:传统自动化测试“写得快、坏得也快”,维护成本已经超越了它带来的收益。今天介绍一款可以自动化操作的工具Page Agent,先介绍Page Agent的原理,再通过实践,以一个日报系统日报页面正常的业务流程为例,展示如何通过自然语言开展自动化流程。
Page Agent(页面智能体)是一种基于大语言模型(LLM)驱动的浏览器自动化方案。它的核心思想是:
用自然语言描述你想做的事,让 AI 自主规划操作步骤并在真实浏览器中执行。
你不再需要写 page.locator('#submit').click(),而是直接说:
"打开日报系统,新增一条今日工作内容为'完成登录模块自动化测试'的日报,然后提交。"
Page Agent 会理解你的意图、自主感知当前页面结构,并按步骤完成操作。
|
|
传统自动化(Playwright/Selenium)
|
|
|
|
|
|
|
|
CSS selector / XPath / 属性
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Page Agent 感知当前页面(截图 / DOM)
LLM 决策下一步操作(点击 / 输入 / 滚动 / 导航)
截图视觉理解:对当前页面截图,交给具备视觉能力的 LLM(如 GPT-4V、Claude 3)识别界面元素、布局和文字内容。
DOM/Accessibility Tree 解析:提取页面的可访问性树(AX Tree),以结构化文本的形式描述页面中的可交互元素。
两种方式互补:视觉能处理纯图形界面,DOM 解析更精准定位元素。
Page Agent 通常采用 ReAct(Reason + Act)框架:
Thought: 当前页面有一个"新增"按钮,我需要点击它来创建新日报
Observation: 弹出了一个表单,包含"标题"和"内容"两个输入框
Thought: 需要在"内容"框中输入今日工作内容
Action: fill("内容", "完成登录模块自动化测试")
这种“思考-行动-观察”循环,让 Agent 能够处理多步骤、有条件分支的复杂任务。
Page Agent 通过工具调用的形式控制浏览器,常见工具包括:
|
|
|
navigate(url) |
|
click(element) |
|
fill(element, text) |
|
screenshot() |
|
get_dom() |
|
scroll(direction) |
|
assert(condition) |
|
其中,MCP(Model Context Protocol)是当前主流的工具协议规范,由 Anthropic 推出,已成为 AI Agent 与外部工具交互的行业标准之一。
工具调用 (MCP / Function Call)
Browser Driver(Playwright / Chrome DevTools)
|
|
|
| 任务规划器 |
|
| LLM 推理引擎 |
|
| 记忆/上下文管理 |
|
| Browser Driver |
|
| 截图模块 |
|
| DOM 解析模块 |
|
| 操作执行模块 |
|
该方式规避谷歌应用商店无法访问问题,100%适配国内网络,步骤如下:
1下载官方离线包:前往 Page Agent GitHub Releases,下载最新版 Chrome 扩展 CRX/解压包;也可通过国内镜像站获取完整插件包。
2开启Chrome开发者模式:打开Chrome浏览器,地址栏输入 chrome://extensions/,开启页面右上角开发者模式。
3安装插件:将下载的 .crx 文件直接拖拽至扩展页面,弹窗点击「添加扩展程序」;若提示程序包无效,将后缀改为 .zip 解压,选择「加载已解压的扩展程序」,选中解压文件夹即可完成安装。
4验证安装:插件列表出现「Page Agent Ext」即为安装成功,固定插件至浏览器顶部方便使用。
网络通畅可直接访问官方应用商店安装,支持自动更新,插件官方唯一地址:
https://chrome.google.com/webstore/detail/page-agent-ext/akldabonmimlicnjlflnapfeklbfemhj
这种方式可以实现对话描述,提出你的需求,page agent 对你的需求进行分析并操作浏览器
下面以一个典型的日报系统(Web 端)为例,演示 Page Agent 如何完成增删改查四个核心操作。
⚠️ 注意:以下源码基于 browser-use 库(Python),日报系统 URL 请替换为你的实际地址。
登录用户名密码:xxxxx xxxx ,登录成功后 报告管理 -日报管理 ,新增一条日报(其中项目名称是下拉列表选择一条即可,项目名称选择其他,作业时长8,输入当日总结内容,输入明日计划内容,点击保存保存成功),修改日报,删除日报 在一条记录上操作 进行测试,其中项目名称是下拉列表选择一条即可,全部操作完成后 生成playwright 自动化脚本
此时Page Agent 会根据窗口中的文字要求进行操作,过程如下:
5.2.2 页面感知 Page Agent 读取当前页面 DOM:
# ==========================================
# 按顺序执行:新增 → 查询 → 修改 → 删除
# ==========================================
from playwright.async_api import async_playwright
asyncwith async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto('http://47.95.2.202/report/login?redirect=%2Findex')
await page.fill('input[placeholder="账号"]', 'xxxx')
await page.fill('input[placeholder="密码"]', 'xxxx')
await page.click('button[type="button"]')
await page.wait_for_load_state('networkidle')
await page.click('li[role="menuitem"]:has-text("报告管理")')
await page.click('li[role="menuitem"]:has-text("日报管理")')
await page.wait_for_load_state('networkidle')
await page.click('button:has-text("新增")')
await page.wait_for_timeout(500)
await page.click('.el-select-dropdown__item:has-text("其他")')
await page.fill('input[role="spinbutton"]', '8')
await page.fill('textarea[placeholder="请输入当日总结"]', '今日完成系统功能测试,包括日报新增、修改、删除操作验证')
await page.fill('textarea[placeholder="请输入明日计划"]', '继续进行系统功能优化和测试验证')
await page.click('button:has-text("保存")')
await page.wait_for_timeout(1000)
await page.click('button:has-text("修改")')
await page.wait_for_timeout(500)
await page.click('.el-select .el-input__inner')
await page.click('.el-select-dropdown__item:has-text("弓井下 - 资源数字化管理系统")')
await page.fill('input[role="spinbutton"]', '6')
await page.click('button:has-text("保存")')
await page.wait_for_timeout(1000)
await page.click('button:has-text("删除")')
await page.wait_for_timeout(500)
await page.click('.el-message-box__btns button:first-child')
await page.wait_for_timeout(1000)
if __name__ == '__main__':
降低自动化门槛:测试人员用自然语言描述用例,无需深入掌握 Playwright API
提升探索测试效率:AI 能自主发现可交互元素,覆盖人工容易遗漏的路径
减少脚本维护负担:页面 UI 小幅变更时,LLM 能自适应调整,不需立即改脚本
加速冒烟测试:新功能上线后,快速用自然语言描述验收标准,几分钟完成验证
|
|
|
| 稳定性不如传统脚本 |
LLM 每次决策存在随机性,同一任务多次执行可能路径不同,需要多次对话,关键过程描述的越精准,就不容易出错
|
|
|
生成的脚本没有把每一个操作,尤其详细操作定位到,需要后续自行补充
|
|
|
上下文之间,缺少理解性,与豆包和workbuddy 之间有很大区别,需要一次性把内容说清楚
|
......
本文节选自第九十一期《51测试天地》
原创文章
《Page Agent:让AI替你点网页-自动化测试的新范式》
文章后续为大家详细讲解了:
适用场景建议与未来展望
想继续阅读全文
或查看更多《51测试天地》的原创文章
请点击下方 阅读原文或扫描二维码 查看
声明:本文为51Testing软件测试网 M&T. 用户投稿内容,该用户投稿时已经承诺独立承担涉及知识产权的相关法律责任,并且已经向51Testing承诺此文并无抄袭内容。发布本文的用途仅仅为学习交流,不做任何商用,未经授权请勿转载,否则作者和51Testing有权追究责任。如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:editor@51testing.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。