AngularJS文件上传测试本地正常,GitLab CI中Chromedriver会话崩溃报错
解决GitLab CI上Protractor文件上传测试的页面崩溃问题
看起来你遇到的session deleted because of page crash错误在CI容器环境(比如GitLab Runner)里很常见,主要和Chrome无头模式的配置、资源限制或版本兼容有关。结合你的测试场景,我整理了几个针对性的解决方案:
1. 确保Chrome与Chromedriver版本严格匹配
虽然本地环境版本适配,但GitLab CI上的Chrome版本可能和你本地不一致。Chromedriver和Chrome的版本必须严格对应:
- Chrome v66.0.x 对应的Chromedriver版本是2.38或2.39
你可以在CI脚本里添加步骤,强制安装指定版本的Chrome,或者先检查CI环境的Chrome版本是否符合要求。
2. 优化Chrome无头模式的启动参数
CI容器通常是无桌面的Linux环境,需要给Chrome添加必要参数来规避权限和内存问题。在你的Protractor配置文件(protractor.conf.js)中修改capabilities配置:
exports.config = { // 其他配置项... capabilities: { browserName: 'chrome', chromeOptions: { args: [ '--headless', // CI环境必须启用无头模式 '--disable-gpu', '--no-sandbox', // 解决Linux环境下的权限限制问题 '--disable-dev-shm-usage', // 避免容器内/dev/shm内存不足导致崩溃 '--window-size=1920,1080', // 固定窗口大小,避免渲染异常 '--disable-extensions', '--disable-infobars' ] } }, // 其他配置项... };
其中--no-sandbox和--disable-dev-shm-usage是解决这类崩溃问题的核心参数。
3. 替换固定等待为显式等待
browser.sleep(500)是不稳定的固定等待,在CI环境中可能因为资源不足导致等待时间不够,或者无端浪费时间。建议替换为基于条件的显式等待:
const EC = protractor.ExpectedConditions; const fileElem = element(by.css('input[type="file"]')); // 替换为你页面上实际的上传成功标识元素 const uploadSuccessIndicator = element(by.css('.upload-success-message')); fileElem.sendKeys(absoluteFilePath); // 等待上传成功元素可见,超时时间设为5秒 browser.wait(EC.visibilityOf(uploadSuccessIndicator), 5000, '文件上传超时未完成');
这种方式既可靠,又能适配不同环境的执行速度差异。
4. 检查CI环境的资源限制
GitLab Runner的容器默认内存可能不足,Chrome无头模式运行时需要足够内存才能避免页面崩溃。你可以:
- 在GitLab CI配置文件(
.gitlab-ci.yml)中给测试任务分配更多内存:
test: script: - npm test resources: limits: memory: 2G # 根据实际需求调整
- 避免在CI环境中同时运行其他占用大量资源的任务。
5. 升级依赖版本(可选)
你的Protractor(5.3.1)和Chromedriver(2.38.2)版本相对较旧,可能存在一些CI环境下的已知bug。可以尝试升级到匹配的稳定版本:
- 升级Protractor到5.4.x系列(完全兼容AngularJS)
- 确保Chromedriver版本与CI环境的Chrome版本严格对应
按照以上步骤调整后,应该能解决GitLab CI上的页面崩溃问题。
内容的提问来源于stack exchange,提问作者Vadym Shashkov
相关产品推荐
相关产品推荐

