Chrome中执行Selenium自动化套件时出现‘Aw! Snap’崩溃问题
先明确下你的问题场景:
我使用Google Chrome Driver基于Selenium开展自动化测试,执行过程中跳转至其他URL时Chrome窗口总会崩溃。该问题仅在第15次访问同一URL时出现,前14次执行均正常。我已尝试对ChromeDriver进行升级/降级操作。详细环境信息:os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_171',ChromeDriver版本为2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),运行端口9319。更新说明:若每次跳转URL时创建独立的ChromeDriver实例,则不会出现该问题。
从你提到的「创建独立实例就没问题」这个关键信息来看,问题核心大概率是单个ChromeDriver实例的资源泄漏或会话数上限触发。下面给你几个针对性的解决方案:
方案1:复用实例但主动清理资源
如果不想每次都创建新实例(避免性能开销),可以在每次测试/跳转后主动释放当前会话的资源:
- 清除缓存Cookie:
driver.manage().deleteAllCookies(); - 跳转到空白页释放页面资源:
driver.get("about:blank"); - 给Chrome添加进程限制参数,避免单个进程过载:
ChromeOptions options = new ChromeOptions(); options.addArguments("--process-per-site"); // 每个站点分配单独进程 options.addArguments("--disable-extensions"); // 禁用不必要的扩展 WebDriver driver = new ChromeDriver(options);
方案2:用实例池控制实例使用次数
如果需要频繁执行测试,推荐做一个简单的实例池管理:
- 给每个ChromeDriver实例设置最大使用次数(比如14次),达到次数后自动调用
driver.quit()销毁 - 结合测试框架的生命周期(比如JUnit的
@AfterMethod、TestNG的@AfterTest)来检查实例使用次数,达到阈值就回收,下次测试自动初始化新实例
方案3:升级到匹配的Chrome和ChromeDriver版本
你当前用的ChromeDriver2.38是非常旧的版本(对应Chrome65-67),旧版本存在不少已知的会话泄漏bug。建议:
- 查看你当前Chrome浏览器的版本,下载完全匹配的ChromeDriver(版本对应规则:Chrome11x对应ChromeDriver11x,Chrome10x对应10x版本,以此类推)
- 注意Windows8.1的Chrome最高支持到版本114,不要下载更高版本
方案4:调整Chrome内存和进程限制
在ChromeOptions里添加以下参数,减少内存占用和进程数量,降低崩溃概率:
ChromeOptions options = new ChromeOptions(); options.addArguments("--no-sandbox"); // 关闭沙箱(测试环境可用,减少进程开销) options.addArguments("--disable-dev-shm-usage"); // 避免内存不足触发的崩溃 options.addArguments("--max-total-memory=2048"); // 限制Chrome总内存为2G,可根据你的机器配置调整 WebDriver driver = new ChromeDriver(options);
总结
从你的测试结果来看,单个实例重复使用到第15次触发崩溃,说明旧版本的ChromeDriver存在会话上限或资源泄漏问题。优先尝试方案3的版本匹配,再结合方案1的资源清理,应该能解决问题。如果追求长期稳定性,方案2的实例池管理是最优解。
内容的提问来源于stack exchange,提问作者Raj

