Selenium WebDriver启动Chrome报SessionNotCreatedException等异常求解
根因分析
三个报错属于配置过时+Lambda环境适配缺失叠加导致,核心诱因如下:
- 首次触发
SessionNotCreatedException:Selenium 4.x版本已不再支持同时传入options与desired_capabilities参数初始化WebDriver,且Chrome 103配套的ChromeDriver已完全遵循W3C WebDriver标准,代码中遗留的add_experimental_option('w3c', False)是适配ChromeDriver 75及更早版本的过时配置,会直接破坏capabilities的W3C结构校验;同时手动构造的desired_cap中重复嵌套了options字段,和入参的options对象冲突,最终导致会话创建失败。 - 第二次触发
DevToolsActivePort file doesn't exist崩溃:一是代码将headless等容器必备启动参数的加载逻辑绑定到了DOCKER_AUTH_CONFIG环境变量判断上,AWS Lambda运行时默认不存在该环境变量,导致无GUI场景下Chrome未启动headless模式直接崩溃;二是过时的w3c=False配置导致ChromeDriver与Chrome的DevTools通信协议不匹配,无法正常读取调试端口信息。 - 第三次触发
unable to discover open window in chrome:硬编码--remote-debugging-port=9222在Lambda沙箱环境中容易触发端口占用、绑定权限异常问题,同时代码仍同时传入options和手动构造的desired_capabilities,存在capabilities合并冲突,导致Chrome启动后Driver无法附着到浏览器会话。
注:你使用的ChromeDriver 103.0.5060.53与Chrome 103.0.5060.114属于同大版本兼容范围,版本匹配不是故障诱因。
可行解决方案
按以下步骤调整配置即可正常运行,适配AWS Lambda Python 3.9 x86_64运行环境:
- 清理所有过时配置:删除
w3c=False相关实验选项,Chrome 100+版本已完全移除非W3C模式支持,保留该配置只会引发协议不兼容问题。 - 统一配置入口:废弃手动构造
desired_capabilities的写法,所有浏览器参数、能力配置全部挂载到ChromeOptions对象上,初始化时仅传入service和options两个参数,避免capabilities冲突。 - 取消headless模式的环境变量判断:Lambda为无GUI的Serverless环境,必须始终开启headless模式,不要依赖自定义环境变量控制该参数。
- 移除硬编码的远程调试端口:交由ChromeDriver自动分配空闲端口,避免沙箱环境下的端口冲突、权限问题。
- 补充Lambda环境必备的Chrome启动参数,规避沙箱权限、GPU渲染、内存不足类问题。
调整后的可直接运行的初始化代码如下:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options def init_chrome_driver(): chrome_opts = Options() # 基础访问配置 chrome_opts.add_argument("--allow-running-insecure-content") chrome_opts.add_argument("--ignore-certificate-errors") # Lambda无GUI环境必加参数 chrome_opts.add_argument("--headless=new") chrome_opts.add_argument("--no-sandbox") chrome_opts.add_argument("--disable-dev-shm-usage") chrome_opts.add_argument("--disable-gpu") chrome_opts.add_argument("--single-process") chrome_opts.add_argument("--disable-extensions") chrome_opts.add_argument("--disable-application-cache") chrome_opts.add_argument("--window-size=1920,1080") # 指定二进制路径 chrome_opts.binary_location = '/usr/bin/google-chrome' # W3C标准模式下配置性能日志、不安全证书忽略能力 chrome_opts.set_capability('goog:loggingPrefs', {'performance': 'INFO'}) chrome_opts.set_capability('acceptInsecureCerts', True) # 初始化Driver,禁止额外传入desired_capabilities参数 chrome_service = Service(executable_path='/usr/local/bin/chromedriver') driver = webdriver.Chrome(service=chrome_service, options=chrome_opts) return driver
额外注意事项
- 确认ECR镜像内打包的Chrome、ChromeDriver均为x86_64架构版本,误装arm架构二进制会导致二进制无法执行,触发同类崩溃报错。
- Lambda函数内存配置建议不低于1024MB,内存不足会导致Chrome启动时被系统OOM杀掉,出现进程异常退出的报错。
- 如果需要采集性能日志,必须使用
goog:loggingPrefs字段配置,老版本的loggingPrefs字段不符合W3C规范,在Chrome 100+版本下不会生效。
内容的提问来源于stack exchange,提问作者Wintern
相关产品推荐
相关产品推荐

