Files
apiautotest/case_utils/requests_utils/extract_data_handle.py
floraachy a01db401bf 调整响应数据提取,支持通过yaml用例数据传参提取指定格式的参数
支持3种类型的数据提取:1. 通过jsonpath从response.json()提取数据; 2. 通过正则表达式从response.text提取; 3. 直接从response提取cookies之类;
2023-12-05 14:02:27 +08:00

72 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
# @Time : 2023/6/28 14:35
# @Author : chenyinhua
# @File : extract_data_handle.py
# @Software: PyCharm
# @Desc: 提取数据的一些方法
# 标准库导入
import re
# 第三方库导入
from jsonpath import jsonpath
from loguru import logger
from requests import Response
def json_extractor(obj: dict, expr: str = '.'):
"""
从目标对象obj, 根据表达式expr提取指定的值
:param obj :json/dict类型数据
:param expr: 表达式, . 提取字典所有内容, $.test_api_case 提取一级字典case $.test_api_case.data 提取case字典下的data
:return result: 提取的结果,未提取到返回 None
"""
try:
result = jsonpath(obj, expr)[0] if len(jsonpath(obj, expr)) == 1 else jsonpath(obj, expr)
logger.trace(f"\n提取表达式: {expr} \n"
f"提取值类型: {type(result)}\n"
f"提取值:{result}\n")
return result
except Exception as e:
logger.trace(f"\n提取表达式: {expr}\n"
f"提取对象: {obj}\n"
f"错误信息:{e}\n")
def re_extract(obj: str, expr: str = '.'):
"""
从目标对象obj, 根据表达式expr提取指定的值
:param obj : 字符串数据
:param expr: 正则表达式
:return result: 提取的结果,未提取到返回 None
"""
try:
# 如果提取后的数据长度为1则取第一个元素返回str否则返回列表
result = re.findall(expr, obj)[0] if len(re.findall(expr, obj)) == 1 else re.findall(expr, obj)
logger.debug(f"\n提取表达式: {expr}\n"
f"提取值类型: {type(result)}\n"
f"提取值:{result}\n")
return result
except Exception as e:
logger.debug(f"\n提取表达式: {expr}\n"
f"提取对象: {obj}\n"
f"错误信息:{e}\n")
def response_extract(response: Response, expr: str = '.'):
"""
从response响应对象提取cookies之类
:param response : response对象
:param expr: 提取表达式。部分参考response.status_code response.cookies, response.text, response.headers, response.is_redirect
:return result: 提取的结果,未提取到返回 None
"""
try:
result = eval(expr)
logger.debug(f"\n提取表达式: {expr}\n"
f"提取值类型: {type(result)}\n"
f"提取值:{result}\n")
return result
except Exception as e:
logger.debug(f"\n提取表达式: {expr}\n"
f"提取对象: {response}\n"
f"错误信息:{e}\n")