最近,项目要求使用apifox编写接口自动化,所用系统使用文档批量操作比较频繁,于是研究了一下使用自定义脚本的方式,自动修改excel文件内容,并调用上传接口。
这里使用的python脚本,由于apifox调用脚本执行的命令,实际与命令行执行语句的形式一致(例如,脚本pm.execute(‘md5-json.py’, [‘abc’,‘bcd’]),实际执行命令为python md5-json.py abc bcd),所以,我猜想,我只要编写一个脚本,可以通过cmd命令行执行脚本中的函数,我就可以通过apifox来完成脚本的调用。于是,就有了以下脚本。
import openpyxl as op
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--empName', type=str, default=None)
parser.add_argument('--empIdcard', type=str, default=None)
args = parser.parse_args()
print(f'员工姓名:,args.empName={args.empName}')
print(f'身份证号:,args.empIdcard={args.empIdcard}')
filePath = "E:\\apifox\\xxx.xlsx" # 文件路径
tableAll = op.load_workbook(filePath)
table1 = tableAll['Sheet1'] # sheet名称
table1.cell(2, 1, args.empName) # 将员工姓名填入excel中的第二行第一列
table1.cell(2, 2, args.empIdcard) # 将员工身份证填入excel中的第二行第二列
tableAll.save(filePath)
这里一共调用了两个库,openpyxl 用于执行excel的读写,argparse用于给python脚本传参,这里我一共定义了两个参数,都是string类型的。脚本编写成功后,可以通过cmd命令行来验证 是否可以传参及excel是否修改成功。
进入python文件所在路径,执行:python 文件名.py --empname=测试数据1 --empidcard=测试数据2
到这里python脚本就准备好了,下一步,需要通过apifox来给我们的python脚本传参。
第一步,点击apifox右上角或者左下角的设置按钮,点击外部程序,打开目录,将刚才的python脚本丢进去。
第二步,再需要上传文件的接口处增加前置操作-自定义脚本:
try {
//员工姓名
var empname = '--empName='+'测试';
//获取员工身份证
var empidcard = '--empIdcard='+pm.globals.get("emp_idcard1");
//将员工姓名、身份证填写到批量减档的模板上
pm.execute("projectReduce.py",[empname,empidcard]);
} catch (e) {
console.error(e.message)
}
这里我的参数是从全局变量取值的,由于python执行的语句为:pm.execute(‘md5-json.py’, [‘abc’,‘bcd’]),所以我需要把需要的参数提前拼接成string格式。然后还加了一个异常处理,这里是为了获取python语句执行失败的报错信息的。
第三步,在接口传参的body里面,添加文件上传,增加对应的content-type,调试接口是否成功。
注:这种方法适合,一次修改的参数比较少的场景,如果修改的参数比较多,还可以通过先把前置脚本,把需要变更的参数传到txt文档,再通过python文件调用txt文件中的参数,实现变更excel文件参数值(虽然没试过,但是应该可行)