自动化测试--python调试脚本过程http知识
作者:互联网
本文主要记录在自动化脚本调试过程中对于Python某些库的或者用法进行学习记录。
注:本次调试是基于Python 2.x,因此以下功能是基于2.x。
首先记录的是re库
re库
关于re库部分知识
import re
re.search(pattern, string, flags=0) ,扫描第二个参数字符串,匹配失败返回none
re.match() 总是从字符串“开头”去匹配,并返回匹配的字符串的match对象,匹配失败返回none
返回的是对象,可以调用group方法来获取字符串
re.findall(pattern, string, flags=0) 返回所有匹配的字符列表
正则表达式部分知识:
re.findall(r"ss",str,0) r标识后面是正则表达式
re.findall(r"^ss","ssddd",0) ^表示匹配以ss开头的字符串,返回为匹配的字符串
re.findall(r"html$","https://docs.python.org/3/whatsnew/3.6.html") $符号表示以html结尾的字符串返回
re.findall(r"[t,w]h","https://docs.python.org/3/whatsnew/3.6.html") [...]匹配括号中的其中一个字符
re.findall(r\d","https://docs.python.org/3/whatsnew/3.6.html") “d”是正则语法规则用来匹配0到9之间的数返回列表
re.findall(r"\w","https://docs.python.org/3/whatsnew/3.6.html") “w”在正则里面代表匹配从小写a到z,大写A到Z,数字0到9
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
json
关于json库
json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串)
json.loads()函数是将json格式数据转换为字典
urllib2/urllib/cookielib
作用:
urllib2:主要是对于htpp/https请求,对于头部进行修改。
urllib:主要是对于请求的数据进行转换。
cookielib:配合urllib2进行使用,存储会话cookie
关于摘要/基础认证相关代码
# -*- coding: utf-8 -*-
import httplib,urllib,urllib2
import base64
#定义url
url="http://ip:port/xx/xx/x/x"
#实例化摘要认证
auth=urllib2.HTTPDigestAuthHandler()
#若需要基础认证则 改为auth=urllib2.HTTPBasicAuthHandler()
##添加用户名和密码 第一个参数请求的域名,请求URL,用户名,密码
auth.add_password("请求的域名", url, "用户名", "密码")
opener = urllib2.build_opener(auth)
urllib2.install_opener(opener)
res_data = opener.open(url) # 此方法也可以用 urllib2.urlopen(url) 代替 ,
'''
# res_data = urllib2.Request(url)
# rsp=urllib2.urlopen(res_data)
代替 res_data = opener.open(url)也可以
'''
# res_data = urllib2.Request(url)
# rsp=urllib2.urlopen(res_data)
#返回值.read() 将实例对象转换为字符串
res = res_data.read()
print res
#关于摘要认证中的域名如何获取?
#使用httplib库,代码如下
# -*- coding: utf-8 -*-
import httplib,urllib,urllib2
import base64
def http_get_digest_realm(url="",hostname="",port=""):
iHttpPort = int(port)
#创建一个HTTP类型请求连接,返回一个HTTPConnect对象 hostname参数不需要带http,
httpClient = httplib.HTTPConnection(hostname, iHttpPort)
#第一个参数请求方法 URL 第二个 请求网页路径 第三个body请求体 第四个 请求头部,无返回值相当于向服务器发送数据
httpClient.request('GET', url, '', {})
#后去请求的值
response = httpClient.getresponse()
#返回值转换为字符串
msg = str(response.msg)
print msg
#获取realm值
realm = msg.split('realm="')[1].split('"')[0]
httpClient.close()
return realm
print http_get_digest_realm("http://xx/xx/x/,"IP","80")
urlopeny原型,可以看出来可以传输data
用于打开一个URL,URL可以是一个字符串也可以是一个请求对象,data 用于指定要发送到服务器的额外数据的字符串,timeout 用于设置打开URL的超时时间 ,此方法不支持cookie
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
cafile=None, capath=None, cadefault=False, context=None):
global _opener
if cafile or capath or cadefault:
if context is not None:
raise ValueError(
"You can't pass both context and any of cafile, capath, and "
"cadefault"
)
if not _have_ssl:
raise ValueError('SSL support not available')
context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH,
cafile=cafile,
capath=capath)
https_handler = HTTPSHandler(context=context)
opener = build_opener(https_handler)
elif context:
https_handler = HTTPSHandler(context=context)
opener = build_opener(https_handler)
elif _opener is None:
_opener = opener = build_opener()
else:
opener = _opener
return opener.open(url, data, timeout)
使用cookie访问示例步骤如下:
import httplib,urllib,urllib2
import cookielib
cookie= cookielib.LWPCookieJar()#创建cookie存储对象 Python2.x 使用的方法
handler=urllib2.HTTPCookieProcessor(cookie)#将cookie传入至 HTTPcookie处理器对象中,该方法返回cookie头部 cookie=cookielib.CookieJar()#创建cookie存储对象 Python3 使用的方法
opener=urllib2.build_opener(handler)#将cookie设置加入HTTP构造器 返回对象值
#opener.open()和urllibe.urlopen()用法一致,都是可以打开对象或者URL
#返回的对象可以增加头部
opener.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')]
opener.addheaders = [('Accept', 'application/json, text/plain, */*')]
opener.addheaders = [('Content-Type', 'application/json;charset=UTF-8')]
urllib2.install_opener(opener)#将头部设置或者安装到调用urllib2的py文件中,若只写请求则可以在初始化方法中写 (启动构造器)
#然后可以用三种编写方式
#1.
# res_data = urllib2.Request(url)
# rsp=urllib2.urlopen(res_data)
#res = rsp.read()
#2.
# res_data = urllib2.Request(url)
#还可以进行修改头部 res_data.add_header("connection":"keep-live")
# rsp=urllib2.urlopen(res_data)
#res = rsp.read()
#3.
#rsp=urllib2.urlopen(url)
#res = rsp.read()
#说明
# urllib2.urlopen(url, data=None, timeout=<object object>) :用于打开一个URL,URL可以是一个字符串也可以是一个请求对象,data 用于指定要发送到服务器的额外数据的字符串,timeout 用于设置打开URL的超时时间 ,此方法不支持cookie
#urllib2.Request(url, data, headers) :用于构造一个请求对象,然后用 urllib2.urlopen() 来打开这个请求对象,data 用于指定要发送到服务器的额外数据的字符串
#build_opener ()返回的对象具有open()方法,与urlopen()函数的功能相同
**关于Requset部分原函数**
可以看出来此函数支持POST、PUT、GET三种方法
class Request(url_request.Request):
"""
Extends the url_request.Request to support all HTTP request types.
"""
def __init__(self, url, data=None, method=None):
"""
Initialise a new HTTP request.
:Args:
- url - String for the URL to send the request to.
- data - Data to send with the request.
"""
if method is None:
method = data is not None and 'POST' or 'GET'
elif method != 'POST' and method != 'PUT':
data = None
self._method = method
url_request.Request.__init__(self, url, data=data)
def get_method(self):
"""
Returns the HTTP method used by this request.
"""
return self._method
Request库
request库认证如下:
# -*- coding: utf-8 -*-
基础认证
import requests
from requests.auth import HTTPDigestAuth
respones = requests.get(url, headers=header, auth=(username, password))
摘要认证
respones = requests.get(url, headers=header, HTTPDigestAuth=(username, password))
传递参数:
respones = requests.post(self.url, data=data,headers=self.header, auth=HTTPDigestAuth(username, password))
session使用:
在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息。
1、requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies。
s = requests.session()
# req_param = '{"belongId": "300001312","userName": "alitestss003","password":"pxkj88","captcha":"pxpx","captchaKey":"59675w1v8kdbpxv"}'
# res = s.post('http://test.e.fanxiaojian.cn/metis-in-web/auth/login', json=json.loads(req_param))
# # res1 = s.get("http://test.e.fanxiaojian.cn/eos--web/analysis/briefing")
# print(res.cookies.values()) 获取登陆的所有session
2、requests库的session对象还能为我们提供请求方法的缺省数据,通过设置session对象的属性来实现
eg:
# 创建一个session对象
s = requests.Session()
# 设置session对象的auth属性,用来作为请求的默认参数
s.auth = ('user', 'pass')
# 设置session的headers属性,通过update方法,将其余请求方法中的headers属性合并起来作为最终的请求方法的headers
s.headers.update({'x-test': 'true'})
# 发送请求,这里没有设置auth会默认使用session对象的auth属性,这里的headers属性会与session对象的headers属性合并
r = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
#s.cookie=cookie 可以进行设置
上面的请求数据等于:{'Authorization': 'Basic dXNlcjpwYXNz', 'x-test': 'false'}
# 查看发送请求的请求头
r.request.headers #打印响应中请求的所有header数据
res3 = s.get("http://pre.n.cn/irs-web/sso/login",cookies = cookie)
print(res3.request.headers.get("Cookie").split("IRSSID=")[-1])
print(type(res3.request.headers.get("Cookie").split("IRSSID=")[-1]))
print(res3.request._cookies)
cookie和session简单介绍:
(1)cookie是由服务端生成,存储在响应头中,返回给客户端,客户端会将cookie存储下来。接着客户端在发送请求时,user-agent会自动获取本地存储的cookie,将cookie信息存储在请求头中,发送给服务端。cookie的过期时间可以任意设置,如果不主动清除,在很长一段时间里都可以保留,即使电脑关机。
(2)session是由服务端生成,存储在服务器端的内存、缓存、数据库等地方。客户端给服务端发送请求后,服务端会根据请求信息生成session,同时生成一个session_id,通过cookie返回给客户端,以便今后每次请求时都可以分辨你是谁;客户端再次向服务端发送请求时,会通过cookie将这个session_id发送给服务端
由于Seesion使用不多:此博主提供了思路https://blog.csdn.net/hpulfc/article/details/80084398
![](https://g.csdnimg.cn/static/user-reg-year/1x/3.png)
标签:http,请求,python,urllib2,url,opener,cookie,data,调试 来源: https://blog.csdn.net/qq_36495121/article/details/103936443