自動化測試--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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章