🚀 Selenium Java 实战入门与进阶指南
Selenium 是自动化 Web UI 测试的强大工具,而 Java 则是其广泛支持的主力语言之一。本文将手把手带你完成一个完整的 Selenium Java 项目,从基础环境搭建,到多浏览器支持、定位技巧与动作模拟,并配合 TestNG/JUnit 实现高效测试自动化。
📦 一、环境准备与依赖配置
✅ 前置条件
- 安装 JDK 8+
- 安装 Maven
- 准备对应的浏览器驱动(推荐使用 WebDriverManager 自动管理)
🧩 Maven依赖(pom.xml
)
<dependencies>
<!-- Selenium Java 核心库 -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.12.0</version>
</dependency>
<!-- TestNG 测试框架 -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.8.0</version>
<scope>test</scope>
</dependency>
<!-- JUnit(可选) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- WebDriverManager 自动下载驱动 -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.4.1</version>
</dependency>
</dependencies>
🧪 二、测试框架集成示例
2.1 ✅ TestNG 示例
public class BaiduSearchTestNG {
WebDriver driver;
@BeforeMethod
public void setUp() {
driver = new ChromeDriver();
driver.manage().window().maximize();
}
@Test
public void testBaiduSearch() {
driver.get("https://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("Selenium");
driver.findElement(By.id("su")).click();
assertEquals(driver.getTitle(), "Selenium_百度搜索");
}
@AfterMethod
public void tearDown() {
driver.quit();
}
}
2.2 ✅ JUnit 示例
public class BaiduSearchJUnit {
WebDriver driver;
@Before
public void setUp() {
driver = new ChromeDriver();
driver.manage().window().maximize();
}
@Test
public void testBaiduSearch() {
driver.get("https://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("Selenium");
driver.findElement(By.id("su")).click();
assertEquals(driver.getTitle(), "Selenium_百度搜索");
}
@After
public void tearDown() {
driver.quit();
}
}
🌐 三、多浏览器支持实战
3.1 🛠️ 浏览器工厂类封装
public class BrowserFactory {
public static WebDriver getDriver(String browserName) {
WebDriver driver;
switch (browserName.toLowerCase()) {
case "chrome":
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
break;
case "firefox":
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
break;
case "edge":
WebDriverManager.edgedriver().setup();
driver = new EdgeDriver();
break;
case "safari":
driver = new SafariDriver(); // 不需WebDriverManager
break;
default:
throw new IllegalArgumentException("不支持的浏览器类型: " + browserName);
}
driver.manage().window().maximize();
return driver;
}
}
3.2 🧪 TestNG多浏览器测试
public class MultiBrowserTest {
WebDriver driver;
@Parameters("browser")
@Test
public void testOnMultipleBrowsers(String browser) {
driver = BrowserFactory.getDriver(browser);
driver.get("https://www.baidu.com");
driver.quit();
}
}
TestNG XML 配置:
<test name="Chrome Test">
<parameter name="browser" value="chrome"/>
<classes>
<class name="MultiBrowserTest"/>
</classes>
</test>
<test name="Firefox Test">
<parameter name="browser" value="firefox"/>
<classes>
<class name="MultiBrowserTest"/>
</classes>
</test>
🔍 四、元素定位方式详解
4.1 常用定位方式
driver.findElement(By.id("elementId")); // ID
driver.findElement(By.name("elementName")); // Name
driver.findElement(By.className("elementClass")); // Class
driver.findElement(By.tagName("div")); // Tag
driver.findElement(By.linkText("点击这里")); // 完整链接文本
driver.findElement(By.partialLinkText("点击")); // 部分链接
driver.findElement(By.cssSelector("#id .class > div")); // CSS选择器
driver.findElement(By.xpath("//div[@class='class']")); // XPath
4.2 高级定位技巧
✅ 动态属性定位
driver.findElement(By.xpath("//div[contains(@id, 'dynamic')]"));
driver.findElement(By.xpath("//input[starts-with(@name, 'search')]"));
driver.findElement(By.xpath("//button[text()='Submit']"));
✅ 父子元素组合定位
WebElement parent = driver.findElement(By.id("parent"));
WebElement child = parent.findElement(By.className("child"));
driver.findElement(By.cssSelector("#parent .child")); // 更简洁
🎮 五、动作模拟详解(交互+键盘)
5.1 基础交互动作
driver.findElement(By.id("searchBox")).sendKeys("Selenium"); // 输入
driver.findElement(By.id("searchBox")).clear(); // 清除
driver.findElement(By.id("submit")).click(); // 点击
driver.findElement(By.id("form")).submit(); // 表单提交
5.2 高级动作(Actions类)
Actions actions = new Actions(driver);
// 悬停
actions.moveToElement(driver.findElement(By.id("hover"))).perform();
// 双击
actions.doubleClick(driver.findElement(By.id("double"))).perform();
// 右击
actions.contextClick(driver.findElement(By.id("rightClick"))).perform();
// 拖拽
actions.dragAndDrop(source, target).perform();
// 组合动作
actions.clickAndHold(source).moveToElement(target).release().build().perform();
5.3 键盘操作
driver.findElement(By.id("searchBox")).sendKeys(Keys.chord(Keys.CONTROL, "a")); // Ctrl+A
driver.findElement(By.id("searchBox")).sendKeys(Keys.DELETE); // 删除
🧩 六、完整测试案例:百度搜索
public class BaiduSearchCompleteExample {
WebDriver driver;
@BeforeMethod
public void setUp() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.manage().window().maximize();
}
@Test
public void testBaiduSearch() {
driver.get("https://www.baidu.com");
Assert.assertTrue(driver.getTitle().contains("百度"));
WebElement searchBox = driver.findElement(By.id("kw"));
searchBox.sendKeys("Selenium WebDriver");
new Actions(driver)
.moveToElement(searchBox)
.click()
.sendKeys(" 教程")
.build()
.perform();
driver.findElement(By.id("su")).click();
String actualTitle = driver.getTitle();
Assert.assertTrue(actualTitle.contains("Selenium WebDriver"));
Assert.assertTrue(actualTitle.contains("教程"));
}
@AfterMethod
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}
✅ 七、实用最佳实践建议
建议 | 说明 |
---|---|
显式等待 | 避免 Thread.sleep() ,使用 WebDriverWait 提升稳定性 |
页面对象模型(POM) | 页面结构与操作分离,提升复用性与可维护性 |
日志记录 | 引入日志框架(如Log4j)追踪测试流程 |
异常处理 | 包装关键操作,减少测试失败率 |
配置分离 | 浏览器类型、URL等写入配置文件或系统参数中 |
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("elementId")));
🎉 总结
通过本篇文章,你可以掌握 Selenium Java 在不同测试框架下的基本用法、多浏览器支持、元素定位与复杂交互操作,并了解实战中的最佳实践。后续你可以进一步探索:
- 页面对象模型(POM)设计模式
- 持续集成平台(Jenkins、GitLab CI)
- 自动化测试报告(Allure、ExtentReports)
🎉如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和关注我!也欢迎评论区留言交流!