python接口自动化(三十四)-封装与调用--函数和参数化(详解)
简介
前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到。接下来这篇由我带领小伙伴们把每一
个鼠标点击动作写成一个函数,这样更方便维护了,而且可读性也高,后期其他维护人员在维护代码的时候看起来赏心悦目,就不会骂娘了。
参数化的思维只需记住一点:不要写死,这样就便于维护,否则就会牵一发而动全身,一处修改导致处处修改,不便于维护。
登录函数
1、s 参数是 session 的一个实例类,先放这里,方便写后面代码
2、登录函数传三个参数,s 是需要调用前面的 session 类,所以必传,可以传个登录的 url,然后 payload 是账号和密码
保存草稿
1、编辑内容的标题 title 和正文 body_data 参数化了,这样后面可以方便传不同值
2、这里返回了获取到新的 url 地址,因为后面的 postid 参数需要在这里提取
提取 postid
1、这里用正则表达式提取 url 里面的 postid
删除草稿
1、传个 url 和 postid 就可以了
参考代码
# coding=utf-
#.先设置编码,utf-8可支持中英文,如上,一般放在第一行 #.注释:包括记录创建时间,创建人,项目名称。
'''
Created on --
@author: 北京-宏哥
Project:学习和使用封装与调用--函数和参数化
'''
#.导入模块
import requests def login(s, url, payload): headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0", "Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/json; charset=utf-8",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": "",
"Cookie": "xxx 已省略",
"Connection": "keep-alive"
}
r = s.post(url, json=payload, headers=headers, verify=False)
result = r.json()
print (result)
return result['success'] # 返回 True 或 False def save_box(s, url2, title, body_data):
'''# 获取报存之后 url 地址'''
body = {"__VIEWSTATE": "",
"__VIEWSTATEGENERATOR": "FE27D343",
"Editor$Edit$txbTitle": title,
"Editor$Edit$EditorBody": "<p>"+body_data+"</p>",
"Editor$Edit$Advanced$ckbPublished": "on",
"Editor$Edit$Advanced$chkDisplayHomePage": "on",
"Editor$Edit$Advanced$chkComments": "on",
"Editor$Edit$Advanced$chkMainSyndication": "on",
"Editor$Edit$lkbDraft": "存为草稿",
}
r2 = s.post(url2, data=body, verify=False)
print(r2.url)
return r2.url
def get_postid(u):
'''正则提取 postid'''
import re
postid = re.findall(r"postid=(.+?)&", u)
print (postid) # 这里是 list
if len(postid) < :
return ''
else:
return postid[]
def delete_box(s,url3, postid):
'''删除草稿箱'''
json3 = {"postId": postid}
r3 = s.post(url3, json=json3, verify=False)
print (r3.json())
if __name__ == "__main__":
#-------------由于博客园的登录机制改变这部分代码仅作为参考start-------
'''
#登录url
url = "https://passport.cnblogs.com/user/signin"
payload = {
"input1": "xxx",
"input2": "xxx",
"remember": True
}
s = requests.session()
login(s, url, payload)
'''
# -------------由于博客园的登录机制改变这部分代码仅作为参考end------- #编辑随笔url
url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1"
u = save_box(s, url2, "北京-宏哥学习和使用封装与调用--函数和参数化", "1、学习和使用封装与调用--函数和参数化")
postid = get_postid(u)
# 删除随笔url
url3 = "https://i.cnblogs.com/post/delete"
delete_box(s, url3, postid)
由于博客园的登录机制改变,我们想要让代码跑起来还需要用老办法绕过验证码通过cookie登录替换登录这个动作
改造代码如下
第一步:将登录方法注释掉
第二步:将登录方法所传的参数和调用登录的方法注释掉
第三步:通过cookie登录绕过验证码,实现登录
第五步:直接运行代码,查看结果
第六步:由于我们新增又删除,所以看到的界面看到的效果还是不太明显,为了让小伙伴们看到明显效果,我们这里还是通过老方法:打断点
第七步:在调用删除随笔的方法前打断点,双击方法前边出现一个大红点
第八步:debug运行代码,点击右上角的昆虫
第九步:浏览器登录查看随笔页面
postid
第十步:继续运行。执行删除随笔的方法
代码运行结果
第十一步:刷新随笔页面,查看刚刚新增的那条随笔消失了
改造后参考代码
# coding=utf-
#.先设置编码,utf-8可支持中英文,如上,一般放在第一行 #.注释:包括记录创建时间,创建人,项目名称。
'''
Created on --
@author: 北京-宏哥
Project:学习和使用封装与调用--函数和参数化
'''
#.导入模块
import requests
# # 先打开登录首页,获取部分cookie
# url = "https://passport.cnblogs.com/user/signin"
# # 登录成功后保存编辑内容
# url2= "https://i.cnblogs.com/EditPosts.aspx?opt=1"
# s = requests.session() #s参数作为全局变量
#-------------由于博客园的登录机制改变这部分代码仅作为参考start-------
'''
def login(s, url, payload): headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0", "Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/json; charset=utf-8",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": "",
"Cookie": "xxx 已省略",
"Connection": "keep-alive"
}
r = s.post(url, json=payload, headers=headers, verify=False)
result = r.json()
print (result)
return result['success'] # 返回 True 或 False
'''
# -------------由于博客园的登录机制改变这部分代码仅作为参考end-------
def save_box(s, url2, title, body_data):
'''# 获取报存之后 url 地址'''
body = {"__VIEWSTATE": "",
"__VIEWSTATEGENERATOR": "FE27D343",
"Editor$Edit$txbTitle": title,
"Editor$Edit$EditorBody": "<p>"+body_data+"</p>",
"Editor$Edit$Advanced$ckbPublished": "on",
"Editor$Edit$Advanced$chkDisplayHomePage": "on",
"Editor$Edit$Advanced$chkComments": "on",
"Editor$Edit$Advanced$chkMainSyndication": "on",
"Editor$Edit$lkbDraft": "存为草稿",
}
r2 = s.post(url2, data=body, verify=False)
print(r2.url)
return r2.url
def get_postid(u):
'''正则提取 postid'''
import re
postid = re.findall(r"postid=(.+?)&", u)
print (postid) # 这里是 list
if len(postid) < :
return ''
else:
return postid[]
def delete_box(s,url3, postid):
'''删除草稿箱'''
json3 = {"postId": postid}
r3 = s.post(url3, json=json3, verify=False)
print (r3.json())
if __name__ == "__main__":
#-------------由于博客园的登录机制改变这部分代码仅作为参考start-------
'''
#登录url
url = "https://passport.cnblogs.com/user/signin"
payload = {
"input1": "xxx",
"input2": "xxx",
"remember": True
}
s = requests.session()
login(s, url, payload)
'''
# -------------由于博客园的登录机制改变这部分代码仅作为参考end-------
url = "https://passport.cnblogs.com/user/signin"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0"
} # get方法其它加个ser-Agent就可以了
s = requests.session()
r = s.get(url, headers=headers, verify=False)
print(s.cookies)
# 添加登录需要的两个cookie
c = requests.cookies.RequestsCookieJar()
c.set('.CNBlogsCookie',
'XXX') # 填上面抓包内容 具体查看前边的cookie登录,这里不赘述
c.set('.Cnblogs.AspNetCore.Cookies',
'XXX') # 填上面抓包内容 具体查看前边cookie登录,这里不赘述
c.set('AlwaysCreateItemsAsActive', "True")
c.set('AdminCookieAlwaysExpandAdvanced', "True")
s.cookies.update(c)
print(s.cookies)
result = r.content #编辑随笔url
url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1"
u = save_box(s, url2, "北京-宏哥学习和使用封装与调用--函数和参数化", "1、学习和使用封装与调用--函数和参数化")
postid = get_postid(u)
# 删除随笔url
url3 = "https://i.cnblogs.com/post/delete"
delete_box(s, url3, postid)
小结
1、封装好处:
第一:重用;
第二:不必关心具体的实现;
第三:面向对象三大特征之一;
第四,具有安全性!
2、哈哈,各位小伙伴们,封装与调用--函数和参数化就是这么简单!!!小编能力有限欢迎各位批评指正。
python接口自动化(三十四)-封装与调用--函数和参数化(详解)的更多相关文章
- python接口自动化(十八)--重定向(Location)(详解)
简介 在实际工作中,有些接口请求完以后会重定向到别的url,而你却需要重定向前的url.URL主要是针对虚拟空间而言,因为不是自己独立管理的服务器,所以无法正常进行常规的操作.但是自己又不希望通过主域 ...
- python接口自动化(十四)--session关联接口(详解)
简介 上一篇cookie绕过验证码模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等等,这时候如何保持会话呢?这里我以jenkins平台为例,给小伙伴们在沙场演练一下. se ...
- python接口自动化测试三十四:github上某接口测试平台及配置
TeserHome地址:https://testerhome.com/opensource_projects/60前端:https://github.com/pencil1/ApiTestWeb 实现 ...
- python接口自动化(十一)--发送post【data】(详解)
简介 前面登录博客园的是传 json 参数,由于其登录机制的改变没办法演示,然而在工作中有些登录不是传 json 的,如 jenkins 的登录,这里小编就以jenkins 登录为案例,传 data ...
- python接口自动化(十)--post请求四种传送正文方式(详解)
简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...
- python简说(十四)内置函数
# sorted 排序# map 循环调用函数的,保存返回值# filter 循环调用函数,如果函数返回false,那么就过滤掉这个值,是指从你传入的这个list里面过虑. def abc(num ...
- VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很常用很重要的控件.本节开始鸡啄米将为大家讲解菜单的概念及使用. 菜单简介 菜单在界面设计中 ...
- python接口自动化(三十九)- logger 日志 - 上(超详解)
简介 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP, ...
- python接口自动化(十六)--参数关联接口后传(详解)
简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础.因此再在沙场实例演练一下博客园的相关接口.我们用自动化发随笔之后,要想接着对这篇随笔操 ...
随机推荐
- 关于Socket的建立及连接
最近在做一个东西,目前考虑的是采用Socket连接,从网上找了一个SuperSocket的socket通信框架.... 关于Socket连接,个人并不是搞得太懂,写的东西也全是个人理解,那么这里先整理 ...
- PowerDesigner 在通过jdbc连接数据库时 Could not Initialize JavaVM!
最近用到PowerDesigner的逆向工程,从数据库中逆向生成模型,本想使用odbc连接的,但是需要安装驱动,mysql的还好弄,oracle对我来讲实在是有些麻烦,看到能用jdbc连接,就想试试, ...
- SqlServer判断数据库、表、字段、存储过程、函数是否存在
原文:SqlServer判断数据库.表.字段.存储过程.函数是否存在 判断数据库是否存在 if exists (select * from sys.databases where name = '数据 ...
- C#6.0一些特性
1.自动属性初始化的改进 声明属性时可以直接进行初始化 public int id {get;set;}=10; 自动属性是省去了get和set内部的过程,而直接用set;get;这样的语句代替, 把 ...
- MongoDB数据库和集合的基本操作
非关系型数据库 命令区分大小写:命令结束符为回车(与MySQL不同之处) mongodb配置 sudo service mongodb start mongo mongodb基本概念 集合对应于关系型 ...
- DirectX的替代品 SDL 简介
DirectX的替代品 SDL 简介 什么是SDL? 即 Simple DirectMedia Layer,使用 LGPL 许可证. 免费的跨平台多媒体应用编程接口 用于游戏.游戏开发工具.模拟器.样 ...
- Silverlight ItemsControl详细解析+解惑
Silverlight最强大的地方就在于定义控件了,Silverlight提供了非常灵活和高效的控件定义方式,几乎可以实现任何复杂的控件实现,对于快速开发应用程序有着重要的意义.在Silverligh ...
- Spring Schema扩展机制
1:概述 Spring2.0开始,Spring提供XML Schema可扩展机制,用户可以自定义XML Schema文件,并自定义 XML Bean解析器,集成到Spring IOC容器中. 2:步骤 ...
- 线性表List
数组array是基本的数据结构,但它的功能有限,线性表list可以认为是扩展了功能的数组.可以自动调整大小.添加和删除元素不需要其他元素移位. 根据指针数量和指向的不同,线性表分为单向链表.双向链表和 ...
- 第一个SpringBoot测试实例
1.SpringBoot项目构建:http://start-spring.io 自动化构建SpringBoot项目,保存在本地并解压 2.安装gradle并配置gradle环境 3.配置阿里云ma ...