1. 引言:GUI Agent 的范式转移
2025-2026 年,AI Agent 领域最热的方向之一是 GUI Agent——让 AI 像人类一样操作图形界面。从 OpenAI 的 Computer Use 到 Anthropic 的 Claude Computer Use,主流方案都走"截图 → 多模态模型理解 → 模拟鼠标键盘"的路线。
这条路有一个根本问题:太重了。
每次操作都要截图、传给多模态模型、等待推理、再模拟操作。延迟高、资源消耗大、还容易因为截图分辨率或 UI 变化而失败。
阿里巴巴在 2025 年 9 月开源的 Page-Agent 提出了一个截然不同的思路:既然 AI 要操作的是网页,为什么不直接让 AI 住在网页里?
Page-Agent 是一个纯前端 JavaScript GUI Agent 框架。它不需要浏览器扩展、不需要 Python 后端、不需要 Playwright/Selenium、不需要截图——只需要一行 <script> 标签,就能让任何网页具备 AI Agent 能力。截至 2026 年 10 月,该项目在 GitHub 上已突破 29,000 Star,成为最受关注的 GUI Agent 项目之一。
2. 核心技术:DOM 脱水如何改变网页自动化
2.1 什么是"DOM 脱水"?
Page-Agent 的核心创新是其 DOM 脱水(DOM Dehydration) 技术。简单来说,就是把网页的 DOM 结构"脱水"成纯文本表示,去掉所有视觉噪声,只保留 AI 需要理解的语义信息。
传统 GUI Agent 的工作流程:
截图 → 多模态模型识别 UI 元素 → 坐标定位 → 模拟点击
Page-Agent 的工作流程:
DOM 脱水 → 文本化 UI 结构 → LLM 理解语义 → 直接操作 DOM
这意味着 Page-Agent 不需要"看"网页,它直接"读"网页的结构。就像一个盲人程序员通过读代码来操作电脑,而不是通过看屏幕。
2.2 DOM 脱水的具体过程
DOM 脱水包含几个关键步骤:
- 元素过滤:移除不可见元素、装饰性元素、纯样式元素
- 文本提取:保留有意义的文本内容(按钮文字、标签、输入框 placeholder)
- 结构简化:将深层嵌套的 DOM 树压缩为扁平化的语义表示
- 交互标注:标记可交互元素(按钮、链接、输入框、下拉菜单)
脱水后的 DOM 表示类似这样:
[button] "登录"
[text input] "搜索..." placeholder="请输入关键词"
[link] "首页" href="/"
[select] 排序方式: [option] 最新 [option] 最热 [option] 评分
[checkbox] "记住我"
这种文本表示体积只有原始 DOM 的 1/10 到 1/50,LLM 可以快速理解并生成操作指令。
2.3 与传统方案的本质区别
| 维度 | Selenium/Playwright | Computer Use (截图) | Page-Agent (DOM 脱水) |
|---|---|---|---|
| 运行位置 | 外部进程控制浏览器 | 外部进程 + 截图 | 页面内 JavaScript |
| 理解方式 | 硬编码选择器 | 多模态视觉理解 | 文本化 DOM 语义 |
| 延迟 | 低(直接操作) | 高(截图+推理) | 中(DOM 解析+推理) |
| 跨域能力 | 受限于同源策略 | 无限制 | 受限于同源策略 |
| 部署复杂度 | 需要 WebDriver | 需要后端服务 | 一行 script 标签 |
| 动态内容 | 需要等待策略 | 需要重新截图 | 实时 DOM 监听 |
Page-Agent 的优势在于零部署成本和实时响应。它不需要额外的后端服务,不需要截图传输,直接在用户浏览器里完成所有工作。
3. 实测体验:多场景操作效果展示
3.1 电商网站:自动搜索与筛选
在电商网站上,Page-Agent 可以完成复杂的搜索和筛选操作:
import { PageAgent } from 'page-agent'
const agent = new PageAgent({
model: 'qwen3.5-plus',
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
apiKey: 'your-api-key',
language: 'zh-CN',
})
// 一句话完成:搜索、筛选价格区间、按销量排序
await agent.execute('搜索"机械键盘",筛选价格 200-500 元,按销量从高到低排序')
Page-Agent 会自动: 1. 找到搜索框并输入"机械键盘" 2. 点击搜索按钮 3. 找到价格筛选控件,设置 200-500 元区间 4. 找到排序下拉菜单,选择"销量排序"
整个过程无需手动编写任何 CSS 选择器或 XPath。
3.2 表单填写:ERP/CRM 系统自动化
企业内部系统(ERP、CRM、OA)通常有复杂的表单,Page-Agent 可以大幅简化操作:
// 填写客户信息表单
await agent.execute(`
填写以下客户信息:
- 公司名称:TechXArtisan
- 联系人:Kevin
- 邮箱:kevin@example.com
- 电话:13800138000
- 客户等级:VIP
- 备注:来自官网咨询
然后点击"保存"按钮
`)
对于动态加载的表单字段(如级联选择器),Page-Agent 会等待元素出现后再操作,避免传统自动化中常见的"元素未找到"错误。
3.3 后台管理系统:批量操作
在后台管理系统中,Page-Agent 可以执行批量操作:
// 批量审核用户
await agent.execute(`
在用户管理页面:
1. 找到所有状态为"待审核"的用户
2. 勾选这些用户
3. 点击"批量通过"按钮
4. 在确认弹窗中点击"确定"
`)
3.4 性能对比
在相同任务下,Page-Agent 与传统方案的性能对比:
| 指标 | Playwright + GPT-4V | Page-Agent + Qwen3.5 |
|---|---|---|
| 单次操作延迟 | 3-5 秒(截图+推理) | 1-2 秒(DOM 解析+推理) |
| 带宽消耗 | 高(传输截图) | 低(传输文本) |
| 内存占用 | 高(浏览器实例) | 低(页面内 JS) |
| 并发能力 | 受限于浏览器实例数 | 理论上无限制 |
4. 开发指南:从集成到自定义
4.1 一行代码快速体验
最快的体验方式是直接引入 Demo CDN:
<!DOCTYPE html>
<html>
<head>
<title>Page-Agent Demo</title>
</head>
<body>
<h1>我的网页</h1>
<button id="btn">点击我</button>
<!-- 一行代码集成 -->
<script
src="https://cdn.jsdelivr.net/npm/page-agent@1.12.4/dist/iife/page-agent.demo.js"
crossorigin="anonymous"
></script>
</body>
</html>
打开页面后,你会看到一个浮动的 Agent 对话框,可以直接输入自然语言指令。
注意:Demo CDN 使用的是免费的测试 LLM API,仅用于技术评估,不建议用于生产环境。
4.2 NPM 安装与自定义 LLM
生产环境建议使用 NPM 安装,并配置自己的 LLM:
npm install page-agent
import { PageAgent } from 'page-agent'
const agent = new PageAgent({
// 支持 OpenAI 兼容的 API
model: 'qwen3.5-plus',
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
apiKey: 'your-api-key',
// 语言设置(影响 prompt 语言)
language: 'zh-CN',
// 可选:自定义 DOM 脱水规则
domRules: {
// 忽略某些元素
ignoreSelectors: ['.no-agent', '[data-agent-ignore]'],
// 标记特殊元素
customAttributes: ['data-action'],
},
})
// 执行操作
await agent.execute('点击登录按钮')
// 获取页面状态
const state = await agent.getPageState()
console.log(state)
// 监听操作事件
agent.on('action:start', (action) => {
console.log('开始执行:', action)
})
agent.on('action:complete', (action) => {
console.log('执行完成:', action)
})
4.3 与 React/Vue 集成
React 集成示例:
import { useEffect, useRef } from 'react'
import { PageAgent } from 'page-agent'
function MyComponent() {
const agentRef = useRef(null)
useEffect(() => {
agentRef.current = new PageAgent({
model: 'qwen3.5-plus',
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
apiKey: import.meta.env.VITE_DASHSCOPE_KEY,
language: 'zh-CN',
})
return () => {
agentRef.current?.destroy()
}
}, [])
const handleCommand = async (command) => {
await agentRef.current.execute(command)
}
return (
<div>
<button onClick={() => handleCommand('点击提交按钮')}>
自动提交
</button>
{/* 你的表单内容 */}
</div>
)
}
Vue 3 集成示例:
<template>
<div>
<button @click="executeCommand('点击提交按钮')">
自动提交
</button>
<!-- 你的表单内容 -->
</div>
</template>
<script setup>
import { onMounted, onUnmounted, ref } from 'vue'
import { PageAgent } from 'page-agent'
const agent = ref(null)
onMounted(() => {
agent.value = new PageAgent({
model: 'qwen3.5-plus',
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
apiKey: import.meta.env.VITE_DASHSCOPE_KEY,
language: 'zh-CN',
})
})
onUnmounted(() => {
agent.value?.destroy()
})
const executeCommand = async (command) => {
await agent.value.execute(command)
}
</script>
4.4 自定义 Agent 技能
Page-Agent 支持自定义技能(Skills),让 Agent 具备特定领域的操作能力:
import { PageAgent, defineSkill } from 'page-agent'
// 定义一个"电商搜索"技能
const ecommerceSearch = defineSkill({
name: 'ecommerce-search',
description: '在电商网站搜索商品并筛选',
parameters: {
keyword: { type: 'string', description: '搜索关键词' },
minPrice: { type: 'number', description: '最低价格' },
maxPrice: { type: 'number', description: '最高价格' },
sortBy: { type: 'string', enum: ['sales', 'price', 'date'] },
},
execute: async (agent, params) => {
await agent.execute(`搜索"${params.keyword}"`)
if (params.minPrice || params.maxPrice) {
const priceRange = `${params.minPrice || 0}-${params.maxPrice || '不限'}`
await agent.execute(`设置价格区间为 ${priceRange} 元`)
}
if (params.sortBy) {
const sortMap = {
sales: '按销量排序',
price: '按价格排序',
date: '按上架时间排序',
}
await agent.execute(sortMap[params.sortBy])
}
},
})
const agent = new PageAgent({
model: 'qwen3.5-plus',
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
apiKey: 'your-api-key',
skills: [ecommerceSearch],
})
// 使用技能
await agent.useSkill('ecommerce-search', {
keyword: '机械键盘',
minPrice: 200,
maxPrice: 500,
sortBy: 'sales',
})
5. 应用前景:谁最需要 Page-Agent
5.1 SaaS 产品 AI 助手
SaaS 产品可以通过 Page-Agent 快速添加 AI 助手功能:
// 在你的 SaaS 产品中嵌入 AI 助手
import { PageAgent } from 'page-agent'
const assistant = new PageAgent({
model: 'gpt-4o-mini',
baseURL: 'https://api.openai.com/v1',
apiKey: 'your-key',
language: 'zh-CN',
})
// 用户可以用自然语言操作你的产品
// "帮我创建一个新项目,命名为 Q4 营销计划"
// "把所有未完成的任务分配给张三"
优势: - 无需修改后端 API - 无需编写复杂的指令解析逻辑 - 用户学习成本为零(直接用自然语言)
5.2 企业内部系统自动化
ERP、CRM、OA 等企业内部系统通常操作复杂,Page-Agent 可以:
- 简化培训:新员工不需要学习复杂的操作流程,直接告诉 AI 要做什么
- 批量操作:一句话完成原本需要数十次点击的批量任务
- 跨系统协作:配合 Chrome 扩展,可以在多个系统间自动传递数据
5.3 无障碍访问增强
Page-Agent 可以让视障用户通过语音指令操作网页:
// 结合 Web Speech API 实现语音控制
const recognition = new webkitSpeechRecognition()
recognition.onresult = async (event) => {
const command = event.results[0][0].transcript
await agent.execute(command)
}
recognition.start()
5.4 测试自动化
虽然 Page-Agent 主要面向客户端增强,但也可以用于 E2E 测试:
// 用自然语言编写测试用例
test('用户登录流程', async () => {
await agent.execute('在用户名输入框输入 testuser')
await agent.execute('在密码输入框输入 password123')
await agent.execute('点击登录按钮')
await agent.execute('等待页面跳转到仪表盘')
// 验证结果
const state = await agent.getPageState()
expect(state.url).toContain('/dashboard')
})
6. 安全性与局限性
6.1 安全性考虑
跨域问题:Page-Agent 运行在页面内,受同源策略限制,只能操作当前域名的页面。这意味着它无法跨域操作 iframe 中的第三方内容。
敏感操作防护:建议在生产环境中添加操作白名单:
const agent = new PageAgent({
// ...
allowedActions: ['click', 'type', 'select'],
blockedSelectors: ['[data-sensitive]', '.payment-form'],
requireConfirmation: ['delete', 'submit', 'payment'],
})
API Key 安全:前端暴露 API Key 存在风险,建议: - 使用代理服务器中转 LLM 请求 - 设置 API Key 的调用频率限制 - 使用短期 Token 而非长期 Key
6.2 当前技术局限
- 动态渲染内容:对于 SPA 或动态加载的内容,需要等待 DOM 稳定后才能操作
- Canvas/WebGL:无法操作 Canvas 或 WebGL 渲染的内容
- Shadow DOM:对 Shadow DOM 的支持有限(正在改进中)
- 复杂交互:拖拽、手势等复杂交互的支持还在开发中
- LLM 依赖:操作准确性依赖 LLM 的理解能力,复杂指令可能失败
6.3 与同类方案对比
| 方案 | 类型 | 优势 | 劣势 |
|---|---|---|---|
| Page-Agent | 前端 JS | 零部署、低延迟 | 受同源策略限制 |
| browser-use | Python 后端 | 功能全面 | 需要后端服务 |
| Playwright | 浏览器自动化 | 稳定可靠 | 需要编写选择器 |
| Selenium | 浏览器自动化 | 生态成熟 | 配置复杂 |
| Computer Use | 多模态 AI | 通用性强 | 延迟高、成本高 |
7. 总结与思考
Page-Agent 代表了 GUI Agent 的一个重要方向:让 AI 住在网页里,而不是从外部操控网页。
这种思路的优势显而易见: - 零部署成本:一行 script 标签即可集成 - 低延迟:无需截图传输,直接操作 DOM - 高并发:不需要浏览器实例,理论上可以无限并发 - 实时响应:DOM 变化立即感知,无需重新截图
但也存在明显的局限: - 同源策略限制:无法跨域操作 - LLM 依赖:操作准确性受 LLM 能力限制 - 安全风险:前端暴露 API Key 需要额外防护
对于 SaaS 产品、企业内部系统、无障碍访问等场景,Page-Agent 提供了一个轻量级、低成本的 AI Agent 解决方案。它不是要取代 Selenium 或 Playwright,而是填补了"页面内 AI 自动化"这个空白。
随着 LLM 能力的持续提升和浏览器 API 的不断完善,Page-Agent 这类"住在网页里的 AI"将会越来越强大。未来的网页可能不再是"给人用的界面",而是"人和 AI 共用的界面"。
项目地址:https://github.com/alibaba/page-agent
在线 Demo:https://alibaba.github.io/page-agent/
FAQ
1. Page-Agent 是什么?与 ChatGPT Computer Use 有什么区别?
Page-Agent 是阿里巴巴开源的纯前端 JavaScript GUI Agent 框架,让 AI 直接在网页内操作 DOM。与 Computer Use 的最大区别是:Computer Use 通过截图+多模态模型理解屏幕内容,然后模拟鼠标键盘操作;Page-Agent 直接读取 DOM 结构,用文本化表示让 LLM 理解页面,然后直接操作 DOM。前者像"远程桌面",后者像"住在网页里的 AI"。
2. Page-Agent 需要后端支持吗?可以完全在浏览器端运行吗?
Page-Agent 本身是纯前端库,可以在浏览器端完全运行。但它需要调用 LLM API 来理解用户指令和生成操作计划,所以需要一个可访问的 LLM 服务(可以是云端 API,也可以是本地部署的模型)。除了 LLM 调用,不需要其他后端服务。
3. 如何将 Page-Agent 集成到我的网站?需要改动现有代码吗?
最简单的集成方式是在 HTML 中添加一行 <script> 标签。如果要用自己的 LLM,可以通过 NPM 安装并初始化 PageAgent 实例。通常不需要改动现有代码,Page-Agent 会自动分析当前页面的 DOM 结构。但如果需要自定义行为(如忽略某些元素、添加自定义技能),需要编写少量配置代码。
4. Page-Agent 支持哪些浏览器?IE 可以用吗?
Page-Agent 支持所有现代浏览器(Chrome、Firefox、Safari、Edge 的最新版本)。由于使用了现代 JavaScript 特性(如 ES Modules、async/await),不支持 IE 浏览器。如果需要支持旧浏览器,可以使用 Babel 转译,但官方不保证兼容性。
5. Page-Agent 的安全性如何?会不会被恶意利用?
Page-Agent 受同源策略限制,只能操作当前域名的页面,无法跨域攻击。但需要注意:前端暴露 API Key 存在风险,建议使用代理服务器中转请求。对于敏感操作(如删除、支付),建议添加确认机制。Page-Agent 本身不会自动执行任何操作,所有指令都需要用户主动输入或通过代码调用。