让浏览器 Agent 稳定运行的三个要点
作者以登录后获取周报为例,介绍浏览器自动化的可靠性处理:等待数据就绪元素、超时保存截图,以及按可访问性角色和名称定位控件。重点是处理异步加载和页面布局变化。
完整中文译文
第一个月,我一直让 Agent 待在终端里。处理文件、操作 git、执行命令,都没问题。浏览器则不许碰,因为我认定它会不稳定,而且我听过的每一个 GUI 自动化故事,最后都变成了一堆脆弱的坐标定位。
后来,一个任务让我不得不面对这个问题:一份周报,只有登录后才能查看,而且没有导出按钮。要么让 Agent 学会操作浏览器,要么我就得永远手动处理。
真正难的是什么
不是点击。点击没什么问题。真正难的地方,按顺序是:
判断页面什么时候准备好了。固定等待时间靠不住。我最后的做法是,等待一个只有数据加载完成后才会出现的特定元素;一旦超时,就明确报错,而不是继续对着空表格操作。
分清是真的失败了,还是只是加载慢。一个没加载出来的页面,看起来和一个仍在加载的页面一模一样。解决办法还是等待那个特定元素,再加上每次超时都保存截图,这样我就能从日志里判断究竟是哪种情况。
找到那些没有固定坐标的东西。布局会变,横幅会出现,Cookie 提示会把所有内容往下挤。读取无障碍树,再根据角色和名称点击,比按像素坐标定位更可靠,而且还能生成我看得懂的日志。
处理任何需要我介入的情况。双因素验证提示、验证码、“确认你的身份”。这些不是自动化要解决的问题,而是应该停止的条件。Agent 应该停下来,而不是猜着操作。
任务清单发生了什么变化
有意思的变化,并不是旧任务做得更快了,而是一些新的任务变得可行了。
那些被我归类为“必须手动完成”的事情,实际上只是“没有 API”。查看仪表盘、从供应商门户提取数据、检查某条上架信息是否已经上线——这些事情都不难,只不过隔着一层屏幕。
这比给某件事省下几分钟重要得多。我对哪些事情可以自动化的判断出了错,原因是我一直把界面当成了一堵墙。
绝不要在步骤之间复用缓存的截图。每一步都要重新读取当前状态。
如果点击后没有任何可见变化,就把它当成错误,而不是认为已经完成。
遇到任何看起来像安全验证的提示,都要停下来询问。不要试着一路点击跳过去。
每次失败都保存一张截图,并用步骤名称命名。我有一半的调试工作,就是在看这些截图。
对此,我仍然保持谨慎。一个只能做对一半的浏览器 Agent,比一个拒绝执行的 Agent 更危险,因为一个半成功的流程会产出看似合理、实际错误的数据。正是等待特定元素和明确报错这两点,让它足够可信,可以投入使用。
如果还想采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。