使用Selenium进行网页自动化测试

在使用Selenium进行网页自动化测试时,获取网络请求数据(即network数据)并不直接由Selenium库提供。Selenium主要用于与网页内容进行交互(如点击、输入文本、获取页面元素等),但它本身不拦截或记录网络请求。

然而,你可以结合Selenium与其他工具(如BrowserMob Proxy、Wireshark、mitmproxy、或Selenium自带的Chrome DevTools Protocol)来获取网络请求数据。下面是一些常用的方法:

方法一:使用BrowserMob Proxy

BrowserMob Proxy是一个Java程序,可以与Selenium配合使用来捕获HTTP和HTTPS流量。

  1. 安装BrowserMob Proxy

    • 下载并安装Java。
    • 下载BrowserMob Proxy。
  2. 设置Python代码

    • 使用browsermob-proxy-py库(Python的BrowserMob Proxy绑定)。
bash 复制代码
pip install browsermob-proxy-py
python 复制代码
from selenium import webdriver
from browsermobproxy import Server
from selenium.webdriver.common.proxy import Proxy, ProxyType

# 启动BrowserMob Proxy服务器
server = Server("/path/to/browsermob-proxy")
server.start()
proxy = server.create_proxy()

# Selenium的Proxy配置
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--proxy-server={0}".format(proxy.proxy))

# 创建一个Selenium WebDriver实例
driver = webdriver.Chrome(chrome_options=chrome_options)

# 获取新会话的HAR(HTTP Archive)数据
proxy.new_har("example")

# 导航到目标URL
driver.get("http://example.com")

# 获取HAR数据
har_data = proxy.har

# 打印HAR数据
print(har_data)

# 关闭WebDriver和BrowserMob Proxy服务器
driver.quit()
server.stop()

方法二:使用mitmproxy

mitmproxy是一个强大的中间人代理,可以拦截、修改和检查HTTP和HTTPS流量。

  1. 安装mitmproxy

    bash 复制代码
    pip install mitmproxy
  2. 设置mitmproxy与Selenium

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
from mitmproxy import options
from mitmproxy.tools.dump import DumpMaster
from mitmproxy import http

# 配置mitmproxy监听端口
options = options.Options(listen_host='127.0.0.1', listen_port=8080)

# 定义处理HTTP请求的类
class Interceptor:
    def __init__(self):
        self.flows = []

    def request(self, flow: http.HTTPFlow) -> None:
        self.flows.append(flow)

# 启动mitmproxy
m = DumpMaster(options)
interceptor = Interceptor()
m.addons.add(interceptor)
try:
    m.run()
except KeyboardInterrupt:
    m.shutdown()

# 配置Selenium的Proxy
proxy = Proxy({
    'proxyType': ProxyType.MANUAL,
    'httpProxy': '127.0.0.1:8080',
    'sslProxy': '127.0.0.1:8080'
})

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--proxy-server=http://127.0.0.1:8080")

# 创建一个Selenium WebDriver实例
driver = webdriver.Chrome(chrome_options=chrome_options)

# 导航到目标URL
driver.get("http://example.com")

# 获取捕获的HTTP请求
for flow in interceptor.flows:
    print(flow.request.url)

# 关闭WebDriver
driver.quit()

注意:运行mitmproxy可能需要你配置证书以捕获HTTPS流量。

方法三:使用Chrome DevTools Protocol(CDP)

Chrome DevTools Protocol允许你与Chrome浏览器进行低级别的通信,包括获取网络请求数据。Selenium 4+提供了对CDP的直接支持。

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time

# 配置Chrome选项
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")  # 连接到已打开的Chrome实例

# 创建WebDriver实例
driver = webdriver.Chrome(service=Service(), options=chrome_options)

# 导航到目标URL
driver.get("http://example.com")

# 使用CDP获取网络请求数据
# 需要导入CDP的库或使用selenium的execute_cdp_cmd方法
# 示例代码取决于你如何配置和获取CDP数据
# driver.execute_cdp_cmd('Network.enable', {})
# driver.execute_cdp_cmd('Network.setCaptureMode', {"mode": "includeAll"})
# network_logs = driver.execute_cdp_cmd('Network.getAllRequests', {})
# print(network_logs)

# 这里仅是一个示例,你需要根据CDP文档来实现具体功能

# 关闭WebDriver
driver.quit()

这种方法要求你事先手动打开Chrome浏览器并配置远程调试端口(通常是9222)。

注意事项

  • 确保你的Chrome浏览器版本与Selenium WebDriver版本兼容。
  • 使用HTTPS时,可能需要处理SSL证书问题。
  • 在处理网络请求数据时,确保遵守相关法律法规和隐私政策。

通过以上方法,你可以在使用Selenium进行网页自动化测试时获取网络请求数据。

相关推荐
wtGEOyh1 分钟前
2026:劲豆如何用科技“种”出大豆芯?
python·科技
SamChan9010 分钟前
用Prometheus+Grafana搭建PDF翻译服务监控看板:指标采集与告警实战
python·ai·pdf·grafana·prometheus·机器翻译
circuitsosk12 分钟前
多智能体协同在能源数据分析中的实践:分配-执行-校验闭环架构设计
python·数据分析·wpf·能源·并行计算·多智能体系统·agent协作
niuniudengdeng16 分钟前
从小程序到 WebView:一个理发店管理系统的全栈架构设计与落地实践
java·python
心易行者22 分钟前
html在线运行搭AI编程验证流水线:5步走完从生成到到上线全流程
人工智能·python·ai编程
一晌小贪欢26 分钟前
Python办公17:暴力拆分——按页数或指定范围提取 PDF 核心页面
java·开发语言·python·pdf·excel·数据可视化·python办公
青 春 记 忆28 分钟前
零基础入门python31:Django商城第一步——创建项目并跑通第一个请求
python·django·后端开发
孫治AllenSun28 分钟前
【LangChain4J-06】Prompt 工程与模板化开发
开发语言·python·prompt
qq_4260039629 分钟前
多语言新增语种全量测试策略
前端·javascript·python·pycharm·自动化
AuLuo-32 分钟前
SearXNG 物理机部署搭建免费搜索引擎服务
python·搜索引擎