资讯详情

退出码 0、日志干净,但一件事也没干成:自动化脚本的 9 种静默失败

📅 2026/10/13 3:24:48 | 华诺云谱 👁 阅读
退出码 0、日志干净,但一件事也没干成:自动化脚本的 9 种静默失败
自动化脚本的 9 种静默失败不报错、不崩溃、就是不干活脚本跑完退出码 0日志干干净净一件事也没干成。这种失败最难查因为它不留下任何线索。下面 9 种是我实际踩过的每一种都给出现象、真因、一条自检命令、修法。1. 浏览器随父进程一起被回收现象脚本里启动的 Chrome等脚本跑完就消失了下次再连接 CDP 端口直接ECONNREFUSED。真因浏览器进程是命令行会话的子进程会话结束即被清理。用Start-Process、schtasks、WMI 启动也躲不掉。自检curl-s--noproxy*--max-time3http://127.0.0.1:9333/json/version# 空输出 已经没了修法启动和操作必须写在同一条命令里cmd //c startC:/Program Files/Google/Chrome/Application/chrome.exe\--remote-debugging-port9333--user-data-dirC:\...\profile--no-first-run\;sleep14;nodeyour-script.js2. curl 探测本地端口走了代理现象明明服务在跑curl就是超时或返回代理的错误页。真因环境里设了http_proxy本地请求也被送到代理去了。自检env|grep-iproxy修法探测本地端口一律加--noproxy *。这条我记了很久才形成肌肉记忆。3. 运行时版本被静默升级现象昨天还好好的脚本今天报No such file or directory。真因托管运行时被自动升级路径里的版本目录变了比如 Node22.22.2-3→22.22.2-6。写死路径的任务全部失效。自检lsC:/Users/你/.workbuddy/binaries/node/versions/修法脚本里先探测再取用别写死版本号N$(ls-d/path/to/versions/*/|tail-1)/node.exe4. 定时任务到期自动停跑现象任务一直在列表里状态还是 ACTIVE但就是没执行记录。真因任务设了validUntil过期后静默停跑状态字段不更新。自检创建/修改任务时检查有效期字段定期核对最近一次执行时间。修法要么不设validUntil要么设一个远超预期的日期并在任务描述里写明到期前续期。5. 后台标签页里鼠标键盘全部静默失效现象坐标算对了、事件也发了页面上毫无反应同样的代码在前台标签就正常。真因标签处于后台时visibilityState hidden浏览器会抑制输入事件。自检document.visibilityState// hidden 就是它修法操作前先切前台awaitsend(Page.bringToFront);顺带一提后台标签里window.screenX / screenY也会返回 0拿它算坐标就是错的详见滑块验证码那篇。6. 灌入长文本时换行被吞掉现象脚本把 Markdown 塞进编辑器结果所有换行消失全文糊成一坨。真因Input.insertText对换行符处理不可靠富文本编辑器CodeMirror / Tiptap / Draft.js尤其明显。修法走剪贴板 CtrlVimportpyperclip,time pyperclip.copy(markdown_text)# 聚焦编辑器后pyautogui.hotkey(ctrl,v)7. 二维码过期了但页面上没写过期现象脚本一直等扫码等满十几分钟超时退出页面上那个码其实早就失效了。真因过期态的视觉表现是模糊的码 中间一个刷新圈innerText里不含过期两个字按文字判断永远判断不出来。修法要么定时刷新二维码点二维码框中心要么看图——截图后人工确认。别指望文本匹配。8. 接口返回 200业务其实是失败的现象抓包看状态码全 200事情没办成。真因业务错误码藏在响应体里。比如签到接口{code:10001,msg:今天已签到请明天再来}HTTP 状态是 200code才是真相。再比如状态查询接口返回 200 但字段全是零值——那不代表真的为零可能只是它查的是另一套维度。修法断言要打到响应体字段不能只看 HTTP 状态。而且要先搞清楚哪个字段才是权威口径。9. 状态查询接口和实际操作接口口径不一致这是我踩得最狠的一条。同一个签到功能查询接口说today_checked_in: false、streak_days: 0看起来就是没签到、连签断了。但实际调操作接口返回的是今天已签到请明天再来。哪个是真的操作接口的回执是真的。查询接口在这个上下文里返回的是另一套维度的数据赛季维度赛季未开启时字段全零。教训判断做没做成永远以操作接口的回执为准不要用查询接口的状态字段去推断。附一条命令的自检清单把上面最容易犯的几条串起来开工前跑一次#!/usr/bin/env bash# 自检端口 / 代理 / 运行时路径 / 标签前台PORT${1:-9333}echo[1] CDP 端口curl-s--noproxy*--max-time3http://127.0.0.1:${PORT}/json/version\echo OK||echo ✗ 浏览器没起来可能被回收echo[2] 代理环境ifenv|grep-qihttp_proxy;thenecho ⚠ 存在代理本地请求请加 --noproxy *elseecho OKfiecho[3] Node 运行时ls-d$HOME/.workbuddy/binaries/node/versions/*/2/dev/null|tail-1echo[4] Python venvls-d$HOME/.workbuddy/binaries/python/envs/*/2/dev/null|tail-1跑完这四项能挡掉一半的脚本没反应。总结这些坑的共同点失败路径上没有报错。所以写自动化脚本时别只看退出码。关键动作后面要跟断言点完按钮 → 断言 URL 变了 / 出现了成功文案提交表单 → 断言列表里多了一条调用接口 → 断言响应体里的业务码上传文件 → 断言页面上出现了新资源的 URL没有断言的自动化等于没有自动化。它只是在安静地假装成功。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑