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"); // 错误搜索词

控制台输出failure

详细错误信息actual error

自动保存的截图web page error

✅ 踩坑指南:通过截图和页面源码,能快速定位是测试脚本问题还是应用 Bug。

6. 配置 Selenide

Selenide 提供灵活的配置方式(优先级从高到低):

  1. 代码配置@BeforeEach 中修改 Configuration 类)
  2. 系统属性(命令行参数 -Dselenide.xxx=value
  3. 配置文件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 仓库


原始标题:Introduction to Selenide