如何在K6中获取浏览器会话Cookie,并在setup()登录后于default()函数复用该Cookie
嘿,我刚好碰到过类似的问题,给你捋捋最简单的解决办法!你之前用cookieJar和response.cookies没成功,大概率是因为setup函数的执行上下文和每个VU的default函数上下文是完全独立的——setup里的CookieJar不会自动同步到各个VU的会话里,所以得手动把登录后的Cookie提取出来,再传递给default用。
最简实现步骤
核心思路就是:在setup里完成登录,把登录响应里的Cookie拼成标准的Cookie头字符串,返回给default函数,然后后续请求直接带上这个请求头就行。
1. 在setup中登录并提取Cookie
export function setup() { // 发送登录请求(替换成你的登录接口和参数) const loginResponse = http.post('https://your-domain.com/login', { username: 'test-user', password: 'test-pass' }); // 先确认登录成功,避免后续请求白忙活 if (loginResponse.status !== 200) { throw new Error(`登录失败,状态码:${loginResponse.status}`); } // 从响应的cookies中构建完整的Cookie头字符串 let authCookie = ''; // 遍历所有返回的Cookie,拼接成标准格式 for (const [cookieName, cookieDetails] of Object.entries(loginResponse.cookies)) { authCookie += `${cookieName}=${cookieDetails[0].value}; `; } // 去掉最后多余的分号和空格 authCookie = authCookie.trim().slice(0, -1); // 返回Cookie给后续的default函数 return { authCookie }; }
2. 在default中复用Cookie
import { check } from 'k6'; export default function(data) { // 发送需要鉴权的请求,带上从setup拿到的Cookie const protectedResponse = http.get('https://your-domain.com/protected-api', { headers: { 'Cookie': data.authCookie } }); // 验证请求是否成功(可选,但建议加) check(protectedResponse, { '受保护接口可访问': (res) => res.status === 200 }); }
为什么之前的方法没生效?
cookieJar:setup函数有自己独立的CookieJar,而每个VU的default函数也有专属的CookieJar,两者不共享,所以setup里登录存的Cookie不会自动出现在VU的请求里。response.cookies:你可能只是拿到了Cookie对象,但没把它转换成请求头需要的字符串格式,或者没正确传递给default函数。
额外注意事项
- 如果你的登录接口返回多个Cookie(比如sessionId+csrfToken),上面的代码会自动拼接所有Cookie,不用单独处理。
- 有些网站的Cookie会带
HttpOnly或Secure属性,但在K6中发送请求时,只要Cookie值正确,这些属性不影响请求的发送。 - 如果需要每个VU都有独立的登录会话,那应该把登录逻辑放到default函数的开头(而不是setup),这时候K6的默认CookieJar会自动维护每个VU的会话,不用手动处理。
内容的提问来源于stack exchange,提问作者Pubudu
相关产品推荐
相关产品推荐

