Serenity BDD+Selenium测试不稳定:10次仅6次成功,报DevToolsActivePort错误
DevToolsActivePort file doesn't exist失败问题 首先,你碰到的10次测试6次成功的偶发失败,加上DevToolsActivePort file doesn't exist错误和残留的chrome.exe/chromedriver.exe进程,核心原因是浏览器进程未被正确清理,导致后续测试无法启动新的Chrome实例。这既有配置优化的空间,也有测试稳定性的调整点,并非单一的配置错误或测试脆弱性。
一、问题根源拆解
- 残留进程占用端口资源:测试结束后Chrome或Chromedriver进程没有彻底退出,占用了DevTools需要的端口,后续测试启动新浏览器时无法获取可用端口,就会抛出这个错误。这也是失败偶发的原因——有时候进程能正常退出,有时候因为异常或资源占用无法退出。
- Chrome启动参数冗余/冲突:你当前的
chrome.switches里有一些过时或可能冲突的参数(比如--test-type已被新版Chrome废弃,参数里同时用了分号和逗号分隔),这可能加剧启动异常的概率。
二、分步修复方案
1. 优化Serenity的进程清理配置
在serenity.conf中添加强制清理进程的配置,确保测试无论成功失败都能杀掉残留进程:
# 强制清理Chrome进程 webdriver.driver.chrome.cleanup=true webdriver.driver.chrome.forceKill=true
同时修正chrome.switches的参数格式和内容,去掉过时/非必要参数,避免冲突:
chrome.switches="""--start-maximized;--no-sandbox;--ignore-certificate-errors;--disable-popup-blocking;--disable-extensions;--disable-infobars;--disable-gpu"""
说明:移除了
--test-type(过时)、--incognito(非必要的话,隐身模式会增加进程管理复杂度)、--disable-default-apps这类冗余参数,统一用分号分隔参数。
2. 手动确保WebDriver生命周期管理
虽然Serenity默认会管理WebDriver,但如果测试中出现未捕获的异常,可能导致WebDriver未被正确quit()。可以在Cucumber的Hook类中添加强制关闭逻辑:
import net.thucydides.core.webdriver.WebDriverFacade; import org.openqa.selenium.WebDriver; import cucumber.api.Scenario; import cucumber.api.java.After; public class TestHooks { @After public void tearDownBrowser(Scenario scenario) { WebDriver driver = ((WebDriverFacade) net.thucydides.core.webdriver.WebDriverProvider.getDriver()).getProxiedDriver(); if (driver != null) { try { driver.quit(); } catch (Exception e) { // 忽略关闭时的异常,避免影响测试结果统计 System.out.println("关闭浏览器进程时出现异常: " + e.getMessage()); } } } }
这个钩子会在每个测试场景结束后强制关闭浏览器,确保进程被彻底清理。
3. 修复Chromedriver与Chrome版本兼容性
你使用的Chromedriver版本是74.0.3729.6,必须和本地安装的Chrome浏览器版本完全匹配(Chrome版本可通过chrome://version/查看)。版本不兼容也会导致偶发的启动失败,建议:
- 手动下载匹配Chrome版本的Chromedriver替换现有版本;
- 或者开启Serenity的自动Chromedriver管理,在
serenity.conf中添加:
webdriver.driver=chrome webdriver.chrome.driver.autodownload=true
这样Serenity会自动下载对应版本的Chromedriver,避免版本不兼容问题。
4. 调整并行测试策略(如果启用了并行)
如果是并行执行测试,资源竞争也可能导致偶发失败。可以在serenity.conf中配置合理的并行参数:
serenity.parallel.mode=THREAD serenity.parallel.count=2 # 根据机器性能调整,不要过高
确保每个线程的浏览器实例相互隔离,避免端口和资源冲突。
三、总结
你的问题是进程未正确清理+启动参数/版本兼容性问题共同导致的偶发失败,通过上面的优化步骤,应该能大幅降低失败概率。建议优先从进程清理和启动参数入手,再检查版本兼容性,最后调整测试执行策略。
内容的提问来源于stack exchange,提问作者Chandresh Mishra

