Docker中Selenium报SessionNotCreatedException异常咨询
问题根因
报错里的DevToolsActivePort file doesn't exist是容器环境运行Chrome的典型错误,触发原因如下:
- 未给Chrome配置容器环境必需的启动参数:容器默认无图形界面,且默认root用户运行时Chrome的沙箱机制会拦截启动,缺少对应参数时Chrome会直接崩溃
- Docker默认分配的共享内存(/dev/shm)仅64M,Chrome运行时内存不足会触发崩溃
- 本地Selenium依赖版本(3.141.59)和Grid节点内的Selenium版本(4.3.0)跨大版本不兼容,存在协议适配问题
- 若使用自定义构建的Chrome节点镜像,可能存在Chrome与ChromeDriver版本不匹配的问题
可行修复步骤
- 替换原有浏览器配置逻辑,废弃旧的
DesiredCapabilities简单初始化方式,改用ChromeOptions传入容器必需的启动参数,修正后的完整测试代码如下:
package docker; import java.net.MalformedURLException; import java.net.URL; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.RemoteWebDriver; public class DockerDemoClass { public static void main(String[] args) throws MalformedURLException { ChromeOptions options = new ChromeOptions(); // 容器无GUI环境必填启动参数 options.addArguments("--headless=new"); options.addArguments("--no-sandbox"); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--disable-gpu"); URL url = new URL("http://localhost:4444/wd/hub"); RemoteWebDriver driver = new RemoteWebDriver(url, options); driver.get("https://www.youtube.com/watch?v=UzwnM13Na8E"); System.out.println("Title is " + driver.getTitle()); driver.quit(); } }
- 调整Selenium Grid的Docker启动命令,优先使用官方预构建的standalone-chrome镜像,同时调大共享内存配置,启动前先停掉之前运行的冲突容器,执行以下命令启动服务:
docker run -d -p 4444:4444 --shm-size="2g" selenium/standalone-chrome:4.3.0
注意镜像版本号和你本地引入的Selenium依赖版本保持一致,避免跨版本协议不兼容问题。
- 若使用WSL2后端运行Docker,需要确认WSL2分配的内存不小于2G,避免内存不足导致Chrome进程被系统杀死。
- 若使用自定义构建的Grid节点镜像,进入节点容器执行
google-chrome --version和chromedriver --version,确认两个版本号完全对应,版本不匹配时重新安装对应版本的ChromeDriver即可。
内容的提问来源于stack exchange,提问作者Krishnanand Kaipamkunnath
相关产品推荐
相关产品推荐

