代码主要实现的是接口测试,测试数据是json类型,保存在exl中
# -*- coding : UTF-8 -*- import urllib.request import urllib.error import json import urllib.parse from Interface_Test.Open_exl import OpenExl #导入打开exl文件 import ast class TestLogin(): def __init__(self, url = '', data = None): self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' self.header = {'User-Agent': self.user_agent} self.url = url self.html = '默认内容是空的~~~' #data数据类型需要是字节型,所以需要类型转换 self.data = json.JSONEncoder().encode(data).encode('utf-8') #self.data = json.dumps(data).encode('utf-8') print(self.data) def open_url(self): try: self.req = urllib.request.Request(self.url, self.data, self.header) self.response = urllib.request.urlopen(self.req) self.html = self.response.read() self.is_status = self.response.getcode() print('---------接口状态码%s,页面可以正常打开---------' % self.is_status) except urllib.error.URLError as e: print('\033[1;31;40m') print('-----------------页面打不开-------------------') print(e) print('\033[0m') self.reason = e return self.html if __name__ == "__main__": #接口URL地址 url = 'http://xxx/xxx/xxx/API.aspx?cmd=' #定义获取接口名和接口参数路径 exc_file = 'D:/xxxx/xxxx/xxxx.xls' #打开exl工作表单 exl_data = OpenExl(exc_file, 0) #获取接口名 interface_name = exl_data.excel_table_data() #print(interface_name) #获取接口参数 interface_data = exl_data.excel_table_data(1) #print(interface_data) #定义计数器,用户获取接口同行参数 count = 1 for each_interface in interface_name[1:]: new_url = url + each_interface print(new_url) #exl里获取的参数是字符串类型,需要转换为字典类型,然后传入主类中进行类型转换 data = ast.literal_eval(interface_data[count]) #print(data) count += 1 login = TestLogin(new_url, data) html = login.open_url().decode('utf-8') #接口返回的字符串存在urlencode编码,需要unquote进行解码 html = urllib.parse.unquote(html) print(html)
需要注意三个点:
1.打开URL时,参数有时传入的是json类型的,但是post进去的数据类型是byte类型的,需要转码
json.JSONEncoder().encode(data).encode('utf-8')
或者使用 json.dumps(data).encode('utf-8')进行转码
2.从exl中获取的值是str类型的,但是程序要求传入的值是dict类型的,此时需要类型转换
ast.literal_eval(interface_data[count])
3.接口返回的数据类型有时是‘%e6%96%b0%e6%ac%be%e6%98%a5’这样的,原因是接口返回的值是urlencode编码的,需要通过unquote进行解码:
urllib.parse.unquote(html)