Linux运维进阶-Python,Docker,Shell

python做web接口测试零散笔记--1

2020-08-11  本文已影响0人  My熊猫眼

普通代理的配置:

设置http代理,然后在get或者post的时候提供proxies参数。

import requests
proxies = {
  "http": "http://172.1.1.7:1080",
  "https": "http://172.1.2.7:1080",
}
requests.get("http://www.baidu.com", proxies=proxies)

如果代理需要http 基本认证,那么可以按照如下的方式设置代理:

proxies = { "http":"http://username:passward@172.1.2.7:1080"}

PAC代理:

pac 是proxy auto configuration的缩写,也就是自动配置代理,在很多公司连接外网的时候,采用的都是pac代理。
在使用python 进行web接口测试的时候,如果遇到pac 代理的情况,那么需要用pypac 模块来实现网络连接.pypac 模块会可以解析pac配置文件,一个比较简单的使用步骤如下:

  1. 使用get_pac 方法获取pac 配置文件,产生一个pac对象;
  2. PACSession, 这是pypac模块中的一个class, 通过该类,创建一个PAC SESSION对象,可以只传递 pac对象,也就是上面的get_pac方法的结果.
  3. PACSession 类实例化的object, 支持很多的metion, 比较常用的有get, post 方法.
    见下面的使用举例:
#!/usr/bin/env python
import pypac 
pac_file=pypac.get_pac("http://XXX.com/xxx.pac")   #Get the PAC file object
PAC_SESSION=pypac.PACSession(pac_file)  #Get the PAC SESSION object. Similar with reqeusts.session object.
response=PAC_SESSION.get("https://www.baidu.com/")   
print(response.text)  #Check the response contents.

证书验证问题:

虽然大多数https网站的证书都是权威机构签发,不会有验证问题,但是公司内部的网站,可能是自签发证书,这时候,如果没有添加信任的话,那么一般会出现如下的报错:
"requests.exceptions.SSLError: ......", 这时候可以在get/post的request上加上 verify=false的参数来解决,比如上述的: response=PAC_SESSION.get("https://my.site.com/", verify=False), 如果是verify=True, 那么表示要进行证书的验证,默认是verify=True.
上述方式其实并不推荐,最好的做法是信任证书,然后就没有问题了. 不过上述是最简单的方式了.

SSL连接告警问题:

虽然python可以通过 在请求时候添加 verify=False 来跳过证书的验证过程,但是 如果我们跳过证书的验证,那么python 会给出如下的警告: ** InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3......**, 这时候要disable 这个alerts, 用如下的方式:

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)  #Disable the SSL warning.

URL 重定向问题:

在实际的环境中,遇到重定向是再正常不过的事情了,pyhton 的requests 库会自动处理重定向,也就是说,当我们用get方法的时候,redirect 自动执行,通常返回的是重定向后的结果,我们可以在get的时候添加 allow_redirects=False 参数,从而避免自动重定向。

~# cat my.py 
#/usr/bin/env python
import requests
r=requests.get("https://cloud.tencent.com/qccomponent/login/api.js")  #默认情况下,自动处理redirect .
print(r.status_code)
~# python my.py
200
#################禁止redirect##############################
~# cat my.py 
#/usr/bin/env python
import requests
r=requests.get("https://cloud.tencent.com/qccomponent/login/api.js",allow_redirects=False)    #添加allow_redirects=False 来禁止重定向。
print(r.status_code)  #返回状态为302, 表示重定向.
~# python my.py 
302

那么重定向之后的URL是什么呢? 这个可以通过response的headers 信息里面一个key 为location的值找到。如下python的示例用于获取重定先向之后的URL:

$ cat my.py
#/usr/bin/env python
import requests,json
r=requests.get("https://cloud.tencent.com/qccomponent/login/api.js",allow_redirects=False)
print(r.headers["location"])
$ python my.py        #运行得到跳转后的地址
https://imgcache.qq.com/qcloud/main/scripts/release/common/login/api.7e9f7a8c93ec5647a3a2.js?max_age=31536000

如果不通过抓包,我们很难知道是否发生了跳转,而在每个浏览器中一般都是“development tool” 或者“development plugin”, 一般是F12键,打开后,切换到“Network” tab,然后就可以看到了.事实上,如果要做web 接口测试,该工具的使用是必不可少的.

get请求和post请求的参数问题:

get请求一般是不带参数的,但是也可以带参数,其所带的参数是会出现在URL中的, post请求的参数是不会出现在URL中的,所以当我们传递用户名密码等信息的时候,都是采用post方式,而不是get.

cookie的处理:

在使用get或者post请求的时候,返回的类型是response对象,这个对象的其中一个属性是cookies. 从下面的例子可以看到,r.cookies 是一个 'requests.cookies.RequestsCookieJar' 实例。 那么如何处理该对象呢, 主要是如何保存cookie到文件?
用 requests.utils.dict_from_cookiejar 方法可以把cook 对象转换成字典类型, 然后利用json.dumps() 方法,从而把字典转换成json的字符串,有了字符串,我们就可以把cookie写入文件了.

>>> import requests;
>>> r=requests.get("https://www.baidu.com")
>>> dir(r)
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__iter__', '__module__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']
>>> r.cookies
<<class 'requests.cookies.RequestsCookieJar'>[Cookie(version=0, name='BDORZ', value='27315', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1597286653, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>
>>> 
>>> [i for i in dir(requests.utils) if i.__contains__("cookie")]          #查看支持cookie对象处理的方法. 
['add_dict_to_cookiejar', 'cookiejar_from_dict', 'dict_from_cookiejar']
>>> 

通过把cookie对象转换成字典类型,再通过json.dumps转成字符串类型实现cookie的存储,但是存储不是我们的目标,那么存储之后,如何在需要的时候读取呢? 这个和上述保存cookie的方式刚好相反.

json.loads()    #把cookie字符串转换成字典类型.
cookie_val=requests.utils.cookiejar_from_dict  #调用该方法把字典转换成cookie对象, 并赋值给变量cookie_val
sesson.cookies=cookie_val    #把获取的cookie value 赋值给session.cookies, 这样session.get, 以及session.post 等方法就可以使用指定的cookie进行通信了
上一篇下一篇

猜你喜欢

热点阅读