1. 引言
本文将介绍 Selenide 这个 UI 自动化测试框架。我们将探讨它的核心功能以及如何在实际项目中应用它进行 Web 应用的自动化测试。
2. 什么是 Selenide?
Selenide 是一个基于 Selenium WebDriver 构建的开源框架。它不仅提供了 Selenium 的全部能力,还通过以下优化让测试更简单粗暴:
✅ 自动管理浏览器生命周期
✅ 测试失败时自动截图
✅ 提供更简洁的 API
✅ 内置智能等待机制
相比原生 Selenium,Selenide 让你专注于测试逻辑本身,而不是繁琐的浏览器操作和等待处理。
3. 快速上手
3.1 Maven 依赖
首先在项目中添加 Selenide 依赖(最新版本可在 Maven Central 查询):
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide</artifactId>
<version>6.15.0</version>
<scope>test</scope>
</dependency>
⚠️ 注意:这会自动引入兼容版本的 Selenium WebDriver。你还需要准备测试框架(如 JUnit)。
3.2 第一个测试
写个测试验证 Baeldung 在搜索引擎的排名。先导入关键类:
import static com.codeborne.selenide.Selenide.*;
import static com.codeborne.selenide.Condition.*;
import org.openqa.selenium.By;
测试代码如下:
@Test
public void searchBaeldung() throws Exception {
open("https://duckduckgo.com/");
SelenideElement searchbox = $(By.id("searchbox_input"));
searchbox.click();
searchbox.sendKeys("Baeldung");
searchbox.pressEnter();
SelenideElement firstResult = $(By.id("r1-0"));
firstResult.shouldHave(text("Baeldung"));
}
代码解析:
open()
打开页面$()
定位元素(返回首个匹配的SelenideElement
)$$()
可获取所有匹配元素shouldHave()
断言元素状态(should()
/shouldBe()
功能相同,仅语法差异)
💡 核心优势:无需手动处理浏览器启动/关闭、元素等待等操作,Selenide 已自动搞定。
4. Page Objects 模式
Page Objects 是 UI 测试的最佳实践。Selenide 对此提供了原生支持,让我们重构之前的测试:
搜索页模型:
public class SearchFormPage {
public void open() {
Selenide.open("http://duckduckgo.com/");
}
public void search(String term) {
SelenideElement searchbox = $(By.id("searchbox_input"));
searchbox.click();
searchbox.sendKeys(term);
searchbox.pressEnter();
}
}
结果页模型:
public class SearchResultsPage {
public SearchResult getResult(int index) {
SelenideElement result = $(By.id("r1-" + index));
result.shouldBe(visible);
return new SearchResult(result);
}
}
搜索结果封装:
public class SearchResult {
private SelenideElement result;
public SearchResult(SelenideElement result) {
this.result = result;
}
public String getText() {
return result.getText();
}
}
重构后的测试:
@Test
public void searchBaeldung() {
SearchFormPage searchFormPage = new SearchFormPage();
searchFormPage.open();
searchFormPage.search("Baeldung");
SearchResultsPage results = new SearchResultsPage();
SearchResult firstResult = results.getResult(0);
assertTrue(firstResult.getText().contains("Baeldung"));
}
优势:
- 测试代码更易读
- 页面结构变更只需修改 Page Object 类
- 避免测试代码与 HTML 强耦合
5. 失败测试处理
当测试失败时,Selenide 会自动提供诊断信息。故意修改测试使其失败:
searchbox.sendKeys("Something Else"); // 错误搜索词
控制台输出:
详细错误信息:
自动保存的截图:
✅ 踩坑指南:通过截图和页面源码,能快速定位是测试脚本问题还是应用 Bug。
6. 配置 Selenide
Selenide 提供灵活的配置方式(优先级从高到低):
- 代码配置(
@BeforeEach
中修改Configuration
类) - 系统属性(命令行参数
-Dselenide.xxx=value
) - 配置文件(
src/test/resources/selenide.properties
)
常用配置示例:
// 代码配置
Configuration.browser = "firefox";
Configuration.reportsFolder = "test-results";
# selenide.properties
selenide.browser=firefox
selenide.reportsFolder=test-results
# 系统属性
mvn test -Dselenide.browser=firefox -Dselenide.reportsFolder=test-results
核心配置项:
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| browser
| 浏览器类型 | chrome |
| reportsFolder
| 报告存储路径 | build/reports/tests |
| timeout
| 元素等待超时 | 4000ms |
💡 实战技巧:通过系统属性实现 CI 环境多浏览器测试。
7. 总结
Selenide 通过以下特性让 UI 测试更高效:
- 简化浏览器操作
- 智能等待机制
- 自动错误诊断
- 灵活配置体系
下次写 UI 测试时,不妨试试这个能让你少踩坑的框架。完整示例代码见 GitHub 仓库。