如何基于Selenium Standalone实现并行测试执行?
多Selenium Standalone实例并行测试实现方案
核心逻辑
独立的Selenium Standalone实例没有Grid的自动任务路由能力,需手动维护节点地址池,结合测试框架的并行执行机制,将测试任务分配到不同端口的实例上。
1. 启动多端口Selenium Standalone实例
确保两个实例正常运行:
# 实例1:端口4444 java -jar selenium-server-standalone-x.x.x.jar -port 4444 # 实例2:端口4445 java -jar selenium-server-standalone-x.x.x.jar -port 4445
2. 封装节点地址池工具类
实现轮询分配逻辑,确保测试任务均匀分发到不同实例:
import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class SeleniumNodePool { private static final List<String> NODE_LIST = new ArrayList<>(); private static final AtomicInteger ROUND_ROBIN_COUNTER = new AtomicInteger(0); static { NODE_LIST.add("http://localhost:4444/wd/hub"); NODE_LIST.add("http://localhost:4445/wd/hub"); } // 轮询获取下一个节点地址 public static String getNextNode() { int index = ROUND_ROBIN_COUNTER.getAndIncrement() % NODE_LIST.size(); return NODE_LIST.get(index); } }
3. 结合TestNG实现并行执行
3.1 配置TestNG并行规则
创建testng.xml文件,开启方法级并行,线程数匹配实例数量:
<!DOCTYPE suite SYSTEM "testng-1.0.dtd"> <suite name="ParallelTestSuite" parallel="methods" thread-count="2"> <test name="AutomationTests"> <classes> <class name="com.yourpackage.ParallelTestClass"/> </classes> </test> </suite>
3.2 编写测试类
在测试初始化时从地址池获取节点,初始化RemoteWebDriver:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.net.URL; public class ParallelTestClass { private WebDriver driver; @BeforeMethod public void initDriver() throws Exception { String nodeUrl = SeleniumNodePool.getNextNode(); DesiredCapabilities caps = DesiredCapabilities.chrome(); // 根据需要替换为Firefox等 driver = new RemoteWebDriver(new URL(nodeUrl), caps); } @Test public void testLoginFlow() { driver.get("https://your-test-site.com/login"); // 测试逻辑:输入账号、密码、点击登录等 } @Test public void testProductSearch() { driver.get("https://your-test-site.com"); // 测试逻辑:搜索商品、验证结果等 } @AfterMethod public void quitDriver() { if (driver != null) { driver.quit(); } } }
4. 验证效果
运行TestNG套件后,查看两个Selenium Standalone实例的控制台日志,会看到不同测试任务分别连接到4444和4445端口,实现并行执行。
可选优化
- 增加节点健康检查:在
SeleniumNodePool中添加方法检测节点是否可用,避免分配无效实例 - 动态节点管理:提供添加/删除节点的方法,适配实例数量变化
- JUnit 5替代方案:使用
@ParameterizedTest注入多节点地址,配合@Execution(ExecutionMode.CONCURRENT)实现并行
内容的提问来源于stack exchange,提问作者Hakan GÜL
相关产品推荐
相关产品推荐

