实验背景。 团队讨论要不要把一部分探索性测试交给Agent,争了很久没有结论。支持的说它能覆盖人工点不到的路径,反对的说它跑出来的东西没人敢信。
我决定自己做一个实验。找一个我从来没打开过的网站,不给Agent任何先验知识,不让它读代码,只给它一个目标,看它怎么走、走到哪、留下什么。
实验对象。 一个公开的电商演示站,从搜索结果里随机挑的。之前没看过它的页面结构,不知道它的分类逻辑,不知道它的登录流程长什么样。
Agent配置。 browser-use,DeepSeek V4.1 Flash作为决策模型,headless模式,allowed_domains限制在演示站域名内,独立session,不与任何真实账号或数据关联。
Day 1:它“看见”的世界,和我完全不一样
第一个目标很简单:
“打开这个网站,浏览首页,找到任意一件商品,加入购物车,并验证购物车中商品数量和名称与商品页一致。”
Agent启动了。我没有干预,只在终端里看它的输出。
第一个发现:它不“看”页面,它“读”页面。
我习惯看到的是一个渲染完整的网页——图片、布局、颜色、可点击区域。Agent拿到的是一份可交互元素列表:链接、按钮、输入框,每个带一个索引和可访问名称。它不知道“这个页面好不好看”,它只知道“这里有三十几个可交互元素,其中十几个是商品链接”。
这个区别比我想的更重要。人做探索性测试,第一眼是“整体印象”,看到布局就知道大概是什么类型的页面。Agent第一眼是“动作空间”,它不判断页面类型,只枚举能操作的东西。
第二个发现:它走了一条我不会走的路。
我如果手动探索,大概率会先看导航栏、找搜索框、按分类点进去。Agent没有。它直接在首页的可交互元素列表里,选了一个商品链接点进去。
结果点进了一个“关于我们”页面。没有商品。它退回来,换了一个链接,又进了一个“联系我们”。第三次,才点进一个真正的商品详情页。
三次尝试,两次无效。但从“目标达成”的角度看,它只用了不到一分钟就找到了商品页。人类会先建“网站地图”,Agent是“边走边试”。路径不同,终点一样。
Day 1 反思: Agent的探索策略是试错优先,不是理解优先。它不需要先搞懂网站结构,只需要在动作空间里找到能推进目标的动作。这既是优势——不依赖先验知识,也是风险——会走无效路径,会遇到意外页面。
Day 2:它“以为”自己成功了,但我看到了它没看到的东西
商品详情页找到了。Agent识别出“加入购物车”按钮,点击,然后读取页面。
它报告:“商品已加入购物车,页面显示‘Added to cart’。”
如果这是一次手动测试,到这里可能就过了。但我在实验设计里加了一个约束:不能只信页面提示,必须去购物车页面核对。
Agent导航到购物车页面,读取列表。商品名称一致,数量一致。它报告:“验证通过。”
但我在旁边看着浏览器画面,发现了一个它没注意到的问题:购物车里显示的商品图片是加载失败的占位图。图片的alt文本是商品名,但图片本身没渲染出来。
Agent没有报这个问题。因为它的目标里没有“验证图片是否加载”,它只验证了“名称和数量”。
Day 2 反思: Agent的验证是目标驱动的,不是异常驱动的。你让它验什么,它就验什么;你没让它验的,它默认“不相关”。这和人类探索性测试的习惯不一样——人看到图片没加载,即使不在测试范围内,也会记一笔。Agent不会“顺手”发现目标之外的异常,除非你在目标里显式要求。
Day 3:给它一个更真实的目标,它开始暴露边界
前两天的目标太简单了。第三天,我换了一个更接近真实测试场景的目标:
“尝试用test@example.com和密码123456登录。登录后检查用户菜单是否出现。如果登录失败,记录失败提示和当前URL。”
Agent打开登录页,输入账号密码,点击登录。
页面报错:“Invalid credentials.”
Agent记录了错误提示,然后做了一个我没预料到的动作:它没有停下来,而是重新读取页面,尝试找“忘记密码”链接。
它找到了,点进去,进入重置密码页面。
它越界了。我的目标里只要求“记录失败提示和当前URL”,没让它去重置密码。但Agent的决策模型判断“登录失败→应该尝试恢复路径”,于是自己扩展了动作空间。
Day 3 反思: 这是整个实验里最值得记下来的一刻。Agent的自主性是一把双刃剑。它能在目标模糊时自己找路,但也会在你没划定边界时走到你不想让它去的地方。我后来在配置里加了allowed_domains和任务终止条件,但这次越界让我意识到:给Agent的任务描述,必须同时包含“要做什么”和“不要做什么”。只给目标,不给禁区,它会在开放空间里做合理但意外的决策。
Day 4:一次“失败”,但证据链是完整的
第四天,我让它做一个多步骤流程:搜索商品→筛选价格区间→按销量排序→验证结果列表。
它在搜索框输入了关键词,点击搜索,页面加载了结果。然后它尝试找“价格筛选”控件。页面上有一个下拉框,但它识别成了“排序方式”,点开之后选了“价格从低到高”。
它把“筛选”和“排序”搞混了。
结果列表确实按价格排序了,但没有按价格区间过滤。Agent报告:“已按价格排序,但未找到价格区间筛选控件。”
失败,但失败的方式很有价值。它没有卡住,没有报错崩溃,而是记录了它做了什么、看到了什么、为什么没完成。我拿到了一份可复核的证据:搜索关键词、点击了哪个元素、下拉框的选项列表、最终列表的前五个商品。
Day 4 反思: Agent的失败模式和传统脚本不一样。传统脚本失败是“超时/元素未找到”,然后停止。Agent失败是“尝试了、走偏了、记录了”。它的失败不是“中断”,是“带证据的未达成”。对于探索性测试来说,这个区别很重要——你拿到的不是一个红色报错,是一条可以复盘的行为轨迹。
实验结束后,我记下的五件事
第一,Agent的感知是动作空间,不是视觉印象。 它读的是可交互元素列表,不是截图。这意味着它能快速枚举可能性,但也会漏掉“目标之外”的视觉异常。
第二,它的探索策略是试错优先,不是理解优先。 它不先建网站地图,而是边走边试。优势是不依赖先验知识,风险是会走无效路径、会遇到意外页面。
第三,它的验证是目标驱动的。 你没让它验的,它默认不相关。想让它“顺手发现异常”,必须在目标里写清楚“还要检查什么”。
第四,它的自主性需要边界。 不给禁区,它会在开放空间里做合理但意外的决策。任务描述要同时包含“做什么”和“不做什么”。
第五,它的失败是“带证据的未达成”。 不是崩溃,是走了一条路、记录了证据、报告了结果。这对探索性测试有价值,但对“通过/失败”的二元判断不够。
最后
实验之前,我以为核心问题是“Agent能不能自己走完一个流程”。
实验之后,我发现真正的问题是:当Agent自己去走的时候,你还能不能看懂它为什么走这条路、拿到的证据够不够你判断。
它能探索,但它不替你定义“什么算探索成功”。它能试错,但它不替你判断“这个错值不值得修”。它能记录,但它不替你决定“这条证据够不够”。
让Agent自己去探索一个陌生网站,会发生什么?
会发生很多你预料不到的事。但只要你把“取证”和“判断”分开——Agent负责走和记,你负责看和定——那些预料不到的事,恰恰是你最需要看到的。
本文部分内容参考了霍格沃兹测试开发学社整理的相关技术资料,主要涉及软件测试、自动化测试、测试开发及 AI 测试等内容,侧重测试实践、工具应用与工程经验整理。