基于Python的Selenium:如何实时获取HTTP请求并断言内容
获取并断言Selenium中的HTTP请求Payload
作为用Python Selenium做自动化的QA,要捕获登录这类请求的Payload并验证,常用两种靠谱的方法:
方法一:借助Chrome DevTools Protocol(CDP)直接捕获
Chrome/Edge这类基于Chromium的浏览器支持CDP,能直接通过Selenium调用它来监听网络请求。
实现步骤
- 初始化Chrome驱动时开启网络监听
- 过滤出目标请求(比如登录接口的URL)
- 执行登录操作,捕获请求的Payload
- 解析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请求。
实现步骤
- 安装mitmproxy:
pip install mitmproxy - 编写Python脚本,用mitmproxy的API拦截请求
- 配置Selenium使用mitmproxy代理
- 启动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
相关产品推荐
相关产品推荐

