Rails部署Heroku运行Selenium爬虫提示Webdrivers::BrowserNotFound错误如何解决
解决方案
1. 修正Buildpack加载顺序
Heroku buildpack会按从上到下的顺序执行,错误的顺序会导致环境变量被覆盖、依赖加载失败。首先执行命令查看当前buildpack顺序:
heroku buildpacks
正确的顺序应为:
- heroku/ruby(Rails默认buildpack,需排在最前)
- https://github.com/heroku/heroku-buildpack-google-chrome
- https://github.com/heroku/heroku-buildpack-chromedriver
如果顺序不符,可通过以下命令调整索引(索引从1开始):
# 示例:将Chrome buildpack调整到第2位 heroku buildpacks:add --index 2 https://github.com/heroku/heroku-buildpack-google-chrome # 示例:将Chromedriver buildpack调整到第3位 heroku buildpacks:add --index 3 https://github.com/heroku/heroku-buildpack-chromedriver
2. 清理手动配置的冲突环境变量
Chrome buildpack会自动生成正确的GOOGLE_CHROME_BIN和GOOGLE_CHROME_SHIM变量,手动设置的变量会和buildpack自动生成的逻辑冲突,执行以下命令删除你之前手动添加的变量:
heroku config:unset GOOGLE_CHROME_BIN GOOGLE_CHROME_SHIM GOOGLE_PATH
3. 禁用Webdrivers自动下载逻辑
Webdrivers::BrowserNotFound报错90%以上是因为Webdrivers gem默认会尝试自行下载Chrome二进制,忽略Heroku环境内已安装的Chrome,你需要添加初始化文件强制Webdrivers使用系统安装的版本:
在Rails项目config/initializers目录下新建webdrivers.rb,内容如下:
Webdrivers.configure do |config| # 强制使用buildpack生成的Chrome启动入口 config.chrome_binary_path = ENV['GOOGLE_CHROME_SHIM'] # 禁用自动更新,避免版本不匹配 config.chrome_version = :current end
4. 修正Selenium启动配置
你之前的代码用了GOOGLE_CHROME_BIN作为启动路径,实际Heroku环境下应该使用GOOGLE_CHROME_SHIM(该入口已处理了Heroku的依赖、权限适配问题),同时补充适配Heroku内存限制的参数,修改后代码如下:
options = Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless=new') # 用新版headless模式,兼容性更好 options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # 解决Heroku共享内存不足导致的Chrome崩溃 options.add_argument('--remote-debugging-port=9222') # 避免Heroku环境端口冲突报错 options.binary = ENV['GOOGLE_CHROME_SHIM'] driver = Selenium::WebDriver.for :chrome, options: options driver.get "https://www.google.com" puts driver.title driver.quit
5. 清理缓存重新部署
执行以下命令清除Heroku构建缓存,避免旧的依赖、缓存文件影响:
heroku builds:cache:purge
之后重新提交代码push到Heroku部署即可。
内容的提问来源于stack exchange,提问作者Saoma
相关产品推荐
相关产品推荐

