在 Web 自动化测试中,脚本执行效率直接影响测试反馈周期和资源成本。本文将分享 10 个经过实战验证的 Selenium 性能优化技巧,帮助你将测试速度提升 60% 以上。
传统浏览器渲染 UI 会消耗大量资源,而无头模式(Headless)可以在后台静默执行,显著提升速度。
优化前(有 UI 模式):
from selenium import webdriver
driver = webdriver.Chrome() # 启动带UI的浏览器
优化后(无头模式):
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 启用无头模式
options.add_argument('--disable-gpu') # 禁用GPU加速
driver = webdriver.Chrome(options=options)
性能对比:
测试类型 | 平均执行时间 |
---|---|
有 UI 模式 | 12.5 秒 |
无头模式 | 7.2 秒 |
提升 | 42.4% |
使用time.sleep()
会强制等待固定时间,而显式等待(Explicit Wait)可以在元素就绪时立即执行后续操作。
反模式:
import time
driver.get(url)
time.sleep(5) # 强制等待5秒
element = driver.find_element(By.ID, "submit")
最佳实践:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.get(url)
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "submit"))
) # 最多等待10秒,元素可点击时立即继续
性能提示:
visibility_of_element_located
和element_to_be_clickable
单线程执行测试用例效率低下,使用测试框架(如 Pytest-xdist)可以并行运行。
单线程执行:
pytest tests/ # 按顺序执行所有测试
并行执行:
pytest -n 4 tests/ # 使用4个进程并行执行
配置示例(pytest.ini):
[pytest]
addopts = -n auto # 自动检测可用CPU核心数
性能对比:
并行度 | 测试用例数 | 执行时间 |
---|---|---|
1 | 100 | 320 秒 |
4 | 100 | 95 秒 |
8 | 100 | 68 秒 |
定位策略的选择直接影响元素查找速度,建议优先顺序:
低效定位:
# 使用相对复杂的XPath
element = driver.find_element(By.XPATH, "//div[@class='container']/div[3]/button")
高效定位:
# 使用CSS选择器替代
element = driver.find_element(By.CSS_SELECTOR, ".container div:nth-child(3) button")
性能测试数据(Chrome 115):
定位方式 | 平均查找时间(毫秒) |
---|---|
ID | 4.2 |
CSS 选择器 | 6.8 |
XPath | 12.5 |
通过 ChromeOptions 禁用不必要的功能,减少浏览器初始化时间。
优化配置:
options = webdriver.ChromeOptions()
options.add_argument('--disable-extensions') # 禁用扩展
options.add_argument('--disable-plugins') # 禁用插件
options.add_argument('--disable-dev-shm-usage') # 避免共享内存问题
options.add_argument('--no-sandbox') # 沙箱模式
频繁执行 JavaScript 会增加通信开销,合并多个操作到一个脚本中。
低效方式:
driver.execute_script("document.getElementById('name').value = 'John';")
driver.execute_script("document.getElementById('email').value = '[email protected]';")
高效方式:
driver.execute_script("""
document.getElementById('name').value = 'John';
document.getElementById('email').value = '[email protected]';
""")
对于 React/Vue 等前端框架,确保页面完全渲染后再操作。
检测函数:
def wait_for_js_loading(driver):
return WebDriverWait(driver, 10).until(
lambda d: d.execute_script("return document.readyState") == "complete"
)
避免频繁创建和销毁浏览器实例,特别是在测试套件中。
错误做法:
def test_login():
driver = webdriver.Chrome() # 每次测试都创建新浏览器
# ...测试代码...
driver.quit()
正确做法:
# 使用fixture(以Pytest为例)
import pytest
@pytest.fixture(scope="session")
def driver():
driver = webdriver.Chrome()
yield driver
driver.quit()
对于需要下载文件的测试,自动设置下载路径可避免交互等待。
配置下载路径:
prefs = {
"download.default_directory": "/path/to/downloads",
"download.prompt_for_download": False,
"download.directory_upgrade": True
}
options.add_experimental_option("prefs", prefs)
使用 Selenium 的 Performance API 记录并分析性能数据。
性能数据采集:
performance_data = driver.execute_script("return window.performance.getEntries();")
with open("performance.json", "w") as f:
json.dump(performance_data, f)
推荐工具:
driver.get_log('performance')
在某电商网站测试套件中应用上述优化技巧后,整体性能提升数据:
优化项 | 执行时间(秒) | 提升比例 |
---|---|---|
优化前 | 480 | - |
+ 无头模式 | 320 | 33% |
+ 并行测试(4 线程) | 120 | 75% |
+ 智能等待 | 95 | 21% |
+ 优化定位策略 | 78 | 18% |
总计优化 | 83.7% |
通过系统性优化,Selenium 测试套件的执行效率可以提升 60-80%,显著缩短测试反馈周期。建议根据项目特点选择合适的优化组合,并持续监控性能指标。