You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python的Selenium:如何实时获取HTTP请求并断言内容

获取并断言Selenium中的HTTP请求Payload

作为用Python Selenium做自动化的QA,要捕获登录这类请求的Payload并验证,常用两种靠谱的方法:

方法一:借助Chrome DevTools Protocol(CDP)直接捕获

Chrome/Edge这类基于Chromium的浏览器支持CDP,能直接通过Selenium调用它来监听网络请求。

实现步骤

  1. 初始化Chrome驱动时开启网络监听
  2. 过滤出目标请求(比如登录接口的URL)
  3. 执行登录操作,捕获请求的Payload
  4. 解析Payload并做断言

代码示例

from selenium import webdriver
from selenium.webdriver.common.by import By
import json

# 初始化Chrome驱动,开启CDP网络监听
driver = webdriver.Chrome()
driver.execute_cdp_cmd('Network.enable', {})

# 存储请求的变量
login_request = None

# 设置请求监听回调
def capture_request(request):
    global login_request
    # 匹配登录接口的URL,替换成你的实际接口路径
    if 'login' in request['request']['url'] and request['request']['method'] == 'POST':
        login_request = request['request']['postData']

# 绑定监听事件
driver.execute_cdp_cmd('Network.requestWillBeSent', {}, capture_request)

# 执行登录操作(替换成你的实际登录步骤)
driver.get('你的登录页面URL')
driver.find_element(By.ID, 'username').send_keys('test_user')
driver.find_element(By.ID, 'password').send_keys('test_pass')
driver.find_element(By.ID, 'login-btn').click()

# 解析Payload并断言
if login_request:
    payload = json.loads(login_request)
    # 验证用户名是否正确
    assert payload['username'] == 'test_user', f"用户名不匹配,实际值: {payload['username']}"
    # 验证密码或其他字段(根据实际需求调整)
    assert payload['password'] == 'test_pass', f"密码不匹配,实际值: {payload['password']}"
    print("登录请求Payload验证通过")
else:
    print("未捕获到登录请求")

driver.quit()

注意:要替换代码中的URL、元素定位器和接口匹配规则,适配你的实际项目。

方法二:使用mitmproxy代理拦截请求

如果需要兼容非Chromium浏览器,或者需要更灵活的请求处理,可以用mitmproxy做中间代理,捕获所有经过的HTTP请求。

实现步骤

  1. 安装mitmproxy:pip install mitmproxy
  2. 编写Python脚本,用mitmproxy的API拦截请求
  3. 配置Selenium使用mitmproxy代理
  4. 启动mitmproxy并执行自动化流程,捕获目标请求后断言

代码示例

第一步:编写mitmproxy拦截脚本(命名为request_capture.py)

from mitmproxy import http
import json

# 存储捕获到的登录请求
captured_payload = None

def request(flow: http.HTTPFlow) -> None:
    global captured_payload
    # 匹配登录接口
    if 'login' in flow.request.url and flow.request.method == 'POST':
        # 解析请求Payload
        captured_payload = json.loads(flow.request.get_text())
        # 将捕获到的内容写入文件,供后续断言读取
        with open('login_payload.json', 'w') as f:
            json.dump(captured_payload, f)

第二步:Selenium配置代理并执行测试

from selenium import webdriver
from selenium.webdriver.common.by import By
import subprocess
import time
import json

# 启动mitmproxy后台进程
mitm_process = subprocess.Popen(['mitmdump', '-s', 'request_capture.py'])
time.sleep(2)  # 等待代理启动

# 配置Chrome使用mitmproxy代理
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://127.0.0.1:8080')
# 忽略证书错误(mitmproxy使用自签名证书)
chrome_options.add_argument('--ignore-certificate-errors')

driver = webdriver.Chrome(options=chrome_options)

# 执行登录操作
driver.get('你的登录页面URL')
driver.find_element(By.ID, 'username').send_keys('test_user')
driver.find_element(By.ID, 'password').send_keys('test_pass')
driver.find_element(By.ID, 'login-btn').click()
time.sleep(1)  # 等待请求捕获完成

# 读取文件并断言
with open('login_payload.json', 'r') as f:
    payload = json.load(f)

assert payload['username'] == 'test_user', f"用户名不匹配"
assert payload['password'] == 'test_pass', f"密码不匹配"
print("Payload验证通过")

# 关闭资源
driver.quit()
mitm_process.terminate()

注意:首次使用mitmproxy需要安装证书,否则无法捕获HTTPS请求,可访问http://mitm.it根据提示安装对应系统的证书。


内容的提问来源于stack exchange,提问作者Martin M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:35:08