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

简介

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

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

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

登录函数

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

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

如果你想学习接口自动化测试,我这边给你推荐一套视频,这个视频可以说是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 参数需要在这里提取

提取 postid

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

删除草稿

1、传个 url 和 postid 就可以了

参考代码

 1 # coding=utf-82 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 #2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-5-137 @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": "<p>"+body_data+"</p>",
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登录替换登录这个动作

改造代码如下

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

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

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

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

 

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

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

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

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

postid

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

代码运行结果

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

 改造后参考代码

  1 # coding=utf-82 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 #2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-5-137 @author: 北京-宏哥8 Project:学习和使用封装与调用--函数和参数化9 '''10 #3.导入模块11 import requests12 # # 先打开登录首页,获取部分cookie13 # 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 或 False36  '''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": "<p>"+body_data+"</p>",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.url53 def get_postid(u):54  '''正则提取 postid'''55  import re56  postid = re.findall(r"postid=(.+?)&", u)57  print (postid) # 这里是 list58  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  #登录url71  url = "https://passport.cnblogs.com/user/signin"72  payload = {73  "input1": "xxx",74  "input2": "xxx",75  "remember": True76  }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  # 添加登录需要的两个cookie89  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.content99 
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、哈哈,各位小伙伴们,封装与调用--函数和参数化就是这么简单!!!小编能力有限欢迎各位批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20338.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杂记:逆向一块FPGA核心板

最近太热了&#xff0c;实在无心看书。阵列书丢一边看不进去&#xff0c;还买了几本统计信号的甚至都没开始看&#xff08;笑&#xff09;&#xff0c;躺在床上玩玩手机摆烂&#xff0c;看到某黄色APP上有老板卖拆机的板子&#xff0c;价格美丽&#xff0c;美中不足的是没有资料…

SpringBoot集成MQTT

官网配置说明 MQTT Supporthttps://docs.spring.io/spring-integration/reference/html/mqtt.html#mqtt Spring integration交互逻辑 对于发布者&#xff1a; 消息通过消息网关发送出去&#xff0c;由 MessageChannel 的实例 DirectChannel 处理发送的细节。DirectChannel …

自动驾驶与智能网联场地测试一体化装备应用

自动化驾驶层级与结构 L1:能够辅助驾驶员玩车某些驾驶任务制动防抱死系统 (ABS),车身电子稳定系统 (ESP)等,这些配置就是L1级别的运用。 L2:部分自动化,在L2的级别里,必须要具备的是自适应巡航系统,主动车道保持系统自动刹车辅助系统以及自动泊车系统等系统。 L3:有条件…

【Android】从零搭建组件化项目

组件化系列文章介绍的内容稍微多了点&#xff0c;本着研究透这玩意的精神&#xff0c;从组件化的简介开始说起。 目录 简介组件化、模块化与插件化开始创建配置共享文件打包模式配置APT与JavaPoet 简介 什么是组件化&#xff1f; 将多个功能模板拆分、重组的过程。 为什么要使…

基于单片机智能衣柜 智能衣橱 换气除湿制系统紫外线消毒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前衣柜温湿度和柜门开启关闭状态&#xff1b;按键设置当前衣柜湿度上限值、衣柜门打开和关闭&#xff0c;杀菌消毒&#xff1b;当湿度超过设置上限&#xff0c;继电器闭合开启风扇进行除湿&#xff1b;进行杀菌消毒时&am…

量子近似优化算法(QAOA)入门(1):从量子绝热算法(QAA)角度的直观理解

文章目录 前言&#xff1a;量子计算的本质是测量一、基于量子逻辑电路的常用算法1.NISQ&#xff1a;Noisy Intermediate-Scale Quantum&#xff08;含噪声中等规模量子&#xff09; 二、量子绝热算法&#xff08;QAA&#xff1a;Quantum Adiabatic Algorithm&#xff09;1.QAA的…

爬虫入门07——requests中携带cookie信息

爬虫入门07——requests中携带cookie信息 对于需要登陆的网站如果不携带cookie是无法获取我们所需内容的就以查看我在CSDN中的订单为例&#xff0c;在登陆后可以查看到订单信息 而当我们使用Python代码发出请求时&#xff0c;是不携带cookie&#xff0c;因此无法拿到订单相关信…

查看某个三方依赖jar包是在哪个pom引入的(springboot+idea)

项目springboot1升级2版本&#xff0c;日志框架使用的是log4j&#xff0c;升级到springboot2版本某些依赖引入了logback依赖包&#xff0c;然后项目启动报错&#xff1a; 查看这个SLF4JLoggerContextFactory这个类是在哪个jar包下 使用idea的maven依赖图查看功能寻找是哪个p…

page_dewarp实现弯曲文本矫正

朋友们&#xff0c;如果你使用ocr&#xff0c;再识别的时候会遇到文本扭曲的问题&#xff0c;为了解决这个问题&#xff0c;需要进行弯曲文本矫正&#xff0c;这里推荐一个开源项目&#xff0c;可以使用上面的功能进行矫正&#xff0c;不过里面可能需要改动一些代码&#xff0c…

Go []uint8和string的爱恨情仇

先上代码&#xff1a; package mainimport "fmt"func main() {byteSlice : []uint8{52, 44, 51} // 示例字节切片str : string(byteSlice)fmt.Printf("byteSlice:%v\r\n", str) }// 执行-输出 byteSlice:4,3 干货&#xff1a; 在Go语言中&#xff0c;[]u…

【逻辑回归实例】

逻辑回归&#xff1a;从理论到实践 在本文中&#xff0c;我们将介绍一种被广泛用于二分类问题的机器学习模型——逻辑回归。我们将通过一个实例&#xff0c;深入解析如何在 Python 环境中实现逻辑回归。 源数据下载链接 1. 什么是逻辑回归&#xff1f; 逻辑回归是一种用于解…

怎么给pdf文件加密?pdf文档如何加密

在数字化时代&#xff0c;保护个人和机密信息的重要性越来越受到关注。PDF&#xff08;Portable Document Format&#xff09;是一种广泛使用的文件格式&#xff0c;用于共享和存储各种类型的文档。然而&#xff0c;由于其易于编辑和复制的特性&#xff0c;保护PDF文件中的敏感…