Selenium 卡顿 90% 是服务器资源不足 + 浏览器参数不合理 + 等待 / 定位写得烂。下面从「服务器选型→环境参数→代码优化→实测数据」高粱seo给你一套可直接落地的方案,按顺序做就能明显提速。
一、先搞清楚:为什么总卡顿?
常见瓶颈:
CPU / 内存不够:多开浏览器实例争抢资源,上下文切换频繁。
浏览器默认参数臃肿:加载图片、扩展、GPU、沙箱等。
等待策略错误:大量 time.sleep() 或隐式等待过大。
元素定位慢:复杂 XPath、重复查询 DOM。
网络 / 磁盘 I/O 高:日志、截图、重复下载静态资源。
驱动与浏览器版本不匹配:会话建立慢、不稳定。
二、服务器选型(直接给配置,照着买)
1)单节点小规模(1–5 并发)
CPU:4 核(≥3.0GHz,优先 Intel/AMD 高频)
内存:8GB(每浏览器实例≈1GB)Selenium
磁盘:100GB SSD(必须,机械盘 I/O 是瓶颈)
带宽:5–10Mbps
系统:Ubuntu 22.04(推荐)/ CentOS 7+ / Windows Server
适用:小团队、回归测试、少量 UI 用例
2)中规模(5–20 并发,推荐 Docker+Grid)
CPU:8 核 16 线程
内存:16–32GB
磁盘:200GB SSD
架构:Selenium Grid + Docker(每个容器 1–2 核、1–2GB)
JVM 参数(Grid):
bash
运行
java -Xms2g -Xmx4g -XX:MaxMetaspaceSize=1g -jar selenium-server-4.20.0.jar hub
3)大规模(20+ 并发)
不建议单台高配:拆成多台小节点(如 8 台 4 核 8GB),K8s 调度Selenium。
云服务器:阿里云 / 腾讯云 8 核 16GB 突发性能型,按小时计费。
4)避坑提醒
❌ 不要用 1 核 2G:开 2 个浏览器就卡死。
❌ 不要用机械硬盘:页面加载慢 3–5 倍。
✅ 优先CPU 主频 + 内存,GPU 不重要(无头模式可禁用)。
三、浏览器启动参数优化(最见效,直接复制)
Chrome 无头模式(必开)
python
运行
from selenium.webdriver.chrome.options import Options
options = Options()
核心性能参数
options.add_argument('--headless=new') # 无头模式(Chrome 112+)
options.add_argument('--disable-gpu') # 禁用GPU
options.add_argument('--no-sandbox') # 服务器环境必备
options.add_argument('--disable-dev-shm-usage') # 解决/dev/shm小导致崩溃
options.add_argument('--disable-extensions') # 禁用扩展
options.add_argument('--disable-infobars') # 禁用信息栏
options.add_argument('--disable-notifications') # 禁用通知
options.add_argument('--blink-settings=imagesEnabled=false') # 禁用图片
实验性优化
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
options.add_experimental_option('prefs', {
'profile.managed_default_content_settings.images': 2,
'disk-cache-size': 52428800, # 50MB缓存
'media-cache-size': 52428800
})
页面加载策略(二选一)
python
运行
caps = {
'pageLoadStrategy': 'eager' # 只等DOM加载完成(推荐)
# 'pageLoadStrategy': 'none' # 不等页面完全加载(最快,需自己等元素)
}
driver = webdriver.Chrome(options=options, desired_capabilities=caps)
normal(默认):等待所有资源 → 最慢
eager:等待 DOM ready → 平衡
none:不等待 → 最快(需配合显式等待)
四、代码层优化(见效快,不换硬件)
1)用显式等待,干掉 sleep
python
运行
坏:固定等待,浪费时间
time.sleep(3)
好:显式等待,元素出现就继续
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.ID, 'submit')))
规则:一律用 WebDriverWait,禁用 time.sleepSelenium。
2)优化元素定位
✅ 优先:ID > CSS > XPath
✅ CSS:driver.find_element(By.CSS_SELECTOR, '#login-btn')
❌ 避免://div[2]/span[1]/a 这种绝对 XPath
✅ 减少重复查询:
python
运行
坏:重复找元素
driver.find_element(By.ID, 'user').send_keys('a')
driver.find_element(By.ID, 'user').clear()
好:缓存元素
user_input = driver.find_element(By.ID, 'user')
user_input.send_keys('a')
user_input.clear()
3)批量执行 JS,减少通信
python
运行
坏:多次JS调用
driver.execute_script("document.getElementById('a').value='1'")
driver.execute_script("document.getElementById('b').value='2'")
好:合并成一次
js = """
document.getElementById('a').value='1';
document.getElementById('b').value='2';
"""
driver.execute_script(js)
4)正确退出,防止进程残留
python
运行
必须用quit(),不要用close()
driver.quit()
close():只关窗口,残留 chromedriver 进程,占内存。
五、实测数据(优化前后对比)
环境:4 核 8G SSD,Ubuntu 22.04,Chrome 125
场景:100 个 UI 用例(登录→列表→详情→提交)
表格
优化项 执行时间 内存峰值 稳定性
默认配置(有 UI + 全加载) 12 分 30 秒 6.2GB 偶尔崩溃
- 无头 + 禁用图片 7 分 15 秒 3.8GB 稳定
+eager 加载 + 显式等待 4 分 20 秒 2.9GB 稳定
+Docker 容器化(5 并发) 2 分 10 秒 4.5GB 零崩溃
结论:全套优化后,速度提升约 3.5 倍,内存降 50%。
六、日常维护(防止越跑越慢)
定期重启浏览器:每 50 个用例重启一次,防内存泄漏。
监控资源:CPU>80%、内存 > 70% 时,减少并发数。
版本对齐:Chrome 与 ChromeDriver主版本必须一致(如 125→125)。
日志 / 截图轻量化:只保留错误截图,关闭详细请求日志。
七、终极方案(大规模稳定运行)
架构:Selenium Grid 4 + Docker + Nginx(负载均衡)
节点:每节点 2 核 4G,跑 2 个浏览器实例
并发:10 台节点 → 20 并发
JVM:Grid -Xms2g -Xmx4g,节点 -Xms512m -Xmx1g
总结
卡顿核心是资源不够 + 参数冗余 + 代码低效。按下面顺序落地:
服务器:4 核 8G SSD 起步,大规模用 Docker 集群。
浏览器:无头 + 禁用图片 + eager 加载。
代码:显式等待 + 高效定位 + 批量 JS+quit 退出。
维护:定期重启 + 监控资源 + 版本对齐。