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

news2024/9/24 5:33:46

简介

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

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

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

登录函数

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-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": "<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-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": "<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.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、哈哈,各位小伙伴们,封装与调用--函数和参数化就是这么简单!!!小编能力有限欢迎各位批评指正。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

股票开户手续费最低的券商有哪些?揭秘券商成本佣金,交易费率原来可以这么低!

哪个券商手续费最低实际上是没有这种说法的&#xff0c;想要低手续费一定要联系线上客户经理办理开户&#xff0c;是可以和线上客户经理协商降低手续费的&#xff0c;一定要通过线上客户经理特殊渠道开户&#xff0c;才能享受低手续费账户&#xff0c;还可以办理到vip账户&…

Python中可以用三种方法判断文件是否存在

目录 前言1.使用os模块2.使用Try语句3. 使用pathlib模块尾语 &#x1f49d; 前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 通常在读写文件之前&#xff0c;需要判断文件或目录是否存在&#xff0c;不然某些处理方法可能会使程序出错。 所以最好在做任何操作之前&#xff…

spring复习:(22)实现了BeanNameAware等Aware接口的bean,相应的回调方法是在哪里被调用的?

AbstractAutowireCapableBeanFactory的doCreateBean用来创建bean, 其中调用了initializeBean方法对bean进行初始化 initializeBean包含如下代码&#xff1a; 而invokeAwareMethods代码如下&#xff1a; 可见其分别判断是否实现了BeanNameAware接口、BeanClassLoaderAware接口…

【Linux指令sudo与Linux编译器-gcc/g++】

目录 一、sudo1.1为什么我用不了sudo命令1.2如何将普通用户添加到信任列表里面 二、Linux编译器-gcc/g使用2.1背景知识2.2gcc如何完成上面的4个功能&#xff1f;2.3函数库 一、sudo sudo是linux系统管理指令&#xff0c;是允许系统管理员让普通用户执行一些或者全部的root命令…

金融行业数据安全相关法律法规及政策汇总

如今随着大数据和“互联网”等新兴技术的拓展&#xff0c;数据的作用也在不断凸显&#xff0c;金融业是产生和积累数据量最大、数据类型最丰富的行业之一&#xff0c;数据安全与个人信息保护在新时代也面临新的风险与挑战。 根据《中国银行保险报》与亚信网络安全产业技术研究院…

CCPC 2022济南站+2020威海站+2019秦皇岛站+2022绵阳站(部分)(暑假集训)

目录 Tower Frozen Scoreboard Identical Parity​编辑 Best Carry Player Stack Sort Invoker MUV LUV EXTRA Forest Program Angle Beats Catch You Catch Me Tower 思路&#xff1a; 提前进行/2的预处理操作&#xff0c;操作之后 &#xff0c;在记录下要达到一样的步骤…

JavaFX 基础

1.JavaFX应用的程序基本结构 窗口(stage)&#xff1a;窗口里面可以设置场景&#xff0c;但是一次只能显示一个场景。 场景(scene)&#xff1a;场景可以添加UI组件图的树形结构。 根节点(parent)&#xff1a;根节点设置为一个布局&#xff0c;放置不同的节点(组件)。可以在根节…

备战秋招 | 笔试强训2

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输出左对齐30个字符&#xff0c;4位精度。以下哪个选项是正确的&#xff1f; A. %-30.4e B. %4.…

白皮书案例解读|数字孪生与港口的结合会碰撞出什么样的火花呢?

以下案例来自于《数字孪生世界白皮书&#xff08;2023版&#xff09;》 领取方式&#xff1a;公众号「EasyV数字孪生」后台回复「白皮书」即可领取&#xff01; 嗨&#xff0c;我又出现啦&#xff5e;今天想和大家聊聊关于港口场景数字孪生技术的应用&#xff0c;欢迎大家踊跃…

Linux登录时,下游回显非常慢

目录 问题现象 原因分析 解决方法 源码等资料获取方法 问题现象 登录linux时&#xff0c;远程连接正常&#xff0c;[root...]回显非常慢&#xff0c;在执行脚本时&#xff0c;很容易导致命令下发错乱 原因分析 家目录下的.bash_history文件太大&#xff0c;导致每次登陆时读…

magento2 二次开发如何自定义theme

1.在app\design\frontend下创建自定义Theme文件夹&#xff0c;格式为Vendor/ThemeName&#xff0c;比如TestCompany/test 2.在TestCompany/test目录下创建文件夹和文件如下&#xff1a; etc 非必须创建 在此目录下添加view.xml&#xff0c;内容如下&#xff1a; view.xml可定…

Occupy the Cities - 思维+二分

分析&#xff1a; 分析每一个0的位置&#xff0c;记录每一个0距离两侧的1的最近距离&#xff0c;每一个1要么向左扩展要么向右扩展&#xff0c;可以将扩展过的1标记&#xff0c;如果需要向另一侧扩展&#xff0c;那么必须满足距离另一侧的0的距离加1小于等于时间&#xff0c;比…

网络安全行业的那些岗位

网络安全行业&#xff0c;正在蓬勃发展&#xff0c;想要找网络安全岗位的&#xff0c;可以参考这篇文章 一、网络安全岗位 1、需要网络安全人员的企业 有三种企业招聘网络安全人员&#xff1a;乙方企业、甲方企业、国有企业 乙方企业是专门从事网络安全行业的企业&#xff0c…

用Arthas快速定位线上JVM问题!

Arthas分析FullGC问题定位 对于FullGC那一定不会陌生,一般来说会采用横切FullGC前置拦截(-XX:+HeapDumpBeforeFullGC)和后置拦截(-XX:+HeapDumpAfterFullGC),导出FullGC发生前后的heap dump文件,以便于我们进行FullGC原因的分析和定位。 推测分析问题之FullGC的频率过高…

SpringBoot2+Vue2实战(十八)修改密码

一、修改密码&#xff1a; Header.vue <el-dropdown-item style"font-size: 14px; padding: 5px 0"><router-link to"/password" style"text-decoration: none">修改密码</router-link></el-dropdown-item> router/i…

tensorrt8.5.2安装,并解决CMAKE找不到tensorrt问题

ubuntu20.04、cuda11.1、cudnn8.0.5&#xff08;后续要更新到8.6.0&#xff09; tensorrt下载网址&#xff1a;NVIDIA TensorRT 8.x Download | NVIDIA Developer 选择自己合适的cuda安装 下载的时候可以使用wget wget https://developer.download.nvidia.com/compute/machin…

【springboot】RestTemplate序列化RedisSerializer到底该选哪个

RedisTemplate是Spring Data Redis提供给用户的最高级的抽象客户端&#xff0c;用户可直接通过RedisTemplate对Redis进行多种操作。 在项目中使用需要引入如下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>…

ScrollRect滚动区域Content列表项数据钳制取值问题

问题 如下图示例&#xff0c;是一个选择日期、时间的日历控件&#xff0c;右侧小时与分钟的部分是两个Scroll Rect滚动区域组件&#xff0c;滚动到中间高亮部分表示选择&#xff0c;那么如何让滚动停止在合适的位置&#xff1f;避免出现如图所示的停在两个数据项中间的情况。 …

Slam十四讲之第一讲和第二讲,实践编程基础

目录 1.镜像寻找①方法1&#xff1a;百度网盘下载②方法2&#xff1a;在开源镜像网站上下载&#xff0c;③方法3&#xff1a;直接在Ubuntu官网下载 2 在VMware中创建虚拟机并安装Ubuntu18.043 安装VMware Tools4 初始系统中&#xff0c;部分软件的安装4.1 gcc 安装4.2 g安装4.3…

Word 插件实现读取excel自动填写

日常工作中碰到需要将EXCEL的对应数据记录填写到word文档对应的位置&#xff0c;人工操作的方式是&#xff1a; 打开exel表—>查找对应报告号的行—>逐列复制excel表列单元格内容到WORD对应的位置&#xff08;如下图标注所示&#xff09; 这种方法耗时且容易出错。实际上…