Chrome Profile 登录状态持久化问题排查总结
问题现象
启动 Chrome 自动化脚本时,日志显示”复用已有 Profile(登录状态将保留)”,但实际登录状态未保留。伴随 boss-go-chrome-profile 目录下大量文件被修改。
根本原因
核心问题:Chrome 单例机制
Chrome 单例机制:当系统中已有 Chrome 实例在运行时,新的 Chrome 进程(包括指定了 --user-data-dir 的)会忽略 user-data-dir 参数,直接附加到已有进程,并使用已有进程对应的 profile。
这导致:
- 脚本启动的 Chrome 实际使用的是系统默认 profile,而非指定的
boss-go-chrome-profile - 登录信息写入的是系统默认 profile
- 下次脚本运行时,加载的是
boss-go-chrome-profile(无登录信息)
次要问题:强制终止导致 Cookies 未保存
使用 pkill -9 或 Browser.close() 后立即终止进程,Chrome来不及将 cookies 写入磁盘。
关键发现过程
| 步骤 | 发现 | 验证方法 |
|---|---|---|
| 1 | Cookies 文件从未更新 | stat -f "%Sm" Cookies 时间戳不变 |
| 2 | Session Storage 有 zhipin 数据 | strings Session Storage/*.dat 发现 zhipin 域名 |
| 3 | 手动 open -a 登录可保持 | 排除 profile 本身问题 |
| 4 | 直接 spawn Chrome 二进制不行 | spawn 方式启动的 Chrome 使用了错误 profile |
| 5 | open -a 方式启动可行 | open -a 是 macOS 标准启动方式 |
解决方案
方案:使用 open -a 启动 Chrome
1 | // ❌ 错误方式 - 会被单例机制忽略 |
确保 Chrome 正常关闭(保留 Cookies)
1 | async function closeChrome() { |
启动前确保没有残留 Chrome 进程
1 | async function ensureChrome() { |
关键文件
scripts/chrome.js- Chrome 启动和关闭逻辑scripts/boss-go.js- 主流程scripts/browser.js- CDP 操作
验证步骤
- 确保无残留进程:
pkill -9 "Google Chrome"; sleep 2 - 删除锁文件:
rm -f profile/SingletonLock profile/SingletonSocket - 运行脚本
- 登录 Boss 直聘,等待 3 秒
- 正常退出(或 Ctrl+C,让 closeChrome 执行)
- 重新运行,检查登录状态是否保留
相关资料
- chromedp issue #818 - Browser close without graceful shutdown loses cookies
- Chrome Command Line Flags
- Chrome 单例机制:
SingletonLock文件位于 user-data-dir 目录
经验教训
- macOS 上使用
open -a而非直接 spawn Chrome 二进制 - 强制终止会导致 cookies 丢失,必须使用优雅关闭
- 单例机制是根本原因,任何启动方式都需要先确保没有其他 Chrome 实例
- Session Storage 可能保存登录状态,而 Cookies 可能没有(取决于网站实现)