自动化测试--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”是正则语法规则用来匹配09之间的数返回列表
re.findall(r"\w","https://docs.python.org/3/whatsnew/3.6.html")  “w”在正则里面代表匹配从小写a到z,大写A到Z,数字09
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

发布了17 篇原创文章 · 获赞 1 · 访问量 431

猜你喜欢

转载自blog.csdn.net/qq_36495121/article/details/103936443