在Heroku部署Discord Bot时ChromeDriver启动失败求助
解决Heroku部署Discord Bot时Selenium ChromeDriver启动失败问题
错误原因
你遇到的Syntax error: word unexpected本质是ChromeDriver二进制文件不兼容:本地Mac使用的是适配macOS的ChromeDriver,而Heroku运行在Linux x86_64环境下,直接上传Mac版本的chromedriver到Heroku会导致执行时崩溃,进而触发SessionNotCreatedException。
解决方案:使用Heroku Chrome构建包(推荐)
Heroku有官方维护的Chrome构建包,可自动配置Chrome浏览器和对应版本的ChromeDriver,无需手动管理二进制文件:
1. 添加Heroku构建包
通过Heroku CLI或控制台添加两个构建包:
# 添加JVM构建包(运行Java程序) heroku buildpacks:add heroku/jvm # 添加Chrome构建包(安装Chrome和ChromeDriver) heroku buildpacks:add https://github.com/heroku/heroku-buildpack-google-chrome.git
2. 设置环境变量
在Heroku控制台的"Settings" -> "Config Vars"中添加以下变量:
GOOGLE_CHROME_BIN:/app/.apt/usr/bin/google-chromeCHROMEDRIVER_PATH:/app/.chromedriver/bin/chromedriver
3. 修改Selenium代码
调整ChromeOptions和WebDriver初始化逻辑,适配Heroku环境:
ChromeOptions options = new ChromeOptions(); // 从环境变量获取Chrome和ChromeDriver路径 String chromeBinary = System.getenv("GOOGLE_CHROME_BIN"); String chromeDriverPath = System.getenv("CHROMEDRIVER_PATH"); if (chromeBinary != null && chromeDriverPath != null) { // Heroku环境下的配置 System.setProperty("webdriver.chrome.driver", chromeDriverPath); options.setBinary(chromeBinary); options.addArguments("--no-sandbox"); options.addArguments("--headless"); options.addArguments("--disable-dev-shm-usage"); // 解决Heroku内存限制问题 options.addArguments("--lang=en"); } else { // 本地开发环境配置 System.setProperty("webdriver.chrome.driver", "chromedriver"); options.addArguments("--lang=en"); options.addArguments("--headless"); } WebDriver driver = new ChromeDriver(options);
备选方案:手动替换Linux版本ChromeDriver
如果不想用构建包,可手动替换项目中的chromedriver为Linux x86_64版本:
- 下载对应Chrome 107版本的Linux ChromeDriver(从ChromeDriver官方渠道获取适配Linux x86_64的压缩包)
- 解压后替换项目根目录的
chromedriver文件 - 在Heroku中设置文件可执行权限:在项目根目录创建
Procfile,添加命令确保chromedriver可执行(或通过chmod +x chromedriver在部署脚本中处理) - 代码中保持
--no-sandbox和--disable-dev-shm-usage参数,避免Heroku环境的权限和内存问题
关键注意点
options.setBinary()是设置Chrome浏览器的路径,不是ChromeDriver的路径,之前的错误用法会导致浏览器启动失败- Heroku的临时文件系统需要确保chromedriver有可执行权限
--disable-dev-shm-usage参数必须添加,解决Heroku共享内存不足的问题
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

