Tianya_God 2025-12-01 11:18 采纳率: 0%
浏览 19

jmeter登录接口验证码获取

在系统项目中,登陆界面会有随机生成的验证码,在接口测试过程中,要如何获取这个验证码呢?

Jmeter 登录接口测试,怎么获取页面随机生成的验证码?

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2025-12-01 11:23
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    在使用 JMeter 进行接口测试时,如果登录接口需要验证码(如图片验证码或短信验证码),那么直接进行接口测试会遇到“验证码不匹配”的问题。为了绕过这个限制,我们需要通过以下方式获取并验证验证码:


    ✅ 一、验证码获取的原理

    验证码通常由服务器端生成,并返回给前端页面展示。在接口测试中,若没有正确的验证码,请求将被拒绝。因此,我们需要:

    1. 先发送请求获取验证码
    2. 解析验证码内容(如图片)
    3. 模拟用户输入验证码(如人工输入或自动识别)
    4. 将验证码作为参数传递给登录接口

    ✅ 二、具体步骤与解决方案

    1. 获取验证码图片

    • 使用 JMeter 的 HTTP Request 请求验证码图片接口。
    • 设置 Content-Typeimage/pngimage/jpeg(根据实际接口响应类型)。

    注意: 如果验证码是通过 /captcha.png 接口获取的,可以直接访问该 URL。

    GET /captcha.png HTTP/1.1
    Host: yourdomain.com
    

    2. 保存验证码图片到本地(可选)

    • 在 JMeter 中可以使用 JSR223 PostProcessorBeanShell PostProcessor 将图片保存到本地。

    示例代码(Groovy):

    import java.io.FileOutputStream
    import java.io.InputStream
    import org.apache.jmeter.samplers.SampleResult
    
    SampleResult result = prev.getResponseData()
    InputStream is = new ByteArrayInputStream(result)
    FileOutputStream fos = new FileOutputStream("captcha.png")
    byte[] buffer = new byte[1024]
    int len;
    while ((len = is.read(buffer)) > 0) {
        fos.write(buffer, 0, len);
    }
    fos.close();
    is.close();
    

    重点: 这一步用于调试和查看验证码内容,不能用于自动化识别


    3. 手动输入验证码(适用于非自动化场景)

    • 如果是手动测试,可以在 HTTP Request 的 Body 中填写验证码字段。
    • 例如:{"username": "test", "password": "123456", "code": "ABCD"}

    4. 自动识别验证码(高级方案)

    • 使用第三方 OCR 服务(如百度识图、腾讯云OCR等)对验证码图片进行识别。
    • 需要将验证码图片上传至 OCR 接口,然后获取识别结果。

    示例代码(调用百度 OCR API):

    import java.net.URL
    import java.io.InputStream
    import groovy.json.JsonSlurp
    
    // 获取验证码图片(假设已经保存为 captcha.png)
    def file = new File("captcha.png")
    def imageBytes = file.bytes
    def base64Image = Base64.encoder.encodeToString(imageBytes)
    
    // 调用百度 OCR API
    def url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    def params = [
        'access_token': 'your_access_token',
        'image': base64Image
    ]
    
    def postBody = params.collect { k, v -> "${k}=${URLEncoder.encode(v, 'UTF-8')}" }.join('&')
    def conn = new URL(url).openConnection()
    conn.setRequestMethod('POST')
    conn.setRequestProperty('Content-Type', 'application/x-www-form-urlencoded')
    conn.setDoOutput(true)
    conn.getOutputStream().write(postBody.getBytes('UTF-8'))
    
    def response = new BufferedReader(new InputStreamReader(conn.getInputStream())).readLine()
    def json = new JsonSlurp().parseText(response)
    def code = json.words_result[0].words
    
    // 将识别到的验证码存入变量
    vars.put("captcha_code", code)
    

    重点: 自动识别验证码依赖于 OCR 技术,准确率可能不高,适用于简单验证码。


    5. 将验证码传入登录接口

    • 在登录请求的 Body 或 Parameters 中添加验证码字段。
    • 例如:{"username": "test", "password": "123456", "code": "${captcha_code}"}

    ✅ 三、完整流程总结(有序列表)

    1. 发送请求获取验证码图片

      • 使用 HTTP Request 访问验证码接口(如 /captcha.png)。
    2. 保存验证码图片(可选)

      • 使用 JSR223 PostProcessor 保存图片以便查看。
    3. 手动输入验证码(适用于测试环境)

      • 在登录请求中直接填写验证码字段。
    4. 自动识别验证码(高级方案)

      • 使用 OCR 服务识别验证码内容。
    5. 将验证码传入登录接口

      • 将识别到的验证码作为参数传递给登录接口。

    ✅ 四、注意事项

    • 验证码有效期:验证码通常有时间限制(如 5 分钟),需确保在有效期内使用。
    • 验证码刷新机制:部分系统会在点击“刷新”按钮后重新生成验证码,需处理刷新逻辑。
    • 反爬机制:有些网站会对频繁请求进行限制,需合理设置线程数和延迟。

    ✅ 五、推荐工具

    | 工具 | 用途 | |------|------| | JMeter | 接口测试、验证码获取 | | Postman | 快速测试接口 | | Tesseract OCR | 开源 OCR 工具 | | 百度 OCR | 商业 OCR 服务 |


    如需进一步帮助,欢迎提供具体的验证码接口地址或截图,我可以帮你定制化脚本!

    评论

报告相同问题?

问题事件

  • 创建了问题 12月1日