python接口测试之urllib2的应用(十五)

作者 无涯

在接口测试中或者说在网络爬虫中,urllib2库是必须要掌握的一个库,当然还有优秀的requests库,今天重点来说urllib2库在接口测试中的应用。

urllib2定义了很多的函数和类,这些函数和类能够帮助我们在复杂情况下获取URLS的内容。这些情况包含了对headers的添加,cookie的处理,代理,

超时,鉴权等的处理。如果想详细的了解urllib2库,建议到官方查看,官方地址:https://docs.python.org/2/library/urllib2.html。查看urllib2库的详细

的帮助文档,见执行的代码:

#!/usr/bin/env python
#-*-coding:utf-8-*-
import  urllib2
print type(help(urllib2))

首先我们来看一个完整的请求和响应内容,然后通过urllib2的库来实现这样的一个过程,我们访问http://m.cyw.com/切换城市,见抓取的信息,见截图:

见客户端发送请求后,服务端响应回复的内容截图:

在如上的截图中,我们知道了请求的URL,方法以及请求的参数,下来我们使用urllib2的库来实现一个完整的请求过程和响应内容,见实现的代码:

# !/usr/bin/env python
# -*-coding:utf-8-*-

import urllib2
import  urllib

def selCity():
   ‘‘‘使用urllib2实现一个城市选择的完整请求和响应内容‘‘‘
   data = urllib.urlencode({‘cityId‘: ‘438‘})
   r = urllib2.urlopen(
      url=‘http://m.cyw.com/index.php?m=api&c=cookie&a=setcity‘,
      data=data)
   print u‘http的状态码:‘, r.getcode()
   print u‘响应内容:‘, r.read()
调用如上的函数后,见执行的结果:

http的状态码: 200

响应内容: {"status":true,"homeUrl":"\/xian"}

在接口的测试中,客户端向服务端发起请求的时候,需要添加header这样服务端,否则服务端会拒绝客户端的请求,那么在urllib2库中,如何添加header了,见如下的案例代码:

# !/usr/bin/env python
# -*-coding:utf-8-*-

import urllib2
import  urllib

def login():
   ‘‘‘通过一个接口来测试请求头headers的处理‘‘‘
   headers= {
      ‘Content-Type‘: ‘application/json; charset=UTF-8‘,
      ‘Parkingwang-Client-Source‘: ‘ParkingWangAPIClientWeb‘}
   data=urllib.urlencode(
      {"username": "autoapi",
       "password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
       "role": 2}
   )
   request=urllib2.Request(url=‘https://ecapi.parkingwang.com/v4/login‘,
                     data=data,
                     headers=headers)
   r=urllib2.urlopen(request)
   print r.getcode()
   print r.read()

login()

发送一个request的请求,然后请求资源,在该实例中,如果没有headers,发送请求,会显示404的错误信息,见不带header发送请求后服务端的响应内容:

# !/usr/bin/env python
# -*-coding:utf-8-*-

import urllib2
import  urllib

def login():
   ‘‘‘通过一个接口来测试请求头headers的处理‘‘‘
   data=urllib.urlencode(
      {"username": "autoapi",
       "password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
       "role": 2})
   r=urllib2.urlopen(url=‘https://ecapi.parkingwang.com/v4/login‘,
                     data=data)
   print r.getcode

login()

见执行函数后的错误信息,显示为:

File "C:\Python27\lib\urllib2.py", line 556, in http_error_default

raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)

urllib2.HTTPError: HTTP Error 404: Not Found

下来来看urllib2的库对cookie的处理,对cookie的处理分为二种方式,一种是自动处理cookie,会使用到cookielib,另外一种是自己设置添加cookie,

我们先看自动处理cookie的一种方式,我们模拟请求百度,然后循环看百度的cookie,见实现的代码:

# !/usr/bin/env python
# -*-coding:utf-8-*-

import urllib2
import  urllib

def baidu():
   ‘‘‘通过一个例子来看cookie的处理‘‘‘
   import cookielib
   # 对cookie进行管理
   cookie = cookielib.CookieJar()
   # 对cookie进行自动管理
   opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
   r = opener.open(‘http://www.baidu.com‘)
   print r.getcode()
   for item in cookie:
      print item

调用函数后,见执行后打印的内容:

200

<Cookie BAIDUID=8C777D00B26945AAC27AA4952BC00CE4:FG=1 for .baidu.com/>

<Cookie BIDUPSID=8C777D00B26945AAC27AA4952BC00CE4 for .baidu.com/>

<Cookie H_PS_PSSID=1460_21087 for .baidu.com/>

<Cookie PSTM=1519292146 for .baidu.com/>

<Cookie BDSVRTM=0 for www.baidu.com/>

<Cookie BD_HOME=0 for www.baidu.com/>

下面我们来看自己设置添加cookie的方式,我们知道在登录一个系统成功后,再去请求系统中的信息,如果不带cookie系统会拒绝客户端的请求,

理由很简单就是服务端要确保访问系统的用户是经过登录系统成功后才可以具备权限访问,这样也是安全角度的考虑,见如下通过自己设置添加cookie

实现的方式,见实现的代码:

# !/usr/bin/env python
# -*-coding:utf-8-*-

import urllib2
import  urllib

def cookie():
   ‘‘‘通过自己设置添加cookie‘‘‘
   opener=urllib2.build_opener()
   opener.addheaders.append((‘Cookie‘,‘_gitlab_session=ec998d5f778e2929e5235d24250e94cd; session=.eJwdzkFrwkAQhuG_UubsQaOnQC8SXSzMBGWSMHMRGtPujsklVmJW_O_d9vDBd3ngfcL5a-xuHvKf8d4t4BwukD_h7RNyoHhYY3GdJDs-tKnWyrJRd3xgs8tKh0t1tZWOTNkb8iWg9b0OJ4_Z3v4-udqjVRmlCScXt6FkH4jblZhMYocJ48mkkZlcNYt9z8R-kJgst1EZl8jbQMXHQLbvpcGoJrPydUNFmxp2ydVBGN_htYD7rRv_-2EFr1_dGUj6.DVcwRw.mOjs2qGQ5W4mOHn4yiB3pkqMi0A‘))
   request=urllib2.Request(‘http://117.39.63.66:20080/depot/parks?start=0&length=10&draw=1‘)
   r=opener.open(request)
   print r.getcode()
   print r.headers
   print r.read()

下来来看超时的处理,在实际的请求中,由于网络等因素,导致请求失败,会报socket.timeout: timed out的错误,如果出现这样的错误说明请求超时,

我们需要在请求的时候对处理做处理,先来模拟超时的请求,如模拟超时的代码:

# !/usr/bin/env python
# -*-coding:utf-8-*-

import urllib2
import  urllib

def timeout():
   ‘‘‘通过一个例子来看超时‘‘‘
   r=urllib2.urlopen(‘http://www.baidu.com‘,timeout=0.01)
   print r.getcode()
   print r.read()

timeout()

见执行后打印的错误信息:

File "C:\Python27\lib\socket.py", line 480, in readline

data = self._sock.recv(self._rbufsize)

socket.timeout: timed out

下来我们对该错误进行处理,在请求的时候处理下超时的情况,见处理后的代码:

# !/usr/bin/env python
# -*-coding:utf-8-*-

import urllib2
import  urllib

def timeout():
   ‘‘‘通过一个例子来看超时‘‘‘
   r=urllib2.urlopen(‘http://www.baidu.com‘,timeout=2)
   print r.getcode()
   print r.read()

timeout()

原文地址:https://www.cnblogs.com/jason89/p/9033922.html

时间: 2024-10-13 18:57:58

python接口测试之urllib2的应用(十五)的相关文章

python接口测试之token&amp;session的处理(十四)

下面我们就来使用python语言来进行实现,在这里我们使用第三方的库requests,需要单独的安装下,安装的命令是: pip  install -U requests 见安装的截图: 安装成功后,如果可以在正常的导入,说明安装OK 安装好requests好后,我们就可以开始了,关于requests有不清楚的,可以看Python接口测试之requests(七),这里我们直接来进行实战, 我们再来进行回顾下我们需要做的事情,我们需要做的就是登录成功后,获取token,后面的接口都需要这个参数,所以

python接口测试之401错误的分析和解决(十六)

作者 无涯 在接口的测试中,经常会遇到客户端向服务端发送一个请求,服务端返回401的错误,那么今天本文章就来说明在接口测试中如何分析以及解决该问题. 我们知道在HTTP返回的状态码中,401错误表示的是被请求的页面需要用户名和密码.401的错误详细的可以描述为:客户端发送请求抖到服务端, 页面需要验证服务端会返回401的错误,见如下的错误信息: 401 UNAUTHORIZED Headers Content-Type: application/jsonWWW-Authenticate: Bas

Python接口测试之moco

在现在的软件开发过程中,特别是app的部分,需要的很多数据以及内容,都是来自server端的API,但是不能保证 在客户端开发的时候,api在server端已经开发完成,专门等着前端来调用,理想的情况是前端在开发的时候,已经有人写 好了接口,直接调用就可以了,但是这仅仅是理想的情况,很多时候,现实总是比理想多一层思考和磨难,如果在前端开发 的时候,提供api的同学没有提供,那么怎么办?等待还是自己先开发,等待肯定是愚蠢的做法,那么自己开发怎么来解决 api提供数据的这个问题,那么使用mock就可

Python学习之旅(三十五)

Python基础知识(34):电子邮件(Ⅰ) 几乎所有的编程语言都支持发送和接收电子邮件 在使用Python收发邮件前,请先准备好至少两个电子邮件,如[email protected],[email protected],[email protected]等,注意两个邮箱不要用同一家邮件服务商 电子邮件发送过程: 发件人email->MUA(mail user agent:邮件用户代理)->MTA(mail transfer agent:邮件传输代理)->MDA(mail deliver

python全栈开发【第十五篇】面向对象三大特性——封装

1.封装: 什么是封装呢?(封装不是单纯意义的隐藏,其实它还是可以查看的) 就是把一些不想让别人看的给隐藏起来了 封装数据:目的是保护隐私 功能封装:目的是隔离复杂度 如果用了私有的,在类的外部,无法直接使用变形的属性,但是在类的内部可以直接使用 # 对象名.属性名取值的三种方法 1.用我们常用的__init__方法里的self取值 class Course:#恰好给我们提供了实现这种思路的方法 # #一种思路,python def __init__(self,price,period,name

Python接口测试之对MySQL/unittest框架/Requests 的操作

单元测试支持测试自动化. 共享的安装程序和关闭代码测试. 聚合成集合,测试和报告框架从测试的独立性.单元测试模块提供可以很容易地支持这些素质的一组测试的类.关于unittest 测试框架建议可以到官方查看详细的说明以及演示的实例.unittest各个模块的关系为: #!/usr/bin/env python #coding:utf-8 import unittest class TestDiv(unittest.TestCase): def setUp(self): pass def tearD

python接口测试之序列化与反序列化(四)

作者 无涯 在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象. 在python的标准库中,专门提供了json库与pickle库来处理这部分. 先来学习json的库,导入json库很简单,直接import json,下面通过具体的实例来说明json库对序列化与反序列化的使用.json库的主要方法为: #!/usr/bin/env python#coding:utf-8import  jsonp

python接口测试之json模块的使用

json.dumps() json.loads() json.dump json.load 一.json.dumps() 将python字典类型转换成json对象 import json # Python 字典类型转换为 JSON 对象 data = { 'no' : 1, 'name' : 'Runoob', 'url' : 'http://www.runoob.com' } json_str = json.dumps(data) print ("Python 原始数据:", rep

python接口测试之日志功能

之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 import logging 1.定义日志收集器,指定收集器的名称,返回logging对象 case_logger = logging.getLogger('case') 2.指定日志收集器的日志等级,NOTEST(0) DEBUG(10) INFO(20) WARNING(30) ERROR(40)