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. 最后验证并行效果
- 先启动Selenium Hub:
java -jar selenium-server-4.x.x.jar hub - 启动上面两个节点
- 访问
http://localhost:4444/ui确认两个节点都已成功注册 - 运行修改后的TestNG Suite,你应该能看到两个节点同时启动浏览器执行测试
内容的提问来源于stack exchange,提问作者ujjwal atreya
相关产品推荐
相关产品推荐

