升级Chromedriver 120至121后系统测试大量随机失败,求解决方案
解决ChromeDriver 121升级后Capybara/Selenium随机测试失败问题
核心原因
ChromeDriver 121对元素可见性判断、页面加载状态的检测逻辑做了调整,叠加Github Actions环境的资源限制,导致原本稳定的测试出现随机失败。
已验证的解决方案
1. 升级Capybara和Selenium依赖
多数开发者通过更新到兼容版本解决了大部分问题:
- 将
capybara升级至3.39.2+(该版本修复了Chrome 121相关的可见性检测bug) - 将
selenium-webdriver升级至4.17.0+(适配ChromeDriver 121的协议变更)
执行命令更新依赖:
bundle update capybara selenium-webdriver
2. 调整Capybara等待策略
针对元素可见性误判问题,修改默认配置以适配CI环境延迟:
在test/application_system_test_case.rb中添加:
Capybara.default_max_wait_time = 10 # 提升等待时长,默认通常为2-3秒 Capybara.disable_animation = true # 禁用页面动画,避免元素状态不稳定
同时,优化文本可见性检测的写法,避免误判:
# 替换原有写法 expect(page).to have_text("目标文本") # 改为精准判断可见文本 expect(page).to have_content("目标文本", visible: :visible)
3. 修复StaleElementReferenceError
这类错误源于元素操作前页面发生重渲染,解决方式:
- 避免复用已获取的元素对象,每次操作前重新查找
- 用
find方法结合等待,确保元素处于稳定状态:
# 替换原有写法 element = find(".target-element") element.click # 改为 find(".target-element", wait: 5).click
4. 优化Github Actions环境配置
在CI workflow中添加Chrome启动参数,降低资源占用并提升稳定性:
jobs: test: runs-on: ubuntu-22.04 steps: - name: Setup Chrome uses: browser-actions/setup-chrome@v1 with: chrome-version: 121 - name: Run system tests env: CHROME_OPTS: "--headless=new --disable-gpu --no-sandbox --disable-dev-shm-usage --window-size=1920,1080" run: bundle exec rails test:system
5. 回退ChromeDriver版本(临时方案)
若上述方案暂无法生效,可在CI中强制指定ChromeDriver 120版本:
- name: Install specific ChromeDriver run: | wget https://chromedriver.storage.googleapis.com/120.0.6099.109/chromedriver_linux64.zip unzip chromedriver_linux64.zip sudo mv chromedriver /usr/local/bin/ sudo chmod +x /usr/local/bin/chromedriver
总结
优先升级依赖版本,配合调整Capybara配置和CI环境参数,基本可解决ChromeDriver 121带来的随机测试失败问题。若仍有个别测试不稳定,建议针对具体用例添加更明确的等待逻辑。
内容的提问来源于stack exchange,提问作者Emil K
相关产品推荐
相关产品推荐

