Github Actions运行Python Selenium报Chrome failed to start异常
问题根因
现有配置存在3个核心问题,直接导致运行失败、交互异常:
- 工作流逻辑错误:安装的包是
google-chrome-stable,版本检查步骤却调用chromium-browser -version,二者是完全独立的浏览器包,版本不匹配本身就会触发兼容问题,该步骤实际运行时会直接报错。 - 启动参数缺失:ubuntu-latest是纯命令行无桌面环境,仅添加
--headless参数远不能满足Chrome运行要求,缺省参数会直接引发启动崩溃、元素定位/点击失效、运行卡顿等问题。 - 权限限制触发崩溃:GitHub Actions 执行命令默认使用root权限,官方Chrome默认开启的沙箱机制会在root环境下直接拦截启动,这就是初始报错
DevToolsActivePort file doesn't exist的核心原因。
修复方案
1. 修正工作流配置
替换原有Chrome安装、版本检查、驱动管理相关步骤,直接使用GitHub生态内维护的Chrome安装动作即可,避免手动处理apt源、驱动版本匹配问题,修正后的工作流配置参考:
name: Selenium Test on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.9"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Setup Chrome browser uses: browser-actions/setup-chrome@latest - name: Install dependencies run: | python -m pip install --upgrade pip pip install selenium - name: Run Create Project test run: | python CreateProjects/Run.py
说明:使用该Chrome安装动作后,可直接移除webdriver-manager相关依赖与代码,动作会自动完成Chrome、对应版本驱动的安装与环境变量配置,不会出现版本不匹配问题。
2. 补全Chrome启动参数
旧版--headless参数的渲染、交互逻辑和真实浏览器差异极大,是你之前碰到元素点不了、运行慢的主要诱因之一,需要替换为新版无头模式参数,同时补全无GUI、root环境下的必填参数。注意新版Selenium传配置的参数名是options,不是旧版本的chrome_options,修正后的初始化代码如下:
from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium import webdriver class Project: def __init__(self, teardown = False): self.teardown = teardown chrome_options = Options() # 启用新版无头模式,行为和有界面Chrome完全一致 chrome_options.add_argument("--headless=new") # root环境必填,关闭沙箱限制否则启动直接崩溃 chrome_options.add_argument("--no-sandbox") # CI环境必填,默认共享内存空间仅64M,不加会导致卡顿、崩溃、元素交互失效 chrome_options.add_argument("--disable-dev-shm-usage") # 无GPU环境禁用硬件加速,避免渲染异常 chrome_options.add_argument("--disable-gpu") # 固定窗口分辨率,避免默认窗口过小导致元素被遮挡无法点击 chrome_options.add_argument("--window-size=1920,1080") # 可选配置,进一步提升CI环境稳定性 chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-software-rasterizer") s = Service() self.driver = webdriver.Chrome(service = s, options=chrome_options) self.driver.get(const.BASE_URL) self.driver.implicitly_wait(15)
注意事项
- 不要继续使用旧版
--headless参数,其独立的渲染引擎和桌面版Chrome行为差异很大,很容易出现本地Windows环境运行正常,CI环境下交互逻辑异常的问题。 - 手动apt安装Chrome+webdriver-manager拉驱动的方式很容易出现版本不匹配、源访问失败的问题,在CI环境下稳定性远不如现成的环境配置动作。
- 如果还是碰到点击失效的问题,可以把隐式等待换成显式等待,判断元素处于可点击状态后再执行操作,无头模式下页面加载速度和本地环境有差异,固定时长硬等的稳定性最差。
内容的提问来源于stack exchange,提问作者1449
相关产品推荐
相关产品推荐

