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

Selenium Grid+TestNG跨机器多节点并行测试问题求助

解决Selenium Grid + TestNG并行测试仅在单节点执行的问题

看起来你已经搭好了Selenium Grid的基础配置,但几个关键的小问题导致测试无法在不同节点并行执行。我来一步步帮你排查和修复:

1. 先修正TestNG Suite配置的问题

你的两个<test>标签用了相同的名称LOGIN TEST,这会让TestNG无法正确区分不同的测试组,进而影响并行逻辑。另外,hub的url可以放到代码里统一管理,不需要在每个test里重复指定。修改后的suite配置如下:

<suite name="Parallel Test Suite" thread-count="4" parallel="tests">
    <test name="Login Tests - Chrome v1.2">
        <parameter name="browserName" value="chrome"/>
        <parameter name="version" value="1.2"/>
        <classes>
            <class name="tests.loginTest.LoginTest"/> <!-- 4 test methods here -->
        </classes>
    </test>
    <test name="Main Page Tests - Chrome v1.3">
        <parameter name="browserName" value="chrome"/>
        <parameter name="version" value="1.3"/>
        <classes>
            <class name="tests.loginTest.MainPageTest"/> <!-- 4 test methods here -->
        </classes>
    </test>
</suite>

2. 修复@BeforeMethod的static问题

你的createInstance方法是static的,这会导致所有测试方法共享同一个WebDriver实例——这绝对是单节点执行的核心原因!static变量在JVM中是全局共享的,所以所有并行测试都会复用同一个driver,自然无法分发到不同节点。

建议把driver管理抽成基类,让测试类继承,修改后的代码如下:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters;

import java.net.MalformedURLException;
import java.net.URL;

public class BaseTest {
    // 用实例变量保存driver,每个测试实例独立拥有
    protected WebDriver driver;

    @BeforeMethod
    @Parameters({"browserName", "version"})
    public void createInstance(String browserName, String version) throws MalformedURLException {
        // ❌ 不要在这里设置driver路径!节点机器的driver路径可能和你的本地不一样
        // System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\chromedriver.exe");

        // ✅ 使用ChromeOptions替代过时的DesiredCapabilities(Selenium 4推荐)
        ChromeOptions options = new ChromeOptions();
        options.setBrowserVersion(version);

        // 连接到Selenium Hub
        driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), options);
    }

    @AfterMethod
    public void tearDown() {
        // 每个测试结束后关闭浏览器,释放节点资源
        if (driver != null) {
            driver.quit();
        }
    }
}

// 你的LoginTest类继承基类
public class LoginTest extends BaseTest {
    @Test
    public void testLoginScenario1() {
        driver.get("你的测试URL");
        // 测试逻辑...
    }

    // 其他3个测试方法...
}

// MainPageTest同理
public class MainPageTest extends BaseTest {
    @Test
    public void testMainPageScenario1() {
        driver.get("你的测试URL");
        // 测试逻辑...
    }

    // 其他3个测试方法...
}

3. 确保Selenium Grid节点配置匹配你的Capabilities

要让测试分发到不同节点,你需要启动两个Chrome节点,分别对应version=1.2和version=1.3,并且指定正确的chromedriver路径:

启动v1.2的Chrome节点:

java -jar selenium-server-4.x.x.jar node --port 5555 --chromedriver-path "/path/to/your/chromedriver-v1.2.exe" --capabilities "browserName=chrome,browserVersion=1.2"

启动v1.3的Chrome节点:

java -jar selenium-server-4.x.x.jar node --port 5556 --chromedriver-path "/path/to/your/chromedriver-v1.3.exe" --capabilities "browserName=chrome,browserVersion=1.3"

注意:替换selenium-server-4.x.x.jar为你实际的版本号,chromedriver路径也要对应节点机器上的位置。

4. 最后验证并行效果

  1. 先启动Selenium Hub:java -jar selenium-server-4.x.x.jar hub
  2. 启动上面两个节点
  3. 访问http://localhost:4444/ui确认两个节点都已成功注册
  4. 运行修改后的TestNG Suite,你应该能看到两个节点同时启动浏览器执行测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:26:58