Maven测试命令是否存在规范的存储与调用方式?
针对Java+Selenium+Maven多运行环境的配置方案
不用创建多个测试类,推荐用「系统属性+Driver工厂类」的方式,和你之前JS里通过package.json脚本切换配置的思路一致,只是换了Java的实现方式,下面是具体方案:
核心思路
通过Maven传递运行模式参数,在Java代码里根据参数动态生成对应配置的WebDriver,所有测试类共用同一个Driver工厂,避免重复代码。
1. 实现Driver工厂类
创建一个DriverFactory类,负责根据传入的run.mode参数生成不同配置的ChromeDriver:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.RemoteWebDriver; import java.net.MalformedURL; import java.net.URL; public class DriverFactory { public static WebDriver getDriver() { // 默认使用本地模式,避免参数遗漏 String runMode = System.getProperty("run.mode", "local"); ChromeOptions options = new ChromeOptions(); switch (runMode) { case "headless": // 无头模式配置 options.addArguments("--headless=new"); options.addArguments("--disable-gpu"); options.addArguments("--window-size=1920,1080"); options.addArguments("--no-sandbox"); break; case "docker": // Docker下连接Selenium Grid的配置 options.setCapability("browserName", "chrome"); try { // 这里替换成你的Selenium Hub地址,Docker容器内通常用服务名 return new RemoteWebDriver(new URL("http://selenium-hub:4444/wd/hub"), options); } catch (MalformedURLException e) { throw new RuntimeException("无法连接到Selenium Hub", e); } case "local": default: // 本地运行配置 options.addArguments("--start-maximized"); options.addArguments("--no-sandbox"); break; } return new ChromeDriver(options); } }
2. 测试类中使用工厂类
所有测试类统一调用DriverFactory.getDriver()获取WebDriver,不用关心具体运行模式:
import org.openqa.selenium.WebDriver; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class DemoTest { private WebDriver driver; @BeforeMethod public void setup() { driver = DriverFactory.getDriver(); } @Test public void testPageLoad() { driver.get("https://example.com"); assert driver.getTitle().equals("Example Domain"); } @AfterMethod public void teardown() { if (driver != null) { driver.quit(); } } }
3. 通过Maven命令切换运行模式
直接在命令行传递run.mode参数即可:
- 本地运行:
mvn test -Drun.mode=local - 无头运行:
mvn test -Drun.mode=headless - Docker运行:
mvn test -Drun.mode=docker
进阶:用Maven Profiles简化命令
如果觉得每次手动传-D麻烦,可以在pom.xml中定义Profiles,给不同模式起别名:
<profiles> <profile> <id>local</id> <properties> <run.mode>local</run.mode> </properties> </profile> <profile> <id>headless</id> <properties> <run.mode>headless</run.mode> </properties> </profile> <profile> <id>docker</id> <properties> <run.mode>docker</run.mode> </properties> </profile> </profiles>
之后运行命令就可以简化为:
mvn test -P localmvn test -P headlessmvn test -P docker
额外建议
- 把可变配置(比如Selenium Hub地址、窗口大小)放到
src/main/resources/config.properties文件中,通过Properties类加载,避免硬编码。 - 如果用JUnit 5,可以结合
@BeforeEach和@AfterEach注解实现测试前后的Driver管理,逻辑和TestNG一致。 - Docker运行时,确保Selenium Hub和Chrome节点容器已经启动,网络互通。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

