浏览器自动化最容易翻车的地方,是把确定性步骤也交给了模型

让 agent 自己去点页面,看起来像是把整件事都简化了。但只要流程里存在「每次都得这么做」的步骤——登录、翻页、下载附件、按固定查询条件取数——把它们交给模型,就等于每次都在赌它这次会不会点对。这类步骤用脚本更稳、更快、也更便宜。

三层分工:脚本、模型、人工

第一层是确定性脚本(Playwright 这类工具就够):导航、登录、分页、下载、填固定表单。第二层交给模型判断:页面上哪个是「提交」、这条记录该归到哪个类目、这个提示是不是要重试。第三层必须留给人:付款、发送、删除、任何对外可见的动作。

分完之后往往会发现,真正需要模型的地方只有两三步。这不是削弱 agent,而是把它的不确定性圈在几个点上,出问题时你知道该看哪里。

让脚本和模型说同一种话

把页面上的东西抽象成一组有名字的字段和动作(比如订单号、金额、状态、提交按钮),模型只在这些名字上做判断,返回结构化结果,执行交给脚本。这样一来,模型判断错了,影响面只是一个字段的取值,而不是整条流程走偏。

每一步都要能断言「做对了没有」

只断言「按钮被点了」几乎没有意义。要断言的是结果:URL 变了没有、关键文本出现了没有、列表条数变了没有、金额对不对。少了这一层,失败会以「最后一步报错」的形式暴露出来,排查成本翻好几倍。

选择器会变,所以要留兜底

定位元素的优先级是:可访问性角色与文本、然后是页面上的 data 属性、最后才是 CSS 路径。再补一条纪律:找不到目标时截图并保存当时的页面片段,然后停下来,不要静默继续——一次静默继续通常意味着后面十几步都在错误的前提上跑。

凭据、限速和礼貌

凭据走环境变量或密钥管理,不进代码、不进日志;对目标站点限速,遵守条款与 robots 约定;重试次数与退避策略写进脚本,不要让模型自己决定重试几次。这几条不写下来,线上第一次被封就不知道是谁干的。

怎么验收

拿一批真实页面做回归,统计三个数:一次通过率、需要人工干预的比例、平均耗时。一次通过率没到线之前不要扩大范围。每次失败都要留一份可回放的记录(截图、页面片段、输入),失败才能真正变成用例,而不是每次都要重新复现。

一个便宜的落地顺序

先只做只读流程(抓取、对账、比价),跑稳两周再加写操作;写操作从「能撤销」的开始,最后才碰对外可见的动作。顺序反过来做,第一次事故就会把这条线的信任打没。