python接口自动化(三十四)-封装与调用--函数和参数化(详解)

简介

  前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到。接下来这篇由我带领小伙伴们把每一

个鼠标点击动作写成一个函数,这样更方便维护了,而且可读性也高,后期其他维护人员在维护代码的时候看起来赏心悦目,就不会骂娘了。

  参数化的思维只需记住一点:不要写死,这样就便于维护,否则就会牵一发而动全身,一处修改导致处处修改,不便于维护。

登录函数

1、s 参数是 session 的一个实例类,先放这里,方便写后面代码

2、登录函数传三个参数,s 是需要调用前面的 session 类,所以必传,可以传个登录的 url,然后 payload 是账号和密码

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第1张图片

如果你想学习接口自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386    

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1.【接口自动化】目前软件测试的市场行情以及测试人员能力标准。、2.【接口自动化】全面熟练Requests库以及底层方法调用逻辑、3.【接口自动化】接口自动化实战及正则和JsonPath提取器的应用等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337&vd_source=488d25e59e6c5b111f7a1a1a16ecbe9a 

保存草稿

1、编辑内容的标题 title 和正文 body_data 参数化了,这样后面可以方便传不同值

2、这里返回了获取到新的 url 地址,因为后面的 postid 参数需要在这里提取

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第2张图片

提取 postid

1、这里用正则表达式提取 url 里面的 postid

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第3张图片

删除草稿

1、传个 url 和 postid 就可以了

参考代码

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-5-13
 7 @author: 北京-宏哥
 8 Project:学习和使用封装与调用--函数和参数化
 9 '''
10 #3.导入模块
11 import requests
12 
13 def login(s, url, payload):
14  
15  headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
16 
17  "Accept": "application/json, text/javascript, */*; q=0.01",
18  "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
19  "Accept-Encoding": "gzip, deflate, br",
20  "Content-Type": "application/json; charset=utf-8",
21  "X-Requested-With": "XMLHttpRequest",
22  "Content-Length": "385",
23  "Cookie": "xxx 已省略",
24  "Connection": "keep-alive"
25  }
26  r = s.post(url, json=payload, headers=headers, verify=False)
27  result = r.json()
28  print (result)
29  return result['success'] # 返回 True 或 False
30  
31 def save_box(s, url2, title, body_data):
32  '''# 获取报存之后 url 地址'''
33  body = {"__VIEWSTATE": "",
34  "__VIEWSTATEGENERATOR": "FE27D343",
35  "Editor$Edit$txbTitle": title,
36  "Editor$Edit$EditorBody": "

"+body_data+"

", 37 "Editor$Edit$Advanced$ckbPublished": "on", 38 "Editor$Edit$Advanced$chkDisplayHomePage": "on", 39 "Editor$Edit$Advanced$chkComments": "on", 40 "Editor$Edit$Advanced$chkMainSyndication": "on", 41 "Editor$Edit$lkbDraft": "存为草稿", 42 } 43 r2 = s.post(url2, data=body, verify=False) 44 print(r2.url) 45 return r2.url 46 def get_postid(u): 47 '''正则提取 postid''' 48 import re 49 postid = re.findall(r"postid=(.+?)&", u) 50 print (postid) # 这里是 list 51 if len(postid) < 1: 52 return '' 53 else: 54 return postid[0] 55 def delete_box(s,url3, postid): 56 '''删除草稿箱''' 57 json3 = {"postId": postid} 58 r3 = s.post(url3, json=json3, verify=False) 59 print (r3.json()) 60 if __name__ == "__main__": 61 #-------------由于博客园的登录机制改变这部分代码仅作为参考start------- 62 ''' 63 #登录url 64 url = "https://passport.cnblogs.com/user/signin" 65 payload = { 66 "input1": "xxx", 67 "input2": "xxx", 68 "remember": True 69 } 70 s = requests.session() 71 login(s, url, payload) 72 ''' 73 # -------------由于博客园的登录机制改变这部分代码仅作为参考end------- 74 75 #编辑随笔url 76 url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1" 77 u = save_box(s, url2, "北京-宏哥学习和使用封装与调用--函数和参数化", "1、学习和使用封装与调用--函数和参数化") 78 postid = get_postid(u) 79 # 删除随笔url 80 url3 = "https://i.cnblogs.com/post/delete" 81 delete_box(s, url3, postid)

由于博客园的登录机制改变,我们想要让代码跑起来还需要用老办法绕过验证码通过cookie登录替换登录这个动作

改造代码如下

第一步:将登录方法注释掉

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第4张图片

第二步:将登录方法所传的参数和调用登录的方法注释掉

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第5张图片

第三步:通过cookie登录绕过验证码,实现登录

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第6张图片

第五步:直接运行代码,查看结果

 

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第7张图片

第六步:由于我们新增又删除,所以看到的界面看到的效果还是不太明显,为了让小伙伴们看到明显效果,我们这里还是通过老方法:打断点

第七步:在调用删除随笔的方法前打断点,双击方法前边出现一个大红点

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第8张图片

第八步:debug运行代码,点击右上角的昆虫

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第9张图片

第九步:浏览器登录查看随笔页面

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第10张图片

postid

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第11张图片

第十步:继续运行。执行删除随笔的方法

代码运行结果

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第12张图片

第十一步:刷新随笔页面,查看刚刚新增的那条随笔消失了

python接口自动化(三十四)-封装与调用--函数和参数化(详解)_第13张图片

 改造后参考代码

  1 # coding=utf-8
  2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
  3 
  4 #2.注释:包括记录创建时间,创建人,项目名称。
  5 '''
  6 Created on 2019-5-13
  7 @author: 北京-宏哥
  8 Project:学习和使用封装与调用--函数和参数化
  9 '''
 10 #3.导入模块
 11 import requests
 12 # # 先打开登录首页,获取部分cookie
 13 # url = "https://passport.cnblogs.com/user/signin"
 14 # # 登录成功后保存编辑内容
 15 # url2= "https://i.cnblogs.com/EditPosts.aspx?opt=1"
 16 # s = requests.session()     #s参数作为全局变量
 17 #-------------由于博客园的登录机制改变这部分代码仅作为参考start-------
 18 '''
 19 def login(s, url, payload):
 20  
 21  headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
 22 
 23  "Accept": "application/json, text/javascript, */*; q=0.01",
 24  "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
 25  "Accept-Encoding": "gzip, deflate, br",
 26  "Content-Type": "application/json; charset=utf-8",
 27  "X-Requested-With": "XMLHttpRequest",
 28  "Content-Length": "385",
 29  "Cookie": "xxx 已省略",
 30  "Connection": "keep-alive"
 31  }
 32  r = s.post(url, json=payload, headers=headers, verify=False)
 33  result = r.json()
 34  print (result)
 35  return result['success'] # 返回 True 或 False
 36  '''
 37  # -------------由于博客园的登录机制改变这部分代码仅作为参考end-------
 38 def save_box(s, url2, title, body_data):
 39  '''# 获取报存之后 url 地址'''
 40  body = {"__VIEWSTATE": "",
 41  "__VIEWSTATEGENERATOR": "FE27D343",
 42  "Editor$Edit$txbTitle": title,
 43  "Editor$Edit$EditorBody": "

"+body_data+"

", 44 "Editor$Edit$Advanced$ckbPublished": "on", 45 "Editor$Edit$Advanced$chkDisplayHomePage": "on", 46 "Editor$Edit$Advanced$chkComments": "on", 47 "Editor$Edit$Advanced$chkMainSyndication": "on", 48 "Editor$Edit$lkbDraft": "存为草稿", 49 } 50 r2 = s.post(url2, data=body, verify=False) 51 print(r2.url) 52 return r2.url 53 def get_postid(u): 54 '''正则提取 postid''' 55 import re 56 postid = re.findall(r"postid=(.+?)&", u) 57 print (postid) # 这里是 list 58 if len(postid) < 1: 59 return '' 60 else: 61 return postid[0] 62 def delete_box(s,url3, postid): 63 '''删除草稿箱''' 64 json3 = {"postId": postid} 65 r3 = s.post(url3, json=json3, verify=False) 66 print (r3.json()) 67 if __name__ == "__main__": 68 #-------------由于博客园的登录机制改变这部分代码仅作为参考start------- 69 ''' 70 #登录url 71 url = "https://passport.cnblogs.com/user/signin" 72 payload = { 73 "input1": "xxx", 74 "input2": "xxx", 75 "remember": True 76 } 77 s = requests.session() 78 login(s, url, payload) 79 ''' 80 # -------------由于博客园的登录机制改变这部分代码仅作为参考end------- 81 url = "https://passport.cnblogs.com/user/signin" 82 headers = { 83 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0" 84 } # get方法其它加个ser-Agent就可以了 85 s = requests.session() 86 r = s.get(url, headers=headers, verify=False) 87 print(s.cookies) 88 # 添加登录需要的两个cookie 89 c = requests.cookies.RequestsCookieJar() 90 c.set('.CNBlogsCookie', 91 'XXX') # 填上面抓包内容 具体查看前边的cookie登录,这里不赘述 92 c.set('.Cnblogs.AspNetCore.Cookies', 93 'XXX') # 填上面抓包内容 具体查看前边cookie登录,这里不赘述 94 c.set('AlwaysCreateItemsAsActive', "True") 95 c.set('AdminCookieAlwaysExpandAdvanced', "True") 96 s.cookies.update(c) 97 print(s.cookies) 98 result = r.content 99 100 #编辑随笔url 101 url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1" 102 u = save_box(s, url2, "北京-宏哥学习和使用封装与调用--函数和参数化", "1、学习和使用封装与调用--函数和参数化") 103 postid = get_postid(u) 104 # 删除随笔url 105 url3 = "https://i.cnblogs.com/post/delete" 106 delete_box(s, url3, postid)

小结

1、封装好处:

第一:重用;

第二:不必关心具体的实现;

第三:面向对象三大特征之一;

第四,具有安全性!

2、哈哈,各位小伙伴们,封装与调用--函数和参数化就是这么简单!!!小编能力有限欢迎各位批评指正。

你可能感兴趣的:(自动化,经验分享,测试用例,压力测试,python,json)