解决fidder小黑怪倒出JMeter文件缺失域名、请求头
1、目录结构:
2、代码
'''
coding:utf-8
@Software:PyCharm
@Time:2024/7/10 14:02
@Author:Dr.zxy
'''
import zipfile
import os
import xml.etree.ElementTree as ET
import re
headers_to_extract = [
'Host', 'Connection', 'Content-Length', 'apiversion', 'apicode',
'User-Agent', 'format', 'content-type', 'accept', 'pagecode',
'x-secure-opt-log', 'appcode', 'Origin', 'Referer',
'Accept-Language', 'Accept-Encoding', 'Cookie'
]
def extract_saz(saz_file):
extract_folder = saz_file.replace('.saz', '_extracted')
os.makedirs(extract_folder, exist_ok=True)
with zipfile.ZipFile(saz_file, 'r') as zip_ref:
zip_ref.extractall(extract_folder)
return extract_folder
def convert_to_txt(extract_folder):
for root, _, files in os.walk(extract_folder):
for file in files:
if not file.endswith('.txt'):
original_path = os.path.join(root, file)
new_path = os.path.join(root, os.path.splitext(file)[0] + '.txt')
os.rename(original_path, new_path)
def update_domain_from_comments(xml_file):
tree = ET.parse(xml_file)
root = tree.getroot()
for sampler in root.findall('.//HTTPSamplerProxy'):
testplan_comments = sampler.find(".//stringProp[@name='TestPlan.comments']")
if testplan_comments is not None:
domain_value = testplan_comments.text
domain_prop = sampler.find(".//stringProp[@name='HTTPSampler.domain']")
if domain_prop is not None:
domain_prop.text = domain_value
tree.write(xml_file, encoding='utf-8', xml_declaration=True)
def update_testname(filename):
tree = ET.parse(filename)
root = tree.getroot()
header_managers = root.findall('.//HeaderManager')
for idx, header_manager in enumerate(header_managers):
new_testname = f'{idx:03}-HTTP信息头管理器'
header_manager.set('testname', new_testname)
tree.write(filename, encoding='utf-8', xml_declaration=True)
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
pattern = r'<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="000-HTTP信息头管理器" enabled="true">.*?</HeaderManager>\s*<hashTree\s*/>'
new_content = re.sub(pattern, '', content, flags=re.DOTALL)
with open(filename, 'w', encoding='utf-8') as file:
file.write(new_content)
def convert_to_jmeter_xml(directory, headers_to_extract):
for filename in os.listdir(directory):
if filename.endswith("_c.txt"):
file_path = os.path.join(directory, filename)
numeric_value = filename.split('_')[0].zfill(3)
headers = {}
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
for header in headers_to_extract:
match = re.search(rf'^{header}: (.+)$', content, flags=re.MULTILINE)
if match:
headers[header] = match.group(1)
header_xml = ''
for header, value in headers.items():
header_xml += f'''
<elementProp name="" elementType="Header">
<stringProp name="Header.name">{header}</stringProp>
<stringProp name="Header.value">{value}</stringProp>
</elementProp>'''
jmeter_xml = f'''
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="{numeric_value}-HTTP信息头管理器" enabled="true">
<collectionProp name="HeaderManager.headers">{header_xml}
</collectionProp>
</HeaderManager>'''
output_filename = f'{numeric_value}_jmeter.xml'
output_path = os.path.join(directory, output_filename)
with open(output_path, 'w', encoding='utf-8') as output_file:
output_file.write(jmeter_xml)
def extract_testnames(filename):
testnames = []
tree = ET.parse(filename)
root = tree.getroot()
for header_manager in root.findall('.//HeaderManager'):
testname = header_manager.get('testname', '')
if '-' in testname:
testnames.append(testname.split('-')[0])
return testnames
def read_file_content(filename):
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
return content
def replace_header_manager_content(filename, testname, replacement_content):
tree = ET.parse(filename)
root = tree.getroot()
for header_manager in root.findall('.//HeaderManager'):
if header_manager.get('testname', '').startswith(testname):
header_manager.clear()
header_manager.text = replacement_content
tree.write(filename, encoding='utf-8', xml_declaration=True)
def modify_jmx_file(input_file, output_file):
try:
with open(input_file, 'r', encoding='utf-8') as f:
content = f.read()
content = content.replace('<HeaderManager>', '')
content = content.replace('</HeaderManager>', '')
content = content.replace('<', '<')
content = content.replace('>', '>')
with open(output_file, 'w', encoding='utf-8') as f:
f.write(content)
except FileNotFoundError:
print(f'Error: File {input_file} not found.')
jmx_filename = 'jmx/33n.jmx'
output_file = 'jmx/new_modified.jmx'
if __name__ == "__main__":
saz_file_path = 'files/333.saz'
extract_folder = extract_saz(saz_file_path)
convert_to_txt(extract_folder)
print(f"step1---fidder转换完成!提取文件存放在:{extract_folder}")
update_domain_from_comments(jmx_filename)
print(f"step2---url填充完毕")
update_testname(jmx_filename)
print(f"step3---信息头管理器【序号】添加完成")
convert_to_jmeter_xml(extract_folder+"/raw", headers_to_extract)
print(f"step4---信息头管理器【新节点·生成】生成完成")
testnames = extract_testnames(jmx_filename)
for testname in testnames:
xml_filename = os.path.join(extract_folder+"/raw/", f'{testname}_jmeter.xml')
if os.path.exists(xml_filename):
replacement_content = read_file_content(xml_filename)
replace_header_manager_content(jmx_filename, testname, replacement_content)
else:
print(f"Warning: File {xml_filename} not found.")
print(f"step5---信息头管理器【新节点·替换】完成")
modify_jmx_file(jmx_filename, output_file)
print(f"step6---信息头管理器【新节点·替换清洗】完成")
3、注意事项
4、结果