如何获取Python 3.10 + Selenium 4.1.3测试生成的网络数据?
获取Python 3.10 + Selenium 4.1.3测试的网络请求数据
可以通过Chrome DevTools Protocol(CDP)直接在Selenium中捕获网络请求,并将数据保存到本地文件,这样即使Chrome实例关闭后也能随时查看。以下是具体实现方案:
核心思路
利用Selenium 4内置的CDP支持,监听浏览器的网络事件,捕获请求和响应数据,最后将数据写入JSON文件持久化存储。
完整代码示例
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By import json # 初始化Chrome配置 chrome_options = webdriver.ChromeOptions() # 可选:启用无头模式(无需可视化浏览器) chrome_options.add_argument("--headless=new") # 禁用不必要的扩展和通知,提升稳定性 chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-notifications") # 启动ChromeDriver(替换为你的chromedriver实际路径) driver = webdriver.Chrome( service=Service("/path/to/chromedriver"), options=chrome_options ) # 启用CDP网络监听 driver.execute_cdp_cmd("Network.enable", {}) # 存储捕获到的网络请求 network_logs = [] # 监听请求发送事件,提取关键信息 def log_request(request): # 可根据需求筛选请求类型,比如只保留XHR、Fetch if request["type"] in ["XHR", "Fetch"]: simplified_req = { "requestId": request["requestId"], "url": request["request"]["url"], "method": request["request"]["method"], "headers": request["request"]["headers"], "timestamp": request["timestamp"] } network_logs.append(simplified_req) driver.add_cdp_listener("Network.requestWillBeSent", log_request) # ---------------------- 执行你的测试流程 ---------------------- driver.get("https://your-test-url.com") # 这里添加测试操作:点击按钮、提交表单等 # driver.find_element(By.ID, "submit-btn").click() # ------------------------------------------------------------- # 等待所有请求完成(根据测试场景调整等待时间) driver.implicitly_wait(5) # 监听响应接收事件,补充响应数据 def log_response(response): # 匹配请求和响应 for req in network_logs: if req["requestId"] == response["requestId"]: req["response_status"] = response["response"]["status"] req["response_headers"] = response["response"]["headers"] # 可选:获取响应体内容 try: res_body = driver.execute_cdp_cmd( "Network.getResponseBody", {"requestId": response["requestId"]} ) req["response_body"] = res_body.get("body") except Exception as e: req["response_body_error"] = str(e) break driver.add_cdp_listener("Network.responseReceived", log_response) # 等待响应处理完成 driver.implicitly_wait(3) # 关闭网络监听 driver.execute_cdp_cmd("Network.disable", {}) # 将网络日志写入JSON文件 with open("selenium_network_logs.json", "w", encoding="utf-8") as f: json.dump(network_logs, f, indent=2, ensure_ascii=False) # 关闭浏览器 driver.quit()
关键说明
- ChromeDriver版本匹配:确保ChromeDriver版本与本地Chrome浏览器版本一致,否则会出现兼容性问题。
- 请求筛选:可通过修改
request["type"]的判断条件,只捕获特定类型的请求(如文档、图片、脚本等)。 - 响应体获取:部分请求(如已取消的请求、二进制文件)可能无法获取响应体,需添加异常处理避免报错。
- 持久化存储:生成的
selenium_network_logs.json文件会保存在脚本运行目录下,浏览器关闭后可直接打开查看所有捕获的网络数据。
内容的提问来源于stack exchange,提问作者Mate Mrše
相关产品推荐
相关产品推荐

