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>'
解决方案
修正User-Agent参数格式
当前代码中--user-agent参数被多余的单引号包裹,导致Chrome无法正确解析,进而触发启动异常。修改set_options中的对应行:# 原代码 options.add_argument("--user-agent='#{user_agent}'") # 修改为 options.add_argument("--user-agent=#{user_agent}")优化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检查文件权限与依赖
- 确保运行代码的用户对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
- 确保运行代码的用户对Chrome和chromedriver有执行权限:
适配旧版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
相关产品推荐
相关产品推荐

