You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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-chrome
  • CHROMEDRIVER_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版本:

  1. 下载对应Chrome 107版本的Linux ChromeDriver(从ChromeDriver官方渠道获取适配Linux x86_64的压缩包)
  2. 解压后替换项目根目录的chromedriver文件
  3. 在Heroku中设置文件可执行权限:在项目根目录创建Procfile,添加命令确保chromedriver可执行(或通过chmod +x chromedriver在部署脚本中处理)
  4. 代码中保持--no-sandbox和--disable-dev-shm-usage参数,避免Heroku环境的权限和内存问题

关键注意点

  • options.setBinary()是设置Chrome浏览器的路径,不是ChromeDriver的路径,之前的错误用法会导致浏览器启动失败
  • Heroku的临时文件系统需要确保chromedriver有可执行权限
  • --disable-dev-shm-usage参数必须添加,解决Heroku共享内存不足的问题

内容的提问来源于stack exchange,提问作者Anton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:50:26