尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Expect的Cookie注入魔法揭秘:如何让你的测试模拟真实登录用户
Expect的Cookie注入魔法揭秘如何让你的测试模拟真实登录用户【免费下载链接】expectExpect tests your agents code in a real browser项目地址: https://gitcode.com/gh_mirrors/expect6/expect如果你用 AI 编程助手写过网页代码一定遇到过这种尴尬自动化测试一打开页面就被踢回登录页。Expect 的Cookie 注入功能正是为解决这个难题而生——它能把你在本地浏览器里真实登录的会话直接「搬运」到浏览器自动化测试的浏览器中让你的测试像真实登录用户一样访问受保护的页面。为什么浏览器测试很难测「登录态」页面无头浏览器headless browser每次启动都是一个「白纸」环境没有登录过、没有会话、没有身份。所以访问需要鉴权的路由 → 被重定向到登录页调用受保护的 API → 收到 401 Unauthorized测试后台管理界面 → 根本进不去手动在测试脚本里写一遍「填账号、输密码、点登录」既脆弱又慢而且很多网站有验证码、二次验证自动登录根本不现实。Expect 的思路很巧妙别再登录了直接复用你本地浏览器里已经登录好的会话。魔法全貌三步完成 Cookie 注入整条链路可以概括为三步源码分布在三个核心模块步骤做什么所在模块1️⃣ 选浏览器在终端勾选要从哪些浏览器同步 Cookiecookie-sync-confirm-screen.tsx2️⃣ 提取 Cookie从本地浏览器的 Cookie 库中读取并解密packages/cookies/3️⃣ 注入测试浏览器在导航前把 Cookie 塞进 Playwright 上下文browser.ts下面逐一拆解。第一步命令行里勾选浏览器10 秒配置当你带着 URL 启动 Expect 测试时终端会弹出一个 Cookie 同步确认界面列出本机安装的所有浏览器Chrome、Edge、Brave、Firefox、Safari 等 18 种默认浏览器自动预选直接回车就能用支持多选空格勾选/取消、a全选、n全不选状态栏会实时显示cookies (2)之类的提示让你知道同步已开启你的选择会保存到项目偏好中下次运行自动沿用如果不想同步加--no-cookies参数即可完全跳过详见 index.tsx 的选项定义。第二步从本地浏览器「搬」出 Cookie 的两种策略这一步由独立的 packages/cookies 包完成它内置了两套互补的提取策略策略 A直接读磁盘上的 SQLite 数据库快速每个浏览器都把 Cookie 存在本地数据库文件里。Expect 的定位很准定位数据库按平台找到各浏览器的 Cookie 存储路径复制到临时目录避免和你正在使用的浏览器产生锁冲突解密仅 Chromium 系需要macOS从钥匙串取密钥 → PBKDF2-SHA1 → AES-128-CBCLinuxsecret-tool取密钥回退为固定口令WindowsLocal State中的密钥 → DPAPI 解包 → AES-256-GCM解析Chromium 查cookies表、Firefox 的 Cookie 是明文存储在cookies.sqlite、Safari 则解析二进制的Cookies.binarycookies文件各浏览器的具体解析逻辑分别在 chromium.ts、firefox.ts、safari.ts 中实现。策略 B用 CDP 让浏览器自己解密更省事对 Chromium 系浏览器还可以启动一个无头实例、通过 Chrome DevTools Protocol 发送Network.getAllCookies命令——解密工作交给浏览器自己完成完全绕开系统钥匙串弹窗。这个流程由 cdp-client.ts 驱动复制配置 → 移除单实例锁 → 无头启动 → WebSocket 取 Cookie → 清理退出全程不会碰你正在使用的真实配置。两种方式最终都归一化为统一的Cookie结构name、value、domain、path、httpOnly、sameSite…再按名称|域名|路径去重。第三步一行 addCookies测试浏览器「原地登录」提取到的 Cookie 会在打开目标页之前注入 Playwright 浏览器上下文核心只有三行逻辑见 browser.tsconst cookies Array.isArray(options.cookies) ? options.cookies : await extractDefaultBrowserCookies(url, preferredProfile); await context.addCookies(cookies.map((c) c.playwrightFormat));注入后测试浏览器访问任何需要登录的页面都会直接以「已登录」身份进入。为了让 Agent 调用浏览器时不必等待提取MCP 会话在启动时就在后台预提取Cookie见 mcp-session.ts——等页面要打开时Cookie 早已就位。真实效果官方测试验证的 4 个细节Expect 用一套完整的模拟应用验证了注入后的行为见 cookie-injection.test.ts这些细节正是「像真实用户」的关键✅HttpOnly 会话 Cookie 自动隐藏document.cookie里看不到sid与真实浏览器安全行为一致✅路径作用域精确生效admin_panel只在/admin路由被发送公开页面不会带上✅页面内 fetch 自动携带 Cookie测试里的前端 JS 调 API 直接返回已认证数据✅会话可跨浏览器迁移从浏览器 A 提取的 Cookie 注入全新浏览器 BB 立刻具备登录态而没注入的浏览器访问同一页面仍被重定向到登录页正因为登录态开箱即用Agent 才能专注于真正的测试像图中所示它会自动生成「填充邮箱 → 填充密码 → 提交表单 → 验证跳转」这样的测试计划直接跑在真实的登录/受保护页面上。新手快速上手# 1. 全局安装 Expect CLI npm install -g expect-cli # 2. 在项目里运行会提示你选择同步 Cookie 的浏览器 expect -m 测试登录后的仪表板功能 -u http://localhost:3000几个实用小贴士CI 环境用--ci模式会自动跳过 Cookie 提取服务器上本来也没有你的本地浏览器无头运行 30 分钟超时隐私Cookie 只在你的机器上读取和注入整个流程本地完成临时关闭--no-cookies一键回到「匿名访客」模式方便专门测试未登录路径总结Expect 的 Cookie 注入把浏览器测试中最头疼的「登录态」问题化成了 10 秒钟的选择勾选浏览器 → 自动提取解密 → 注入测试浏览器。从此你的 AI 编程助手测试代码时就是那个已经登录好、有完整会话的「真实用户」——受保护页面、后台管理、个性化 API全都测得动 【免费下载链接】expectExpect tests your agents code in a real browser项目地址: https://gitcode.com/gh_mirrors/expect6/expect创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Codex Goal Mode 配 TaoToken:config.toml 骨架与报错排查

Codex Goal Mode 配 TaoToken:config.toml 骨架与报错排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/26 13:43:30
Cursor vs GitHub Copilot:TaoToken 统一 Key 下该选谁

Cursor vs GitHub Copilot:TaoToken 统一 Key 下该选谁

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/26 13:43:30
鼠标星星跟随特效:用 jQuery 与原生 JS 打造轻量级粒子拖尾

鼠标星星跟随特效:用 jQuery 与原生 JS 打造轻量级粒子拖尾

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/26 13:43:30
MORE NEWS

更多资讯

📰

Vue集成WebUploader实现金融大文件断点秒传实战

做金融保险系统的客户资料上传模块,是我这几年在Vue项目里反复打磨的一个环节。最近又被问起“WebUploader能不能做断点秒传”,因为理赔资料、投保单影像、体检报告这些大附件,动不动就是几十上百MB,甚至几百MB,网络一…

📰

贪心算法核心:单调区间收割与分类极值四类模型精讲

贪心算法大概是所有算法专题里最“反直觉”的一个。明明每一步都只盯着眼前的最优解,最后却常常能交出全局最优的答卷;可换一道题,同样的“眼前最优”又会把你带进沟里。这个专题(二)我想集中拆一类特别典型的贪心场景…

📰

基于umeditor的机械行业截图OCR识别插件开发实战

搞机械行业信息化的朋友,应该都经历过这种场景:工艺员拿到一张零件图,要把标题栏里的图号、材料、表面处理逐行敲进ERP;技术员翻着几百页的《机械设计手册》,要把里面的参数、公式抄到技术文档里。字一多、符号一杂&am…

📰

VB6.0鼠标点击移动操作程序代码:用TaoToken统一Key接入AI辅助排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

LabVIEW与Halcon语义分割集成实战:从模型训练到上位机部署

1. 为什么是LabVIEWHalcon,而不是其他搭配1.1 各干各的:LabVIEW是"壳",Halcon是"核"做机器视觉项目的人都知道,现场最怕的不是算法本身难写,而是算法在上位机里跑不起来。LabVIEW的强项从来没变过…

📰

MySQL binlog反序列化报错排查:Error while deserializing event at offset

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬