Python Requests与Selenium结合:自动化测试与请求交互终极指南
发布时间: 2024-12-16 04:33:43 阅读量: 10 订阅数: 9
Python自动化测试实战篇(4)selenium+unttest+ddt实现自动化用例测试,模拟用户登陆点击交互测试
![Python Requests 官方中文文档](https://cdn.activestate.com/wp-content/uploads/2021/08/pip-install-requests.png)
参考资源链接:[python requests官方中文文档( 高级用法 Requests 2.18.1 文档 )](https://wenku.csdn.net/doc/646c55d4543f844488d076df?spm=1055.2635.3001.10343)
# 1. 自动化测试与请求交互简介
自动化测试是软件测试领域的一种实践,旨在使用工具、脚本或第三方库来自动执行测试用例。它通过减少手工测试需求来提高效率,确保软件质量,并加速软件开发的反馈循环。一个关键的组成部分是与应用程序进行请求交互,而Python的Requests库为这一过程提供了简洁而强大的界面。本章将介绍自动化测试的基础知识,并概述如何使用Requests库处理基本的HTTP请求和响应,从而为理解后续章节中更高级的功能打下基础。
# 2. ```
# 第二章:Python Requests库详解
Python的Requests库是一个强大的HTTP库,它被广泛用于发起网络请求。由于其简洁的API和强大的功能,Requests库已成为Python开发者进行Web服务交互和构建自动化测试脚本的首选工具。
## 2.1 Requests库基础使用
### 2.1.1 发起请求和处理响应
使用Requests库发起请求的基本步骤非常简单,只需几行代码即可实现:
```python
import requests
# 发起GET请求
response = requests.get('https://api.github.com')
# 打印响应状态码
print(response.status_code)
# 打印响应内容
print(response.text)
```
上面的代码首先导入了`requests`模块,然后使用`get`方法发起了一个GET请求。`response.status_code`会返回HTTP响应的状态码,而`response.text`则包含返回的HTML内容。类似地,可以使用`post`, `put`, `delete`, `head`, `options`, `patch`等方法来发起不同类型的HTTP请求。
### 2.1.2 HTTP方法与Requests的对应关系
每个HTTP方法对应到Requests库中都封装成了一个对应的方法:
```python
requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.delete(url, **kwargs)
requests.head(url, **kwargs)
requests.options(url, **kwargs)
requests.patch(url, data=None, **kwargs)
```
其中`url`代表请求的URL,`params`可以用来传递URL参数,`data`和`json`分别用于传递POST请求的数据,`json`参数在传递时会自动编码为JSON格式。
## 2.2 Requests高级特性
### 2.2.1 会话保持与Cookie管理
在多请求的情况下,使用会话(session)可以保持某些参数,比如Cookies,使得整个会话中都携带这些参数:
```python
with requests.Session() as session:
session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
response = session.get('https://httpbin.org/cookies')
print(response.text)
```
上面的代码使用了`Session`对象,它在多次请求之间保持某些参数,比如cookies。通过这种方式,即使没有明确地传递cookies,请求依然能够携带上一次请求中的cookies。
### 2.2.2 错误处理与异常
当请求过程中出现错误时,Requests库会抛出异常。你可以通过捕获这些异常来处理错误情况:
```python
try:
response = requests.get('https://api.github.com/unexisting')
except requests.exceptions.HTTPError as errh:
print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
print("OOps: Something Else", err)
```
这段代码展示了如何捕获不同类型的异常,例如`HTTPError`, `ConnectionError`, `Timeout`等,并给出相应的错误信息。
### 2.2.3 身份验证与代理配置
Requests库也支持身份验证(如基本认证)和代理配置:
```python
from requests.auth import HTTPBasicAuth
response = requests.get('https://api.github.com', auth=HTTPBasicAuth('user', 'pass'))
print(response.text)
```
上面的代码使用了`HTTPBasicAuth`模块来实现HTTP基本认证。对于代理配置,可以传递`proxies`参数来设置。
## 2.3 Requests的实用技巧
### 2.3.1 超时设置与重试机制
设置请求超时可以防止程序在请求服务器时发生无限等待。Requests库允许你为单个请求设置超时:
```python
response = requests.get('https://httpbin.org/delay/10', timeout=5)
```
如果需要实现请求失败后的重试机制,可以自定义一个重试函数:
```python
import time
def retry_request(url, max_retries=3, backoff_factor=1):
retries = 0
while retries < max_retries:
try:
response = requests.get(url, timeout=5)
response.raise_for_status() # 检查请求是否成功
return response
except requests.exceptions.HTTPError as err:
if response.status_code == 429:
sleep_time = backoff_factor * (2 ** retries)
print(f"Rate limited, retrying in {sleep_time} seconds")
time.sleep(sleep_time)
retries += 1
else:
raise
except requests.exceptions.RequestException as err:
print(f"Request failed: {err}")
break
# 使用重试机制
response = retry_request('https://api.github.com')
```
### 2.3.2 下载文件与进度条实现
下载文件是自动化测试中的常见需求,Requests库可以轻松地实现文件下载:
```python
with requests.get('https://httpbin.org/image', stream=True) as r:
r.raise_for_status()
with open('image.jpg', 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
```
为了在下载文件时显示进度条,可以使用`tqdm`库:
```python
from tqdm import tqdm
import requests
url = 'https://httpbin.org/image'
response = requests.get(url, stream=True)
with open('image.jpg', 'wb') as file:
total_length = response.headers.get('content-length')
if total_length is None: # no content length header
file.write(response.content)
else:
dl = 0
total_length = int(total_length)
for data in tqdm(response.iter_content(chunk_size=4096)):
dl += len(data)
file.write(data)
done = int(50 * dl / total_length)
tqdm.write(f"\r Downlo
0
0