data_hanle中增加对RequestsCookieJar的处理,避免source里面存在RequestsCookieJar, 处理完成后,数据格式不正确的问题.

This commit is contained in:
floraachy
2023-11-14 14:13:20 +08:00
parent 40d20c8f2d
commit f0bd0e262d
3 changed files with 90 additions and 15 deletions
+88 -6
View File
@@ -7,16 +7,21 @@
# 标准库导入
import random
import json
import re, uuid
from datetime import datetime, date, timedelta
# 第三方库导入
from loguru import logger
from faker import Faker
from string import Template
from requests.cookies import RequestsCookieJar
from requests.utils import dict_from_cookiejar
class FakerData:
"""
测试数据生成类
官方文档:https://faker.readthedocs.io/en/master/index.html
"""
def __init__(self):
@@ -85,7 +90,7 @@ class FakerData:
def generate_name(self, lan="en") -> str:
"""
生成人名
:return: 人名
"""
if lan == "zh":
@@ -94,6 +99,66 @@ class FakerData:
name = self.faker.name()
return name
def generate_company_name(self, lan: str = "en", fix: str = None) -> str:
"""
生成公司名
:param lan: 语言类型,可选:en, zh; zh表示中文,en表示英文,默认是en
:param fix: 前后缀,可选pre suf; pre表示公司前缀,suf标识公司后缀
:return: 公司名
"""
if lan == "zh":
if fix == "pre":
name = self.fk_zh.company_prefix()
elif fix == "suf":
name = self.fk_zh.company_suffix()
else:
name = self.fk_zh.company()
else:
if fix == "pre":
name = self.faker.company_prefix()
elif fix == "suf":
name = self.faker.company_suffix()
else:
name = self.faker.company()
return name
def generate_paragraph(self, lan: str = "en", nb: int = 3) -> str:
"""
生成段落
:param lan: 语言类型,可选:en, zh; zh表示中文,en表示英文,默认是en
:param nb: 段落个数,默认是3个
"""
if lan == "zh":
text = self.fk_zh.paragraph(nb_sentences=nb, variable_nb_sentences=True, ext_word_list=None)
else:
text = self.faker.paragraph(nb_sentences=nb, variable_nb_sentences=True, ext_word_list=None)
return text
def generate_words(self, lan: str = "en", nb: int = 1) -> str:
"""
生成词语
:param lan: 语言类型,可选:en, zh; zh表示中文,en表示英文,默认是en
:param nb: 词语个数,默认是1个
"""
if lan == "zh":
if nb == 1 or nb < 1:
text = self.fk_zh.word(ext_word_list=None)
else:
res = self.fk_zh.words(nb=nb, ext_word_list=None)
text = "-".join(res)
else:
if nb == 1 or nb < 1:
text = self.faker.word(ext_word_list=None)
else:
res = self.faker.words(nb=nb, ext_word_list=None)
text = "-".join(res)
return text
def generate_email(self, lan="en") -> str:
"""
@@ -184,6 +249,21 @@ class DataHandle:
except Exception:
return data
def process_cookie_jar(self, data):
"""
将任意数据里的RequestsCookieJar,转成dict,再转换成JSON 格式的字符串(序列化)
:param data: 待处理的数据
"""
if isinstance(data, dict):
for key, value in data.items():
data[key] = self.process_cookie_jar(value)
elif isinstance(data, list):
for i, item in enumerate(data):
data[i] = self.process_cookie_jar(item)
elif isinstance(data, RequestsCookieJar):
data = json.dumps(dict_from_cookiejar(data))
return data
def replace_and_store_placeholders(self, pattern, text):
"""
提取字符串中符合正则表达式的元素,同时用一个唯一的uuid来替换原有字符串
@@ -213,8 +293,13 @@ class DataHandle:
func = {}
keys = {}
if not source or not isinstance(source, dict):
# print("source为空或者source不是字典格式,都将认为是:{}")
logger.debug("source为空或者source不是字典格式,都将认为是:{}")
source = {}
# 处理一下source,检测到里面存在RequestsCookieJar,转成dict,再转换成JSON 格式的字符串(序列化)。
# 避免传递过来一个RequestsCookieJar,替换后变成了'RequestsCookieJar',导致cookies无法使用的问题
source = self.process_cookie_jar(data=source)
# 如果进来的是字符串,先将各种类型的表达式处理完
if isinstance(obj, str):
# 先把python表达式找出来存着,这里会漏掉一些诸如1+1的表达式
@@ -275,15 +360,12 @@ class DataHandle:
else: # 不是FakerData类方法,但有可能是 1+1 这样的
obj = obj.replace(key, str(eval(func)))
except:
print("Warn: --------函数:%s 无法调用成功, 请检查是否存在该函数-------" % func)
logger.warning("Warn: --------函数:%s 无法调用成功, 请检查是否存在该函数-------" % func)
obj = obj.replace(key, funcs[0])
pass
return obj
# 声明data_handle方法,这样外部就可以直接import data_handle来使用了
data_handle = DataHandle().data_handle
@@ -116,14 +116,12 @@ class RequestPreDataHandle:
# 从用例数据中获取cookies 处理cookies
if cookies:
logger.debug(f"打印一下全局变量的值:{GLOBAL_VARS}")
# 通过全局变量替换cookies,得到的是一个str类型
cookies = data_handle(obj=cookies, source=GLOBAL_VARS)
try:
cookies = json.loads(cookies)
except Exception as e:
cookies = cookies
logger.debug(f"处理{cookies}报错了:{e}")
if isinstance(cookies, dict) or isinstance(cookies, http.cookiejar.CookieJar):
self.request_data["cookies"] = cookies
else:
@@ -168,7 +166,6 @@ class RequestPreDataHandle:
if files:
# 将文件处理成绝对路径
self.request_data["files"] = os.path.join(FILES_DIR, files)
logger.debug(f"处理完成后的files:{self.request_data['files']}")
def assert_handle(self):
# 处理响应断言参数
+2 -6
View File
@@ -6,10 +6,8 @@
# @Desc:
# 标准库导入
import json
# 第三方库导入
import pytest
import requests
import allure
from loguru import logger
# 本地应用/模块导入
@@ -72,13 +70,11 @@ def login_init():
try:
res = BaseRequest.send_request(req_data=req_data)
res.raise_for_status()
# 将cookies转成字典,再转成字符串
cookies = json.dumps(requests.utils.dict_from_cookiejar(res.cookies))
GLOBAL_VARS["login_cookie"] = cookies
logger.debug(f"获取用户:{login}登录的cookies成功:{type(res.cookies)} || {res.cookies}")
GLOBAL_VARS["login_cookie"] = res.cookies
GLOBAL_VARS["login"] = res.json()["login"]
GLOBAL_VARS["nickname"] = res.json()["username"]
GLOBAL_VARS["user_id"] = res.json()["user_id"]
logger.debug(f"获取用户:{login}登录的cookies成功:{type(cookies)} || {cookies}")
except Exception as e:
GLOBAL_VARS["login_cookie"] = None
logger.error(f"获取用户:{login}登录的cookies失败:{e}")