部署在Heroku服务器的Java应用中ChromeDriver测试失败问题
问题原因分析
从你提供的日志里的SEVERE: org.apache.commons.exec.ExecuteException: Process exited with an error: 127可以直接定位核心问题:Unix系统里的退出码127表示找不到要执行的二进制文件。
本地运行正常是因为你的电脑上已经安装了Chrome浏览器,WebDriverManager能下载对应版本的ChromeDriver,然后顺利驱动本地Chrome。但Heroku的默认dyno环境里没有预装Chrome浏览器,所以ChromeDriver启动后找不到可以驱动的浏览器进程,最终超时抛出WebDriverException。
解决方案
要在Heroku上运行ChromeDriver测试,需要两步:给Heroku安装Chrome浏览器,同时调整ChromeOptions适配容器环境。
1. 给Heroku添加Chrome Buildpack
Heroku支持通过buildpack安装额外软件,我们需要用官方的Google Chrome buildpack来安装浏览器:
- 如果你用Heroku CLI执行:
# 先添加Chrome的buildpack heroku buildpacks:add https://github.com/heroku/heroku-buildpack-google-chrome.git # 确保Java buildpack在后面(如果还没加的话) heroku buildpacks:add heroku/java - 或者在Heroku控制台的应用「设置」里,找到「Buildpacks」,先添加Google Chrome的buildpack,再添加Java的buildpack(顺序很重要,Chrome需要先安装)。
2. 修改你的ChromeDriver配置代码
需要调整ChromeOptions,指定Chrome的安装路径,同时添加容器环境必需的参数:
WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); // 无头模式(必须,Heroku没有图形界面) options.addArguments("--headless"); // 指定Heroku上Chrome的固定安装路径(来自buildpack) options.setBinary("/app/.apt/usr/bin/google-chrome"); // 禁用沙箱:Heroku容器是非特权环境,Chrome沙箱无法运行 options.addArguments("--no-sandbox"); // 禁用/dev/shm使用:Heroku的/dev/shm分区过小,避免内存不足 options.addArguments("--disable-dev-shm-usage"); // 可选:设置窗口大小,避免页面布局异常 options.addArguments("--window-size=1920,1080"); driver = new ChromeDriver(options); driver.navigate().to("https://pazukdevtestapp1.herokuapp.com/#!Hotels");
关键参数说明
--no-sandbox:Chrome的沙箱模式需要特权权限,而Heroku的dyno是无特权运行的,必须禁用才能启动。--disable-dev-shm-usage:默认情况下Chrome会使用/dev/shm共享内存,但Heroku给这个分区的配额很小,禁用后Chrome会改用磁盘临时文件,避免因内存不足崩溃。- 固定二进制路径:Heroku buildpack安装的Chrome不在系统默认PATH中,必须手动指定路径才能让ChromeDriver找到它。
这样修改后,重新部署你的Vaadin应用到Heroku,点击「Play demo」按钮应该就能正常启动测试了。
内容的提问来源于stack exchange,提问作者pazukdev
相关产品推荐
相关产品推荐

