K6脚本实现HTTP登录认证失败问题求助
K6脚本登录失败排查与修复
问题核心
你遇到的问题主要是认证方式误用 + 请求参数顺序错误:手动登录的页面几乎都是通过表单提交传递账号密码,而非HTTP Basic认证;同时你的http.post调用参数顺序不对,导致接口无法正确接收登录信息。
修复方案
1. 先确认登录接口的真实请求方式
打开浏览器开发者工具(F12),手动登录时抓包查看:
- 看请求的
Content-Type(通常是application/x-www-form-urlencoded) - 记下表单字段名(比如
username/password,不同网站可能叫user/pass)
2. 表单提交适配脚本(绝大多数场景适用)
import http from 'k6/http'; import { check } from 'k6'; export default function () { // 替换为抓包得到的实际表单字段名和你的账号密码 const loginForm = { username: 'admin', password: 'pass@1' }; const requestOptions = { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; // 注意post参数顺序:url → 请求体 → 配置项 const res = http.post('https://mysiteexample.com/LogIn', loginForm, requestOptions); // 用check断言精准判断登录结果 check(res, { '登录成功(状态码正常)': r => r.status === 200 || r.status === 302, '响应包含登录成功标识': r => r.body.includes('欢迎') || (r.json()?.success === true) // 根据实际响应调整 }); // 打印关键信息辅助排查 console.log('响应状态码:', res.status); console.log('响应内容片段:', res.body.slice(0, 200)); }
3. 若确实需要Basic认证的修正脚本
如果确认接口支持Basic认证,调整参数顺序后的脚本:
import http from 'k6/http'; import encoding from 'k6/encoding'; import { check } from 'k6'; export default function () { const encodedAuth = encoding.b64encode("admin:pass@1"); const requestOptions = { headers: { Authorization: `Basic ${encodedAuth}`, } }; // 接口不需要请求体时,第二个参数传空字符串,第三个传配置项 const res = http.post('https://mysiteexample.com/LogIn', '', requestOptions); check(res, { '认证通过': r => r.status === 200 || r.status === 302 }); console.log('响应状态码:', res.status); console.log('响应JSON:', res.json() || '无JSON格式响应'); }
关键排查技巧
- 必做:对比手动请求和脚本请求的所有细节(URL、请求头、请求体),差异就是问题所在
- 别依赖
console.log(res.json),先看res.status和res.body,很多接口返回的不是JSON - 用
check断言替代单纯打印,能直接在测试报告里看到验证结果
内容的提问来源于stack exchange,提问作者Jey
相关产品推荐
相关产品推荐

