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

Selenium Grid测试用例分配异常及驱动初始化错误求助

Selenium Grid 仅部分测试用例成功初始化Driver的问题排查与解决

看起来你遇到的问题是Selenium Grid并行测试时,部分用例无法完成Driver初始化。结合你的配置和代码,我整理了几个核心问题点和对应的解决方案:

1. 先修正TestNG XML的语法错误

你的TestNG配置里有个明显的语法问题:<class name="com.test.ProdsanitySearch2" />前面缺失了起始的<符号,这会导致TestNG无法正确解析测试套件,直接引发部分测试执行异常。修正后的XML如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="ProductionSanity" parallel="classes" thread-count="4" verbose="1">
<test name="aa1" >
<parameter name="customer" value="aa1" />
<classes>
<class name="com.test.ProdsanitySearch1" />
<class name="com.test.ProdsanitySearch11" />
</classes>
</test>
<test name="Gemes" >
<parameter name="customer" value="aa2" />
<classes>
<class name="com.test.ProdsanitySearch2" />
<class name="com.test.ProdsanitySearch22" />
</classes>
</test>
</suite>

另外,你当前用的parallel="tests"只会并行<test>节点(也就是2个并行任务),每个<test>下的测试类是串行执行的。如果期望4个测试类同时并行,需要改成parallel="classes"并设置thread-count="4"。

2. 修复ThreadLocal与Driver初始化的线程安全问题

你的代码里存在两个关键问题:

  • loadDesktopDriver是静态方法,但它依赖的m_driverForThread是实例级的ThreadLocal,静态方法无法正确绑定当前线程的实例;
  • 如果desiredCapabilities是共享的静态变量,多个线程会同时修改它,导致初始化RemoteWebDriver时传入错误的配置。

修改后的代码示例:

public ThreadLocal<WebDriver> m_driverForThread = new ThreadLocal<WebDriver>() {
    @Override 
    protected WebDriver initialValue() {
        try {
            return loadDesktopDriver();
        } catch (Exception e) {
            throw new RuntimeException("Driver初始化失败", e);
        }
    }
};

// 去掉static修饰,改为实例方法
protected WebDriver loadDesktopDriver() throws Exception {
    return getNewDriver(m_browser, "", "", m_context);
}

@SuppressWarnings("unchecked")
// 改为实例方法,确保每个线程创建独立的DesiredCapabilities
public WebDriver getNewDriver(String browserName, String browserVersion, String platform, ITestContext context) {
    // 每个线程独立创建Capabilities,避免线程间干扰
    DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
    desiredCapabilities.setBrowserName(browserName);
    // 按需添加其他配置(如platform、browserVersion等)
    
    try {
        return new RemoteWebDriver(new URL(m_gridUrl), desiredCapabilities);
    } catch (MalformedURLException e) {
        throw new RuntimeException("Grid URL格式错误", e);
    }
}

3. 配置Selenium Node的最大会话数

默认情况下,每个Selenium Node同时只能处理1个测试会话。你有2个Node,要支持4个并行测试,需要启动Node时设置--maxSession 2参数,让每个Node允许同时运行2个会话:

java -jar selenium-server-4.x.x.jar node --hub http://<你的Hub地址>:4444 --maxSession 2

4. 确保测试结束后正确清理Driver资源

如果测试结束后没有quit Driver并移除ThreadLocal中的实例,会导致Node上的会话无法释放,后续测试无法创建新会话。添加TestNG的销毁方法:

@AfterMethod
public void tearDown() {
    WebDriver driver = m_driverForThread.get();
    if (driver != null) {
        driver.quit();
        m_driverForThread.remove(); // 移除ThreadLocal实例,避免内存泄漏
    }
}

按照以上步骤调整后,应该就能解决部分测试用例Driver初始化失败的问题了。

内容的提问来源于stack exchange,提问作者Sonalee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:59:09