Selenium 高级功能
Selenium 高级功能全攻略(2025 最新版 · Selenium 4+)
从“能用”到“专业级”
掌握 CDP、相对定位、事件监听、截图 PDF、虚拟认证器、Docker 扩展、性能分析 等 15+ 项高级功能,打造企业级自动化平台!
一、Selenium 4 核心高级特性
| 功能 | 说明 | 级别 |
|---|---|---|
| Chrome DevTools Protocol (CDP) | 深度控制浏览器 | 5 stars |
| 相对定位(Relative Locators) | 智能定位 | 4 stars |
| 新窗口管理 | new_window() | 3 stars |
| 截取元素截图 | element.screenshot() | 3 stars |
| 打印为 PDF | print_page() | 4 stars |
| 虚拟认证器(Biometric) | 模拟指纹/面容 | 5 stars |
| 网络拦截(selenium-wire) | 捕获 API | 5 stars |
二、Chrome DevTools Protocol (CDP) —— 最强武器
直接调用 Chrome 底层 API,实现 Selenium 无法做的事!
1. 启用 CDP
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 可选
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
# 启用 CDP
driver.execute_cdp_cmd("Network.enable", {})
2. 常用 CDP 命令(必背 10 个)
| 功能 | 命令 | 示例 |
|---|---|---|
| 拦截网络请求 | Network.setRequestInterception | 屏蔽广告 |
| 模拟地理位置 | Emulation.setGeolocationOverride | 定位测试 |
| 模拟设备 | Emulation.setDeviceMetricsOverride | 手机模式 |
| 监听网络 | Network.responseReceived | 抓包 |
| 修改请求头 | Network.setExtraHTTPHeaders | 伪装 UA |
| 截取完整长图 | Page.captureScreenshot + 滚动 | 超长页面 |
| 性能分析 | Performance.getMetrics | 加载时间 |
| 阻塞资源 | Network.emulateNetworkConditions | 模拟弱网 |
| 清除缓存 | Network.clearBrowserCache | 强制刷新 |
| 开启日志 | Log.enable | 控制台日志 |
3. 实战:拦截并修改 API 响应
# 拦截所有 /api/ 请求
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setRequestInterception", {
"patterns": [{"urlPattern": "*api*", "resourceType": "XHR"}]
})
def request_intercepted(event):
if "mock_data" in event["request"]["url"]:
driver.execute_cdp_cmd("Network.continueInterceptedRequest", {
"interceptionId": event["interceptionId"],
"rawResponse": "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n" +
'{"mock": true, "data": "Selenium CDP 注入"}'
})
driver.add_cdp_listener("Network.requestIntercepted", request_intercepted)
4. 实战:模拟弱网 + 地理位置
# 模拟 2G 网络
driver.execute_cdp_cmd("Network.emulateNetworkConditions", {
"offline": False,
"latency": 500,
"downloadThroughput": 500 * 1024 / 8,
"uploadThroughput": 500 * 1024 / 8,
"connectionType": "cellular2g"
})
# 模拟北京位置
driver.execute_cdp_cmd("Emulation.setGeolocationOverride", {
"latitude": 39.9042,
"longitude": 116.4074,
"accuracy": 100
})
三、相对定位(Relative Locators)—— 智能定位
from selenium.webdriver.support.relative_locator import with_tag_name
# 已知元素
login_btn = driver.find_element(By.ID, "submit")
# 定位它上方的用户名输入框
username = driver.find_element(with_tag_name("input").above(login_btn))
# 定位右侧的“忘记密码?”
forgot = driver.find_element(with_tag_name("a").to_right_of(login_btn))
# 附近 100px 内的按钮
near_btn = driver.find_element(with_tag_name("button").near(login_btn))
四、截图 & PDF 高级操作
1. 元素截图(Selenium 4)
element = driver.find_element(By.ID, "chart")
element.screenshot("chart.png")
2. 打印为 PDF(headless 必备)
# 需 headless + 打印配置
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--print-to-pdf")
driver = webdriver.Chrome(options=options)
driver.get("https://example.com/report")
pdf_bytes = driver.print_page()
with open("report.pdf", "wb") as f:
f.write(pdf_bytes)
五、虚拟认证器(Biometric Auth)—— 绕过指纹登录
# 启用虚拟认证器
driver.execute_cdp_cmd("WebAuthn.enable", {})
# 添加虚拟凭证
driver.execute_cdp_cmd("WebAuthn.addVirtualAuthenticator", {
"options": {
"protocol": "ctap2",
"transport": "usb",
"hasResidentKey": True,
"hasUserVerification": True,
"isUserVerified": True
}
})
# 自动通过验证
driver.execute_cdp_cmd("WebAuthn.credentialAdded", {
"credential": {
"credentialId": "xxx",
"isResidentCredential": True,
"privateKey": "xxx",
"signCount": 0
}
})
六、网络拦截神器:selenium-wire
pip install selenium-wire
from seleniumwire import webdriver
options = {
'proxy': {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
}
driver = webdriver.Chrome(seleniumwire_options=options)
driver.get("https://httpbin.org/headers")
# 捕获所有请求
for request in driver.requests:
if request.response:
print(request.url, request.response.status_code)
# 修改请求
def interceptor(request):
if "ads" in request.url:
request.abort()
driver.request_interceptor = interceptor
七、性能分析(Performance Metrics)
metrics = driver.execute_cdp_cmd("Performance.getMetrics", {})
for m in metrics["metrics"]:
if m["name"] in ["FirstMeaningfulPaint", "Load", "DomContentLoaded"]:
print(f"{m['name']}: {m['value']:.2f}ms")
八、Docker 高级配置(生产必备)
# Dockerfile
FROM selenium/standalone-chrome:4.25.0
# 安装中文字体
USER root
RUN apt-get update && apt-get install -y fonts-wqy-zenhei
# 复制测试脚本
COPY tests /tests
# docker-compose.yml
services:
chrome:
build: .
volumes:
- ./reports:/reports
environment:
- SE_EVENT_BUS_HOST=event-bus
九、事件监听(EventFiringWebDriver)
from selenium.webdriver.support.event_firing_webdriver import EventFiringWebDriver
from selenium.webdriver.support.abstract_event_listener import AbstractEventListener
class MyListener(AbstractEventListener):
def after_navigate_to(self, url, driver):
print(f"导航到: {url}")
def on_exception(self, exception, driver):
driver.save_screenshot("error.png")
ef_driver = EventFiringWebDriver(driver, MyListener())
十、完整高级项目模板(一键运行)
# 项目结构
advanced_selenium/
├── cdp/ # CDP 工具
├── pages/ # Page Object
├── tests/
│ ├── test_perf.py
│ └── test_mock_api.py
├── utils/
│ └── screenshot.py
└── docker-compose.yml
# cdp/network.py
def block_ads(driver):
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setBlockedURLs", {"urls": ["*.ads.com/*"]})
# 启动
docker-compose up --build
pytest -n 4 --alluredir=reports
十一、高级功能速查表
| 功能 | 命令 | 一句话 |
|---|---|---|
| 拦截广告 | Network.setBlockedURLs | 屏蔽资源 |
| 模拟手机 | Emulation.setDeviceMetricsOverride | 移动端测试 |
| 抓包 | selenium-wire | API 监控 |
| 长截图 | CDP + 滚动 | 完整页面 |
| 弱网测试 | Network.emulateNetworkConditions | 性能测试 |
| 地理位置 | Emulation.setGeolocationOverride | LBS 测试 |
| PDF 导出 | print_page() | 报告生成 |
十二、一句话总结
Selenium 高级 = CDP + 相对定位 + 网络拦截 + 虚拟认证 + Docker = 自动化测试天花板
下一步:
想获取 完整企业级高级框架(含 CDP 拦截、性能基线、自动重试、邮件告警、K8s 部署)?
回复 advanced_pro 我立刻发你一个 可直接上生产的项目模板!
当前最强组合:
Selenium 4 + CDP + selenium-wire + Docker + pytest + Allure
现在,你已掌握 Selenium 的“黑魔法”!