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

EC2实例中ChromeDriver调用Google Chrome时启动失败问题排查

问题描述

在Ubuntu 18.04.4 LTS的EC2测试服务器上,将chromedriver与Google Chrome同步更新至109.0.5414.74版本(版本匹配),受限于Ruby 2.3.6,同步升级selenium-webdriver至3.142.7。原有代码新增Service实例后,运行时出现Chrome异常退出错误,提示DevToolsActivePort file doesn't exist,添加--disable-dev-shm-usage等参数后问题仍未解决。

环境信息
  • selenium-webdriver: 3.142.7
  • capybara: 2.7.1
  • 操作系统: Ubuntu 18.04.4 LTS
  • 内核: Linux 5.4.0-1093-aws
  • 架构: x86-64

终端版本验证输出:

$ which chromedriver
/usr/bin/chromedriver
$ which google-chrome
/usr/bin/google-chrome
$ chromedriver --version
ChromeDriver 109.0.5414.74 (e7c5703604daa9cc128ccf5a5d3e993513758913-refs/branch-heads/5414@{#1172})
$ google-chrome --version
Google Chrome 109.0.5414.74
相关代码
def set_defaults
  options = set_options
  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: options)
  service = Selenium::WebDriver::Service.chrome(path: '/usr/bin/chromedriver')
  selenium_options = { browser: :chrome, desired_capabilities: capabilities, service: service }
  Capybara.register_driver :chrome do |app|
    Capybara::Selenium::Driver.new(app, selenium_options)
  end
  Capybara.javascript_driver = :chrome
end

def set_options
  user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0'
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_argument('--no-sandbox')
  options.add_argument('--headless')
  options.add_argument("--user-agent='#{user_agent}'")
  options.add_argument('--disable-popup-blocking')
  options.add_argument('--disable-gpu')
  options.add_argument('--window-size=1280,1024')
  options.add_argument('--disable-dev-shm-usage') # 参考其他回答添加,但无效
  options
end
错误栈
Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
    from #0 0x55b693029303 <unknown>
    ...
    from script/rails:21:in `<main>'
解决方案
  1. 修正User-Agent参数格式
    当前代码中--user-agent参数被多余的单引号包裹,导致Chrome无法正确解析,进而触发启动异常。修改set_options中的对应行:

    # 原代码
    options.add_argument("--user-agent='#{user_agent}'")
    # 修改为
    options.add_argument("--user-agent=#{user_agent}")
    
  2. 优化Chrome启动参数组合
    针对服务器headless环境,补充调整参数避免端口分配异常:

    def set_options
      user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0'
      options = Selenium::WebDriver::Chrome::Options.new
      options.add_argument('--no-sandbox')
      options.add_argument('--headless=new') # Chrome 109+推荐使用新版headless模式
      options.add_argument("--user-agent=#{user_agent}")
      options.add_argument('--disable-popup-blocking')
      options.add_argument('--disable-gpu')
      options.add_argument('--window-size=1280,1024')
      options.add_argument('--disable-dev-shm-usage')
      options.add_argument('--remote-debugging-port=9222') # 指定固定调试端口
      options.add_argument('--single-process') # 强制单进程运行适配服务器环境
      options
    end
    
  3. 检查文件权限与依赖

    • 确保运行代码的用户对Chrome和chromedriver有执行权限:
      sudo chmod +x /usr/bin/chromedriver /usr/bin/google-chrome
      
    • 安装Chrome运行必需的依赖库:
      sudo apt-get install -y libnss3 libgconf-2-4 libxss1 libappindicator1 libindicator7
      
  4. 适配旧版Capybara的驱动注册方式
    由于Capybara 2.7.1版本较旧,直接传递service参数可能存在兼容性问题,改为手动初始化驱动:

    def set_defaults
      Capybara.register_driver :chrome do |app|
        options = set_options
        driver = Selenium::WebDriver.for :chrome, options: options, service: Selenium::WebDriver::Service.chrome(path: '/usr/bin/chromedriver')
        Capybara::Selenium::Driver.new(app, browser: :chrome, driver: driver)
      end
      Capybara.javascript_driver = :chrome
    end
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:45:12