Playwright MCP 用持久化 Profile 保存 Cookie 登录态 —— 完整技术教程
适用范围:opencode + Playwright MCP 浏览器自动化场景
关键词:Playwright MCP、persistent profile、user-data-dir、cookie 持久化、免登录
一、为什么要持久化 Profile?
浏览器自动化(如 opencode 里调用 Playwright MCP)最烦的一点是:每次启动浏览器,登录态、Cookie、LocalStorage 全部丢失。
比如:
- 自动化需要访问某个需要登录的站点,每次都重新扫码 / 输密码 / 验证码。
- Cookie 有效期一过又得重新登录。
- 登录验证(滑块、人机校验)在无头浏览器里几乎过不去。
解决办法:给自动化用的浏览器绑定一个"固定身份目录"(persistent profile),让 Cookie 和登录态落盘。下次启动自动加载,登录一次、长期有效。
二、原理:Playwright MCP 的持久化机制
2.1 默认行为
Playwright MCP 启动浏览器时,默认就带一个临时 user-data-dir(每次随机,用完即焚 → 登录态必然丢失)。
2.2 核心参数:--user-data-dir
MCP 支持通过命令行指定固定的浏览器数据目录:
npx-y@playwright/mcp@latest\--user-data-dir /home/a1/.cache/hs-playwright-mcp指定之后:
- Chrome 会把Cookie、LocalStorage、IndexedDB、登录态全部写入这个目录下的
Default/子目录。 - 具体文件:
Default/Cookies(SQLite 数据库)、Default/Local Storage/、Default/Login Data等。 - 下次任何会话再指向同一个目录 → 自动加载上次的全部状态。
2.3 一个关键限制:同一时刻只能一个实例用
⚠️ 一个 user-data-dir同一时刻只能被一个浏览器进程占用。
判断标准:目录里有没有锁文件锁定(错误提示形如Browser is already in use for <userDataDir>)。
因此:
- 不能用
--isolated(那是"隔离模式",刻意不落盘,与之相反)。 - 想要多个并行会话,各自指向不同的 user-data-dir。
关闭浏览器后,锁自动释放,目录可被再次使用。
三、实战:opencode MCP 配置(本机已验证)
3.1 配置文件位置
~/.config/opencode/opencode.json3.2 当前生效的 Playwright MCP 配置
{"playwright":{"command":["npx","-y","@playwright/mcp@latest","--user-data-dir","/home/a1/.cache/hs-playwright-mcp","--executable-path","/usr/bin/google-chrome","--no-sandbox"],"enabled":true,"type":"local"}}要点:
| 参数 | 值 | 作用 |
|---|---|---|
--user-data-dir | /home/a1/.cache/hs-playwright-mcp | 持久化 profile,Cookie/登录态落在这里 |
--executable-path | /usr/bin/google-chrome | 直接用系统里装的真实 Chrome,而非 Playwright 自带内核 |
--no-sandbox | 无值 | 容器/服务器环境(root 或受限沙箱)下必需的启动开关 |
注意:上面是"真实 Chrome 内核 + 固定 profile",即执行文件是真实的 Chrome。某些网站仍可能通过 UA/自动化特征识别为自动化,但 Cookie 持久化与 profile 复用与 UA 无关,照常生效。
四、验证方法(照做即可)
4.1 看进程确认用的哪个目录
psaux|grep-E"playwright-mcp|/opt/google/chrome/chrome"|grep-vgrep找--user-data-dir=/home/a1/.cache/hs-playwright-mcp这一行即确认。
4.2 看 Cookie 文件是否已落盘
ls-la/home/a1/.cache/hs-playwright-mcp/Default/Cookies有文件且大小非 0 → Cookie 数据库已存在。
4.3 实测:写入 Cookie → 关浏览器 → 重开 → 还在
打开任意站点(如
https://example.com)。注入测试 Cookie:
document.cookie='test_persist=hello; path=/; max-age=3600';读取确认写入成功 → 关闭浏览器标签页。
重新导航到同一站点,再次读取。
document.cookie// 返回 "test_persist=hello" → 持久化成功 ✅
本机实测结果:test_persist=hello_mybili_123在关浏览器重开后依然存在。✅
五、验收清单:怎么确保"MCP 一定走带 Cookie 的 Profile"
唯一配置源:
grep-A8playwright ~/.config/opencode/opencode.json确认
--user-data-dir指向固定路径,且没有--isolated。无项目级覆盖:
cat/home/a1/mybilibili/opencode.jsongrep-rn"isolated"~/.config/opencode/ /home/a1/mybilibili/都为空 → 全局配置唯一生效。
进程实测(最可靠):
psaux|grep"user-data-dir"看活动进程实际用的目录是否等于固定 profile 路径。
三条全过 → 100% 保证 Cookie 持久化。
六、常见坑与 FAQ
Q1:登录态为什么会丢?
用--isolated,或每次--user-data-dir指向不同临时目录 → 状态不落盘。检查命令行参数。
Q2:报错 “Browser is already in use for”?
该目录正被另一个 Chrome 实例占用。关掉那个实例,或改用新的 user-data-dir。
Q3:我想配置完立刻生效?
修改opencode.json后需要重启 opencode / 重连 MCP。可在 opencode 里执行/mcp重置。
Q4:Cookie 一直保存在磁盘,安全吗?
该目录权限为-rw-------(仅当前用户可读写),且只含自动化浏览器自动生成的会话数据。建议不要在自动化 profile 里手动保存密码/表单(password-store=basic仅示例环境可用)。
Q5:能直接复用"你平时打开的那个 Chrome"的登录态吗?
不能直接复用运行中的实例(Profile 锁冲突)。两条正路:
- 方案 A(推荐):自动化专用 profile,在自动化浏览器里登录一次,之后长期有效。
- 方案 B:Playwright MCP 官方 Chrome 扩展,直接接管你已打开的真实浏览器(可复用登录态,需额外装扩展)。
七、总结
固定 --user-data-dir = 持久化 Profile = Cookie/登录态落盘 = 登录一次长期免登录这是让浏览器自动化"有记忆"的关键。配合真实 Chrome 内核(--executable-path),既能保存 Cookie,又能贴近真实浏览器行为。配置好之后,用 MCP 一定走带 Cookie 持久化的那个 Profile,无需每次重复登录。
参考:Playwright MCP 官方文档(microsoft/playwright-mcp README)。
本文档基于本机实际环境与实测结果编写。