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
打印为 PDFprint_page()4 stars
虚拟认证器(Biometric)模拟指纹/面容5 stars
网络拦截(selenium-wire)捕获 API5 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-wireAPI 监控
长截图CDP + 滚动完整页面
弱网测试Network.emulateNetworkConditions性能测试
地理位置Emulation.setGeolocationOverrideLBS 测试
PDF 导出print_page()报告生成

十二、一句话总结

Selenium 高级 = CDP + 相对定位 + 网络拦截 + 虚拟认证 + Docker = 自动化测试天花板


下一步
想获取 完整企业级高级框架(含 CDP 拦截、性能基线、自动重试、邮件告警、K8s 部署)?
回复 advanced_pro 我立刻发你一个 可直接上生产的项目模板


当前最强组合

Selenium 4 + CDP + selenium-wire + Docker + pytest + Allure

现在,你已掌握 Selenium 的“黑魔法”!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注