使用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进行网页自动化测试时获取网络请求数据。

相关推荐
Jackilina_Stone13 分钟前
【论文阅读/复现】RT-DETR的网络结构/训练/推理/验证/导出模型
论文阅读·python·目标检测·rt-detr
编程自留地24 分钟前
第10次:电商项目配置开发环境
python·django·商城
IT技术员30 分钟前
【Java学习】动态代理有哪些形式?
java·python·学习
q_q王34 分钟前
本地知识库工具FASTGPT的安装与搭建
python·大模型·llm·知识库·fastgpt
lanboAI35 分钟前
基于卷积神经网络的蔬菜水果识别系统,resnet50,mobilenet模型【pytorch框架+python源码】
pytorch·python·cnn
像风一样自由202040 分钟前
浏览器自动化工具:Selenium 和 Playwright
运维·selenium·自动化
一刀到底21142 分钟前
ai agent(智能体)开发 python3基础8 网页抓取中 selenium 和 Playwright 区别和联系
人工智能·python
剑哥在胡说1 小时前
Python三大Web框架对比:Django、Flask、Tornado的异步实现方式详解
数据库·python·django·flask·tornado
xaletry8881 小时前
环境-疲劳载荷综合试验系统
测试工具
da-peng-song1 小时前
ArcGIS arcpy代码工具——根据属性结构表创建shape图层
javascript·python·arcgis