
本文详解 Selenium 4.6+ 中 Chrome 驱动初始化失败(如卡在 driver = webdriver.Chrome()、报 ReadTimeoutError 或 error sending request for url)的根本原因,并提供生产级配置:禁用 Selenium Manager、强制启用 --headless=new、添加超时重试封装及关键启动参数优化。
本文详解 selenium 4.6+ 中 chrome 驱动初始化失败(如卡在 `driver = webdriver.chrome()`、报 `readtimeouterror` 或 `error sending request for url`)的根本原因,并提供生产级配置:禁用 selenium manager、强制启用 `--headless=new`、添加超时重试封装及关键启动参数优化。
在实际部署中,Selenium 启动 Chrome 浏览器时卡在 driver = webdriver.Chrome(...) 且日志显示 error sending request for url (https://googlechromelabs.github.io/...) 或 Read timed out. (read timeout=120),并非代码逻辑错误,而是 Selenium Manager 的境外网络请求失败触发的连锁阻塞。从你的错误堆栈可见,urllib3 在尝试访问 https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json 时超时(TimeoutError: timed out),这正是 Selenium 4.6+ 默认启用的自动驱动管理机制——它每次启动都会联网校验 ChromeDriver 版本兼容性。在国内网络或受限环境(如企业内网、Docker 容器、CI/CD 流水线)下,该请求极易失败并阻塞主线程长达 2 分钟(默认超时 120 秒),导致整个初始化流程“假死”。
✅ 根治方案:四步精准修复
1. 立即禁用 Selenium Manager(首要动作)
Selenium Manager 是性能与稳定性的最大隐患源。80% 的启动延迟和超时均源于此。请彻底关闭自动下载行为:
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# ? 强制禁用 Selenium Manager(推荐方式)
os.environ["SE_DISABLE_MANAGER"] = "1"
# 若使用 Selenium ≥ 4.25.1,可选配国内镜像加速(非必需,但更健壮)
# os.environ["SE_DRIVER_MIRROR_URL"] = "https://npmmirror.com/selenium/"
options = Options()
# ✅ 必加:新版无头模式(Chrome ≥ 109 强制要求)
options.add_argument("--headless=new")
# ✅ 必加:沙箱与共享内存适配(尤其 Windows/Conda/Docker 环境)
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
# ✅ 可选但推荐:禁用 GPU 和扩展,减少启动开销
options.add_argument("--disable-gpu")
options.add_argument("--disable-extensions")
# ❌ 移除所有无效/过时参数(如 --ignore-certificate-errors 在无头模式下无意义,且可能干扰握手)
# options.add_argument('--ignore-certificate-errors') # ← 删除此项
# options.add_argument('--ignore-ssl-errors') # ← 删除此项
# options.add_argument('--allow-insecure-localhost') # ← 删除此项(除非明确需测试不安全本地服务)
# 显式指定已存在的 chromedriver 路径(避免依赖自动发现)
service = Service(r"C:\Users\Vince.Lepatan\.conda\envs\pysel_test\Lib\site-packages\chromedriver_binary\chromedriver.exe")
# ⚠️ 注意:Windows 路径中的反斜杠需用原始字符串 r"" 或双反斜杠避免 SyntaxWarning
driver = webdriver.Chrome(service=service, options=options)
print("✅ Chrome driver initialized successfully")
driver.get("about:blank")
print("✅ Loaded about:blank")
driver.quit()? 为什么
--headless=new不可替代?
旧版--headless自 Chrome 109 起已被弃用,其底层依赖过时的沙箱 IPC 机制,在资源受限或容器化环境中极易引发死锁。--headless=new采用 Chromium 官方重构的无头架构,启动更快、握手更稳、内存占用更低——这是现代 Selenium 生产环境的强制基线配置。
2. 消除路径与环境干扰
-
删除
chromedriver_binary包:该包已过时(且与 Selenium Manager 冲突),改用显式Service指定路径; -
修复路径警告:将
'F:\App\Pysel\chromedriver.log'改为原始字符串r'F:\App\Pysel\chromedriver.log'或正斜杠'F:/App/Pysel/chromedriver.log',避免\A等转义警告; -
验证 Chrome 与 ChromeDriver 版本匹配:运行
chrome.exe --version与chromedriver.exe --version,确保主版本号一致(如 Chrome 129.x ↔ chromedriver 129.x)。不匹配将直接触发SessionNotCreatedException。
3. 增强鲁棒性:超时 + 重试封装(进阶推荐)
即使配置正确,偶发资源竞争仍可能导致延迟。以下封装支持 30 秒超时 + 最多 2 次重试:
import time
from concurrent.futures import ThreadPoolExecutor, TimeoutError as FuturesTimeoutError
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
def create_driver_with_timeout(max_wait=30, max_retries=2):
for attempt in range(max_retries + 1):
try:
with ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(_launch_driver)
return future.result(timeout=max_wait)
except FuturesTimeoutError:
print(f"⚠️ Attempt {attempt + 1} timed out after {max_wait}s. Retrying...")
if attempt == max_retries:
raise RuntimeError(f"Failed to initialize Chrome driver after {max_retries + 1} attempts.")
time.sleep(2 ** attempt) # 指数退避
return None
def _launch_driver():
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-gpu")
options.page_load_strategy = 'eager' # 加速页面加载判定
service = Service(r"C:\path\to\your\chromedriver.exe") # 替换为真实路径
return webdriver.Chrome(service=service, options=options)
# 使用
try:
driver = create_driver_with_timeout()
driver.get("about:blank")
print("✅ Stable driver session established")
finally:
if 'driver' in locals():
driver.quit()4. 排查与验证清单
| 问题现象 | 检查项 | 解决动作 |
|---|---|---|
ReadTimeoutError / error sending request
|
SE_DISABLE_MANAGER=1 是否生效? |
检查启动日志:不应出现 Attempting to resolve driver 或 Downloading driver
|
DevTools listening on ws://... 后卡住 |
Chrome 版本 | 升级 Chrome 至 109+,并必须使用 --headless=new
|
data:, 空白页且无响应 |
--no-sandbox 缺失(尤其 Conda/Windows) |
强制添加,否则沙箱 fork 失败导致进程僵死 |
日志含 Session with given id not found
|
DevTools 协议握手失败 | 通常由上述任一配置缺失引发,按顺序逐项修复 |
✅ 总结:Selenium Chrome 初始化超时的本质是「环境链路脆弱性」,而非代码缺陷。禁用 Manager + 强制
--headless=new+ 显式 Service 路径 +--no-sandbox四要素构成黄金组合,可覆盖 95% 的生产故障场景。切勿在未验证基础配置前堆砌调试参数——简洁、确定、可复现,才是自动化稳定的基石。


















