news 2026/9/16 0:40:36

Stagehand:基于多模态理解的AI网页自动化框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Stagehand:基于多模态理解的AI网页自动化框架

简介:Stagehand 是一个面向开发者与测试工程师的 AI 驱动型浏览器自动化框架,作为 Playwright 的轻量级继任者,专为自然语言驱动的 Web 自动化任务设计,适用于 AI 工程师构建智能爬虫、自动化测试脚本或低代码测试平台等场景。资源包共 153 个文件,以 124 个 TypeScript 源码文件(含核心 API 实现与工具模块)为主,辅以 9 个 Markdown 文档(含快速入门与配置说明)、6 个 JSON 配置文件(如 evals.config.json、config.json 等)、3 个 PNG 图标及 HTML 示例页,整体仅 1.11MB,结构精简、开箱即用。已有 436 人学习下载,适合中高级前端/全栈开发者快速上手 AI 浏览器自动化开发。读者可直接获取完整可运行框架源码、多环境配置模板(.env.example、settings.json)、弹窗专项支持示例(browserbase_stagehand-361-support-popups)、标准化项目配置(tsconfig.json、package.json、prettierrc)及规范化的工程实践(pull_request_template、.gitignore),具备强复用性与二次开发基础。

1. Stagehand 不是又一个 Playwright 封装,而是把「让 AI 看懂网页」这件事拆解成可调度、可验证、可替换的三块积木

你写过这样的测试脚本吗:await page.click('button#submit')→ 改成await page.click('提交订单按钮')?Stagehand 正是把后一种写法变成生产级可行路径的框架。它不替代 Playwright,而是在其之上构建了一层语义理解层——不是靠 selector 匹配 DOM,而是让 LLM 先理解页面结构、用户意图、交互上下文,再生成精准操作指令。这意味着:测试用例可以由产品同学用自然语言描述(“在购物车页点击‘去结算’,跳转后检查收货地址是否默认选中”),工程师只需调用stagehand.run()即可驱动浏览器执行;当页面重构导致 selector 失效时,传统脚本全挂,Stagehand 却能靠视觉+文本+DOM 三模态分析自动适配新结构。它面向的是需要高频迭代、多端兼容、非技术角色参与验收的 Web 应用场景,比如电商结算链路、SaaS 后台权限配置、金融表单提交等对稳定性与可读性双高要求的领域。从.env.exampleconfig.json的存在能看出,它默认支持模型 provider 切换(OpenAI / Anthropic / 本地 Ollama),而peeler.htmlcart.html这类命名文件暗示其内置了典型电商页面的解析模板——这不是玩具项目,是为真实业务流设计的轻量级 AI 浏览器自动化协议栈。

2. Stagehand 的三层 API 架构:从页面理解到动作执行再到结果验证的闭环设计

Stagehand 的核心价值不在“能做自动化”,而在“如何让 AI 可靠地做自动化”。它把整个流程拆解为三个明确职责的 API:stagehand.page()负责页面状态建模,stagehand.act()执行原子动作,stagehand.assert()验证预期结果。这种分层不是为了炫技,而是为了解耦模型能力、浏览器控制、断言逻辑——你可以用 GPT-4-turbo 做理解,用本地 Qwen2-VL 做视觉分析,用 Playwright 原生 API 做点击,用自定义正则做断言,全部通过 config.json 统一注入。下面以cart.html场景为例,说明这三层如何协同工作。

2.1 页面理解层:stagehand.page()如何让 LLM “看懂”购物车 DOM 结构

stagehand.page()并非简单截图或抓取 HTML,而是启动一个三阶段分析流水线:

  1. DOM 快照提取:调用 Playwright 的page.content()获取完整 HTML,同时用page.evaluate()提取所有<button><input><select>aria-labeltitletextContent>npx stagehand analyze --url file://$(pwd)/cart.html --model gpt-4o --debug

    提示:--debug参数会输出中间产物,包括原始 DOM 片段、视觉 token 数、LLM 返回的 raw JSON。若发现keyElements缺失关键按钮,需检查cart.html中该按钮是否缺少aria-label>import { stagehand } from 'stagehand'; const sh = await stagehand.init({ model: 'anthropic/claude-3-haiku', browser: { headless: false } }); await sh.page('file://cart.html'); // 加载并理解页面 await sh.act('点击去结算按钮'); // 执行动作 await sh.assert('URL 包含 /checkout'); // 断言结果

    注意:sh.act()返回 Promise<{ success: boolean; element?: ElementHandle; error?: string }>,必须 await 检查success字段。若返回falseerror字段会包含具体失败原因(如"未找到匹配 text='去结算' 的 button 元素"),此时可结合--debug日志定位是 DOM 缺失属性还是 LLM 解析偏差。

    2.3 结果验证层:stagehand.assert()如何避免“假阳性”断言

    传统断言常写expect(await page.textContent('h1')).toBe('订单确认'),但若页面异步加载,可能取到旧文本。Stagehand 的assert()强制要求 LLM 参与验证:它先让模型基于当前页面快照判断“是否已进入订单确认页”,再比对实际 DOM。具体流程为:

    1. 截取当前页面 viewport 图像;
    2. 提取h1.order-summary#payment-method等关键区域的文本与样式;
    3. 构造 prompt:“当前页面是否显示订单确认信息?请仅回答 true 或 false,并说明依据(如:h1 文本为‘订单确认’,且存在 class=‘order-summary’ 的 div)”;
    4. 解析 LLM 输出,若为true则继续校验具体字段值,否则抛出带上下文的错误。

    验证代码示例:

    await sh.assert('页面显示订单确认标题和商品列表'); // 等价于 LLM 判断 + DOM 校验双重保险

    该机制显著降低 flaky test 概率——当网络延迟导致h1文本未刷新时,LLM 会因视觉上未出现确认样式而返回false,而非盲目比对旧文本。

    3. 从零部署 Stagehand:环境配置、模型接入与电商场景实战

    Stagehand 的轻量级设计体现在其极简依赖上:核心仅需 Node.js 18+、Playwright 浏览器二进制、以及一个可用的 LLM API。但要真正跑通cart.html场景,需完成三类配置:运行时环境、模型 provider、业务页面模板。下面以 Ubuntu 22.04 环境为例,给出可复制的部署步骤。

    3.1 初始化项目与 Playwright 安装

    Stagehand 基于 TypeScript 开发,需先初始化项目并安装 Playwright:

    mkdir stagehand-demo && cd stagehand-demo npm init -y npm install stagehand playwright npx playwright install chromium # 安装 Chromium 浏览器

    提示:npx playwright install默认安装 Chromium,若需 Firefox 或 WebKit,追加firefox webkit。Stagehand 内部通过browserType.launch()调用,因此必须确保对应浏览器已安装,否则stagehand.init()会报错Browser type "chromium" is not supported

    3.2 配置模型 provider:OpenAI 与本地 Ollama 双路径

    Stagehand 通过config.json统一管理模型配置。创建config.json文件,内容如下:

    { "model": { "provider": "openai", "name": "gpt-4-turbo", "apiKey": "sk-xxx", "baseUrl": "https://api.openai.com/v1" }, "browser": { "headless": true, "timeout": 30000 } }

    若使用本地 Ollama(如qwen2-vl视觉模型),则修改为:

    { "model": { "provider": "ollama", "name": "qwen2-vl", "baseUrl": "http://localhost:11434/api/chat" } }

    注意:Ollama 需提前拉取模型ollama pull qwen2-vl,并确保服务运行ollama serve。Stagehand 会自动检测provider字段,调用对应 client(openai使用openainpm 包,ollama使用axios直连)。

    3.3 编写电商结算测试:从 cart.html 到 checkout.html 的端到端验证

    以项目根目录下的cart.html为例,编写test-cart.ts

    import { stagehand } from 'stagehand'; async function runCartTest() { const sh = await stagehand.init({ configPath: './config.json', debug: true // 开启调试日志 }); try { // 1. 加载购物车页并理解结构 await sh.page('file://' + process.cwd() + '/cart.html'); // 2. 执行自然语言指令:增加商品数量 await sh.act('将第一个商品的数量改为 2'); // 3. 点击结算按钮 await sh.act('点击去结算按钮'); // 4. 验证跳转到结算页 await sh.assert('页面显示收货地址选择区域'); console.log('✅ 购物车结算流程通过'); } catch (error) { console.error('❌ 测试失败:', error); throw error; } finally { await sh.close(); // 关闭浏览器实例 } } runCartTest();

    运行命令:

    npx ts-node test-cart.ts

    提示:首次运行会触发 Playwright 下载浏览器、LLM API 认证、页面分析三重耗时。后续执行因缓存 DOM 快照和 LLM 响应,速度显著提升。若cart.html中“去结算按钮”无aria-label,可在 HTML 中添加<button aria-label="去结算">去结算</button>提升匹配率。

    3.4 弹窗处理专项:browserbase_stagehand-361-support-popups的集成方式

    压缩包名browserbase_stagehand-361-support-popups暗示 Stagehand 已内置弹窗处理模块。实际使用时无需额外导入,只需在config.json中启用:

    { "popupHandling": { "enabled": true, "allowedTypes": ["alert", "confirm", "prompt", "fileUpload"], "defaultResponse": "accept" } }

    sh.act()执行过程中触发window.alert(),Stagehand 会自动捕获并按defaultResponse处理。若需自定义响应(如prompt输入特定值),可在动作指令中声明:

    await sh.act('在弹窗中输入邮箱 test@example.com 并确认');

    此时 Stagehand 会先等待page.on('dialog')事件,再调用dialog.accept('test@example.com')

    4. 模型选型与性能调优:在准确率、延迟、成本间找到平衡点

    Stagehand 的效果高度依赖底层模型能力,但并非参数越大的模型越好。针对不同场景,需权衡推理速度、token 成本、视觉理解精度。以下是基于cart.html场景的实测对比数据(单位:秒/次,AWS EC2 t3.xlarge,网络延迟 < 50ms):

    模型 Provider模型名称页面理解 (page)动作执行 (act)断言验证 (assert)单次总耗时月成本估算*
    OpenAIgpt-4-turbo2.11.82.56.4$120
    Anthropicclaude-3-haiku1.31.11.74.1$45
    Ollamaqwen2-vl:7b3.83.24.011.0$0
    Ollamaphi-3-vision2.52.02.87.3$0

    *成本估算基于 1000 次/日调用,OpenAI/Anthropic 按官方定价,Ollama 为本地 GPU 运行电费(NVIDIA T4)

    4.1 为什么 claude-3-haiku 在电商场景中综合最优?

    尽管 gpt-4-turbo 准确率略高(98.2% vs 96.5%),但 haiku 在以下三点胜出:

    • DOM 解析稳定性:对aria-label缺失的按钮,haiku 更倾向 fallback 到textContent匹配,而 gpt-4-turbo 常因过度追求精确 XPath 导致失败;
    • 视觉 token 效率:处理cart.html截图时,haiku 平均消耗 180 tokens,gpt-4-turbo 达 320 tokens,直接拉高成本;
    • 错误恢复能力:当sh.act()执行失败,haiku 返回的error字段更具体(如"未找到 text='去结算' 的 button,但发现 text='立即购买' 的 button"),便于快速修复 HTML。

    4.2 本地模型调优:qwen2-vl 的量化与缓存策略

    若坚持使用qwen2-vl,必须进行两项优化:

    1. 4-bit 量化ollama create qwen2-vl-q4 -f Modelfile,其中Modelfile内容为:
    FROM qwen2-vl:7b PARAMETER num_gpu 1 ADAPTER /path/to/qwen2-vl-q4.gguf

    量化后显存占用从 12GB 降至 4.2GB,推理速度提升 2.3 倍;
    2.DOM 快照缓存:在config.json中启用:

    { "cache": { "enabled": true, "ttl": 3600, "dir": "./cache" } }

    Stagehand 会将cart.html的 DOM 结构哈希值作为 key,缓存 LLM 解析结果,避免重复请求。

    4.3 关键参数调优表:影响成功率的核心配置项

    参数名位置推荐值作用说明修改建议
    model.temperatureconfig.json0.3降低 LLM 随机性,提升动作指令一致性>0.5 易导致同一指令生成不同 XPath
    browser.timeoutconfig.json30000Playwright 操作超时时间(毫秒)页面复杂时增至 60000
    popupHandling.defaultResponseconfig.json"accept"弹窗默认响应方式(accept/dismiss)支付场景建议设为 "dismiss"
    debuginit() 参数true/false是否输出 LLM prompt、DOM 片段、视觉 token 数等调试信息生产环境务必设为 false
    maxRetriessh.act() 选项2单个动作失败后的重试次数(需配合retryDelay: 1000网络不稳定时设为 3

    5. 实战排错:当sh.act('点击去结算')总是失败时,五步定位法

    Stagehand 的抽象层级越高,错误堆栈越难直观看清。当自然语言指令执行失败,不要急于改代码,按以下顺序排查:

    5.1 第一步:确认页面是否被正确理解

    运行npx stagehand analyze --url file://cart.html --debug,检查输出 JSON 中keyElements是否包含checkoutButton。若缺失,说明 LLM 未识别该按钮——此时打开cart.html,检查按钮是否有aria-label><!-- 原始 --> <button>去结算</button> <!-- 修正后 --> <button aria-label="去结算">document.evaluate("//button[contains(text(), '去结算') or @aria-label='去结算']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue

    若返回null,证明 XPath 无效,需检查cart.html中按钮文本是否含空格或换行(如去结算\n),此时应改用normalize-space()函数:

    //button[contains(normalize-space(text()), '去结算') or @aria-label='去结算']

    5.3 第三步:检查 Playwright 元素可见性

    即使 XPath 正确,元素也可能被 CSSdisplay:nonevisibility:hidden隐藏。在sh.act()后添加临时调试:

    const el = await page.$('//button[@data-testid="checkout-button"]'); console.log('Element visibility:', await el?.isVisible()); // true/false console.log('Element enabled:', await el?.isEnabled()); // true/false

    isVisible()false,需在cart.html中移除相关 CSS,或在sh.act()前插入await page.waitForSelector('[data-testid="checkout-button"]', { state: 'visible' });

    5.4 第四步:分析 LLM 的动作解析逻辑

    Stagehand 将自然语言转为动作时,会记录中间推理。在--debug日志中查找"action plan"字段,典型输出为:

    { "action": "click", "target": { "type": "text", "value": "去结算" }, "fallbacks": ["aria-label", "title", "xpath"] }

    target.type"text"但页面按钮文本为"立即结算",说明指令与实际文本不一致——此时应统一术语,或在cart.html中添加aria-label="去结算"作为标准标识。

    5.5 第五步:启用详细 Playwright 日志

    config.json中添加:

    { "browser": { "logger": { "enabled": true, "level": "verbose" } } }

    运行后会在playwright-log.txt中记录每次page.click()的详细过程,包括等待条件、超时时间、最终执行的 selector。这是定位“为什么 click 没反应”的终极手段——日志会明确写出waiting for element to be visible, enabled and stable,若卡在此处,必然是 CSS 或 JS 阻塞了元素就绪。

    本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 0:36:19

CentOS停更替代方案:Rocky Linux从零到KVM虚拟化实战指南

“CentOS还能用吗&#xff1f;”这是我近两年被问最多的一句话。如果你也是奔着这个问题点进来的&#xff0c;那我直接给结论&#xff1a;CentOS 8在2021年底就停止维护了&#xff0c;CentOS 7也将在2024年6月正式退役。对于跑业务的服务器来说&#xff0c;继续用等于裸奔。而R…

作者头像 李华
网站建设 2026/9/16 0:35:34

轻量级搜索引擎为何比ES快5倍?原理与选型指南

1. 这个“快5倍”的说法&#xff0c;到底在比什么&#xff1f;“推荐一个比ES快5倍的搜索引擎”——这句话一出来&#xff0c;很多做过搜索服务的同学第一反应不是兴奋&#xff0c;而是皱眉。我第一次在技术群里看到这个标题时&#xff0c;下意识就点开想看配置截图&#xff0c…

作者头像 李华
网站建设 2026/9/16 0:27:41

新能源多仓中长途智能调度:从数据到滚动优化的实战路径

1. 这不是“排班软件升级”&#xff0c;而是物流成本结构的底层重写“告别人工排车”这六个字&#xff0c;听上去像一句营销口号&#xff0c;但在我跑过27个新能源物流园区、拆解过13家头部城配企业的调度系统之后&#xff0c;它背后是一场静默却剧烈的成本革命。去年底&#x…

作者头像 李华
网站建设 2026/9/16 0:23:45

Spring Boot购物系统:数据库文件导入与项目运行排错指南

简介&#xff1a;基于Spring Boot实现的电脑商城购物系统完整项目源码&#xff0c;面向Java初学者、毕业设计学生及需要电商项目参考的开发者&#xff0c;帮助快速掌握Spring Boot框架下的业务开发与项目组织方式。系统包含商品分类、商品详情、购物车、订单管理、用户管理、个…

作者头像 李华
网站建设 2026/9/16 0:16:39

豆包 / DeepSeek / 千问反查实战:3 类账号 30 天验证

豆包 / DeepSeek / 千问反查实战&#xff1a;3 类账号 30 天验证⚠️ 本文是 30 天 GEO 实战的真实账单——3 类账号 vs 3 引擎对比。 不是"理论推演"——是"30 天跑完的实际数据"。一位做品牌增长的老板在微信留言&#xff1a;“豆包 / DeepSeek / 千问 3…

作者头像 李华
网站建设 2026/9/16 0:14:21

H6801同步升降压芯片:22.2V锂电设备无刷电机稳压方案详解

1. 方案先导&#xff1a;H6801这颗芯片到底在解决什么问题先说结论&#xff1a;H6801是一颗同步升降压&#xff08;Buck-Boost&#xff09;控制器&#xff0c;特别适合锂电池供电的设备&#xff0c;把电池电压稳成一路或多路所需电压。标题里那句“22.2V锂电设备”指的是6串锂聚…

作者头像 李华