You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Serenity BDD+Selenium测试不稳定:10次仅6次成功,报DevToolsActivePort错误

解决Serenity BDD + Selenium偶发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:45:09