跑自动化真正消耗人的不是报错,是不报错。
前几天连着撞了三次「点了没反应」:进程退出码 0、控制台干净、日志没有 ERROR,但产物一个都没出来。把三次复盘成三类,附上我现在的通用复核顺序。
一、进程级:退出码 0,文件没生成
一条无头 Chrome 截图命令:
powershell
$tmp = Join-Path $env:TEMP ("shot_" + [guid]::NewGuid())
Start-Process chrome -ArgumentList @(
"--headless=old","--disable-gpu","--hide-scrollbars",
"--user-data-dir=$tmp",
"--window-size=1080,1440",
"--screenshot=$out","file:///$html"
) -Wait
$LASTEXITCODE 是 0,stderr 空,但 $out 不存在。换成 --headless=new 也一样正常退出、一样不生成文件,而且它不报错。
两个附带条件:别用 & 直接调用(拿不到 -Wait 的产出时序);--user-data-dir 必须给全新目录,否则会附着到已经在运行的 Chrome。
对策很简单:断言产物,不看退出码。
powershell
if (-not (Test-Path $out) -or (Get-Item $out).Length -eq 0) { throw "screenshot failed" }
二、交互级:选中态没生效
弹窗列表里点一项,.active 没加上,点「确定」没反应,控制台干净。原因是那一项的 getBoundingClientRect().top 已经超出视口(实测 viewport 高 777,该项 top 856)。视口外的元素,.click() 和合成 MouseEvent 都不会触发选中,页面也没有任何提示。
js
el.scrollIntoView({ block: "center" });
el.click();
另外别在同一个 tick 里读 className 做验证------框架的 DOM 更新是异步的,读早了会误判。
三、服务端级:提交按钮自己弹回来
点「发布」,按钮变「发布中...」并置灰,十几秒后自己变回「发布」。没有 toast、没有报错、列表计数也不变。
这类处理起来麻烦,我的做法是同一动作不硬试超过 2 次,第 3 次换时间窗或换入口。有些平台的额度按提交次数扣,重试反而把机会用掉。
我现在的复核顺序
- 看产物,不看退出码;
- 回读状态位(disabled、类名、计数器);
- 涉及列表的写操作,重载页面再看------很多前端不会自动刷新;
- 同一动作不超过 2 次。
自动化真正贵的是「不报错但没生效」。把每处「我以为成了」换成「我验证过了」,稳定性会明显好一截。