浏览器自动化任务失败时,日志里最常见的一句话是:
failed
这句话对排查帮助很小。
因为它没有告诉你:
哪个账号失败;
在哪个 Profile 里失败;
当时用的哪组网络配置;
Session 是否还有效;
页面停在哪个 URL;
有没有截图;
下一步应该重试,还是人工复核。
很多团队会先看 Profile:
Profile 能打开。
页面也能显示。
Cookie 好像还在。
于是判断任务可以继续。
但从工程角度看,这个判断不够。
Profile 已打开,只说明浏览器环境启动成功。
它不代表任务上下文可以继续。
一、Profile 不是运行结果,而是运行上下文
在个人使用场景里,Profile 可以被简单理解成一个独立浏览器环境。
但在团队任务里,Profile 更像运行上下文的一部分。
可以把一次浏览器任务拆成这条链路:
Account -> Profile -> Network -> Session -> PageState -> TaskRun -> Evidence -> Review
每个对象负责一层信息。
Account 表示业务账号。
Profile 表示浏览器环境。
Network 表示代理、地区、时区、语言等配置。
Session 表示当前会话是否能继续。
PageState 表示当前页面是否符合任务预期。
TaskRun 表示一次任务执行。
Evidence 表示失败现场。
Review 表示人工复核结论。
如果只看 Profile 是否打开,就等于只看到了链路中的一段。
真正要判断的是:
这条链路是否完整。
二、先确认 Account 和 Profile 是否对应
任务继续之前,第一步不是看 Cookie。
而是确认账号和 Profile 是否对应。
一个基础上下文可以这样记录:
{
"account_id": "account_001",
"profile_id": "profile_001",
"owner": "member_a",
"last_operator": "member_b",
"last_open_time": "2026-07-07 10:30:00"
}
这几个字段回答的是:
当前任务到底跑在哪个账号环境里?
如果 account_id 和 profile_id 不清楚,后面所有判断都会失准。
比如:
脚本执行的是 Profile A;
运营以为它对应账号 1;
实际上上一次有人把账号 2 放进了这个 Profile;
失败后日志只记录了 Profile A。
这种情况下,Profile 能打开也没意义。
因为上下文已经错了。
三、Network 变更会影响任务判断
浏览器任务里,Network 不只是“代理能不能连”。
它还可能影响地区、时区、语言、页面状态和后续复盘。
建议至少记录:
{
"profile_id": "profile_001",
"network_label": "us_proxy_group_a",
"region": "US",
"timezone": "America/Los_Angeles",
"language": "en-US",
"updated_by": "member_b",
"updated_at": "2026-07-07 09:40:00",
"review_status": "checked"
}
自动化任务开始前,要问几个问题:
network_label 是否和 Profile 绑定?
region、timezone、language 是否一致?
配置是否刚刚变更?
变更后是否复核?
任务失败是否发生在变更之后?
如果网络配置刚变更,但 review_status 不是 checked,就不应该直接继续执行。
这不是为了让流程变慢。
而是为了避免任务在不确定环境里继续跑。
四、Cookie 不等于 Session
很多任务误判来自一个问题:
Cookie 还在,所以任务可以继续。
这不一定成立。
Cookie 是本地状态。
Session 是当前会话是否还能继续。
PageState 是当前页面是否符合任务预期。
这三者不能混在一起。
可以把 Session 状态设计成:
valid
uncertain
expired
need_review
如果 session_state 是 uncertain,就不应该进入下一步任务。
更稳的处理流程是:
save_current_url -> save_screenshot -> mark_need_review -> wait_for_review
也就是先保存现场,再进入复核。
不要因为 Profile 已打开,就默认继续执行。
五、PageState 是自动化任务的前置条件
页面能打开,不代表页面状态正确。
自动化任务至少要检查:
current_url 是否符合预期;
页面是否停在上一次失败步骤;
是否有错误提示;
是否需要人工确认;
是否已经保存截图。
示例:
{
"profile_id": "profile_001",
"current_url": "https://example.com/dashboard",
"expected_url": "https://example.com/dashboard",
"page_state": "need_review",
"last_step": "open_dashboard"
}
如果 page_state 是 need_review,任务就应该停。
这里的重点不是“自动化能不能继续点”。
而是任务是否还处在可控状态里。
六、TaskRun 不能只记录 failed
一次浏览器任务失败后,至少要留下能复盘的 TaskRun。
{
"run_id": "run_20260707_001",
"account_id": "account_001",
"profile_id": "profile_001",
"network_label": "us_proxy_group_a",
"step_name": "check_dashboard_status",
"current_url": "https://example.com/dashboard",
"screenshot": "/evidence/run_20260707_001.png",
"error_message": "page_state_uncertain",
"next_action": "manual_review"
}
这些字段能回答:
任务在哪个账号上失败;
使用哪个 Profile;
当时是哪组网络配置;
失败发生在哪一步;
页面停在哪里;
截图在哪里;
下一步是谁处理。
没有这些字段,任务失败后只能靠人回忆。
而回忆不是工程能力。
七、状态流转不要只有 success 和 failed
很多浏览器任务一开始只有两个状态:
success
failed
这对简单脚本可能够用。
但对团队任务不够。
更合理的状态流转可以是:
ready -> running -> evidence_saved -> need_review -> retry_ready -> completed
-> failed
ready:上下文检查完成。
running:任务执行中。
evidence_saved:失败现场已保存。
need_review:需要人工判断。
retry_ready:复核完成,可以重试。
completed:任务完成。
failed:任务终止。
这个状态流转的价值在于:
接手人看到 need_review,就知道不要直接重跑。
看到 retry_ready,才知道可以进入下一次执行。
看到 evidence_saved,才知道失败现场已经保留。
状态不是为了形式化。
状态是为了减少团队沟通成本。
八、AI Agent、RPA、脚本和人工复核要分边界
很多团队开始把 AI Agent、RPA、脚本放进浏览器任务。
但能力越多,边界越重要。
一个更稳的分工是:
API 适合结构化、官方支持的任务。
脚本适合规则明确、流程稳定的任务。
RPA 适合固定路径和重复点击。
AI Agent 适合读取页面、整理信息、生成异常摘要。
人工复核适合不确定判断、重要提交、权限变更和异常确认。
不要问:
AI 能不能替代所有操作?
应该问:
这个步骤适合交给谁?
能 API 完成的,不要让 AI 猜。
能脚本稳定执行的,不要强行大模型化。
不确定状态下,不要自动继续。
涉及责任判断时,进入人工复核。
九、建议增加 precheck 阶段
自动化任务开始前,建议加一个 precheck。
precheck -> running -> evidence_saved -> need_review -> retry_ready -> completed
precheck 至少检查:
account_id 是否明确
profile_id 是否正确
network_label 是否最近变更
session_state 是否 valid
current_url 是否符合预期
page_state 是否 normal
last_task_status 是否允许继续
如果任意一项不确定,任务不应该进入 running。
可以直接进入:
blocked -> evidence_saved -> need_review
这一步会牺牲一点执行速度。
但能换来更低的复盘成本。
浏览器自动化不是越快越好。
它要可控。
十、这份检查最好沉到工作流里
如果团队只有一个人操作,简单备注和脚本日志可能够用。
但一旦多人协作,信息分散会很快变成问题。
常见情况是:
Profile 在工具里;
网络配置在表格里;
任务日志在脚本里;
截图在群聊里;
复核意见在私聊里;
下一步动作没人记录。
这些信息单独看都存在。
但没有形成上下文。
更合理的方式,是把 Account、Profile、Network、Session、PageState、TaskRun、Evidence 和 Review 放在同一个工作流里。比如 浏览器任务上下文工作流 这类方案,重点不是替代 Playwright、RPA、API 或人工判断,而是让团队能在同一个上下文里看见环境状态、任务过程和失败证据。
十一、工程 Checklist
Account
- 是否有 account_id;
- 是否能对应业务账号;
- 是否有 owner;
- 是否能看到当前状态。
Profile
- 是否有 profile_id;
- 是否记录 last_operator;
- 是否绑定 network_label;
- 是否有 next_action;
- 是否能被接手人理解。
Network
- 是否记录 region;
- 是否记录 timezone;
- 是否记录 language;
- 是否记录 updated_by;
- 是否记录 review_status。
Session
- 是否区分 Cookie 和 Session;
- 是否记录 session_state;
- 是否保存 current_url;
- 是否标记 page_state;
- 不确定时是否进入 need_review。
TaskRun
- 是否有 run_id;
- 是否记录 step_name;
- 是否记录 current_url;
- 是否保存 screenshot;
- error_message 是否可读;
- next_action 是否明确。
Evidence
- 是否和 run_id 绑定;
- 是否包含截图;
- 是否包含 URL;
- 是否包含错误信息;
- 是否能被接手人找到。
Review
- 是否有复核人;
- 是否有复核结论;
- 是否能决定 retry_ready 或 failed;
- 是否沉淀处理经验。
总结
Profile 已打开,不代表任务上下文可以继续。
从工程角度看,Profile 只是运行上下文的一部分。
真正要判断的是:
Account 是否正确;
Network 是否一致;
Session 是否可继续;
PageState 是否符合预期;
TaskRun 是否留下过程;
Evidence 是否可复盘;
Review 是否能接上下一步。
如果这些对象没有连起来,自动化任务失败后就只能靠猜。
如果它们能进入同一个工作流,浏览器任务才更容易被追踪、交接和复盘。