Selenium 定义
Selenium 是一个用于 Web 应用程序自动化测试的开源工具集合,最初由 ThoughtWorks 开发,目前由社区进行维护和更新。它可以帮助开发人员、测试人员对网站功能、页面交互进行自动化测试或操作,用以替代手动测试,提高测试效率和准确性。Selenium 的核心组件包括 Selenium IDE、Selenium WebDriver、Selenium Grid 等。
Selenium 基本原理
- WebDriver:Selenium 中最核心的组件,通过调用各个浏览器厂商提供的原生驱动(如 ChromeDriver、SafariDriver)来控制浏览器进行自动化操作。
- 原理简述:Selenium WebDriver 通过与浏览器驱动(Driver)通信,将测试脚本中的各种动作(如点击、输入文本、切换页面等)转换为浏览器可以理解的原生 API 调用,从而完成对浏览器的操作。
Selenium 官网
-
Selenium 官方网址:https://www.selenium.dev/
在该网站可以获取到 Selenium 项目的最新文档、下载链接、更新日志以及社区资源等。
核心术语及术语解释
-
Selenium IDE
- 是一个浏览器插件(最初是 Firefox,后来也支持 Chrome)可用于录制回放测试脚本,适用于编写快速测试验证。
-
Selenium WebDriver
- 最常用的 Selenium 工具,通过浏览器驱动程序与浏览器通信,提供对网页控件的查找、操作、断言等能力。
-
Selenium Grid
- 用于分布式测试,可将测试任务分配到不同的机器或者不同的浏览器上并行执行,提高测试效率。
-
Browser Driver(浏览器驱动)
- 如 ChromeDriver、SafariDriver、EdgeDriver、FirefoxDriver 等。每个浏览器都有相应的专属驱动,用来接收 Selenium WebDriver 发送的指令并实际控制浏览器行为。
-
Locator(元素定位器)
- 定位网页元素的方式,如 id、name、className、cssSelector、xpath 等。是自动化脚本中查找元素的核心。
-
Wait(等待)
- 在自动化过程中,为了保证元素已经加载或处于可操作状态,需要设置等待策略,常见有隐式等待(Implicit Wait)和显示等待(Explicit Wait)。
-
Actions(鼠标键盘操作)
- Selenium 提供
Actions类用于模拟复杂的鼠标键盘动作,如鼠标悬停、拖拽、右键、双击、按键输入、组合键等。
- Selenium 提供
驱动器版本与浏览器版本匹配
Selenium WebDriver 需要使用到各浏览器厂商提供的驱动,如:
-
Google Chrome 浏览器
- 对应的驱动是 ChromeDriver
- 需要确保 ChromeDriver 的版本与本地安装的 Chrome 浏览器版本兼容或匹配,否则运行测试时可能会出现错误。
- 例如,本地浏览器版本是 108.x,则最好使用对应的 108.x ChromeDriver。
-
Safari 浏览器
- 对应的驱动是 SafariDriver(在 macOS 上通常默认随系统自带 Safari WebDriver,前提是开启 “允许远程自动化” 选项)。
- 版本兼容性:SafariDriver 与 Safari 浏览器在同一个系统上,只要 macOS 和 Safari 为最新兼容版本即可。
在使用时,可通过以下方式获取驱动:
- 访问官方驱动下载地址(如 ChromeDriver - WebDriver for Chrome)
- 或使用第三方库(如 WebDriverManager)自动管理驱动版本。
等待机制(显示等待与隐式等待)
-
隐式等待(Implicit Wait)
- 在设置过隐式等待后,WebDriver 在查找元素时会默认轮询一定时间,直到元素出现或时间超过才抛出异常。它的作用范围是全局一旦设置,对后续的所有元素定位都生效。
- 示例:
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
-
显示等待(Explicit Wait)
指定某个条件(Condition),在该条件满足之前,WebDriver 会按一定频率不断检查,直到超时或者条件满足才进行下一步操作。
常用:
WebDriverWait+ExpectedConditions。-
示例:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("someId")));
两者区别:
- 隐式等待适合大部分简单的元素等待场景,配置较为简单,但对全局都生效;
- 显示等待针对特定元素或条件,可以灵活控制等待逻辑,更加精细化。
隐式等待在固定时间内没有等待到就会报错
显示等待是一直等,即便超过设置的等待时间
鼠标、键盘等驱动操作
Selenium 提供 Actions 类来模拟复杂的人机交互动作,常见例如:
-
鼠标操作
- 移动鼠标到元素上(悬停)、点击、双击、右键点击、拖拽等。
- 示例:
actions.moveToElement(element).click().perform();
-
键盘操作
- 键盘按键(如 Enter、Esc 等)、按住 Shift 键点击元素、同时按住 Ctrl 键等。
- 示例:
actions.keyDown(Keys.CONTROL).click(element).keyUp(Keys.CONTROL).perform();
通过这些操作,可以模拟真实用户在网页上的各种行为,完成对应用的交互式测试或自动化操作。
Code Demo
基配 Maven(3.9.x 以上)、JDK 17 环境下的 Selenium WebDriver .
1. Maven pom.xml 依赖示例
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>selenium-demo</artifactId>
<version>1.0.0</version>
<name>Selenium Demo</name>
<properties>
<java.version>17</java.version>
<!-- 如果用 Selenium 4.x,可指定版本 -->
<selenium.version>4.10.0</selenium.version>
</properties>
<dependencies>
<!-- Selenium WebDriver -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${selenium.version}</version>
</dependency>
<!-- 如需 WebDriverManager 自动管理驱动,可引入 -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.3.2</version>
</dependency>
<!-- Spring Boot 相关依赖 (若需要) -->
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
-->
</dependencies>
<build>
<plugins>
<!-- Compiler Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 示例代码
package com.example.seleniumdemo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.safari.SafariDriver;
// 显式等待相关
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
// 如果需要自动管理驱动:
// import io.github.bonigarcia.wdm.WebDriverManager;
import java.time.Duration;
public class SeleniumDemoApplication {
public static void main(String[] args) {
// 如果使用 WebDriverManager 来自动管理 ChromeDriver,可用下面代码:
// WebDriverManager.chromedriver().setup();
// WebDriver driver = new ChromeDriver();
// 使用 ChromeDriver 手动指定路径或系统已有的可执行文件:
// System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
// WebDriver driver = new ChromeDriver();
// 若使用 Safari 浏览器,则在 macOS 上需要开启 “允许远程自动化”:
// WebDriver driver = new SafariDriver();
// 以下示例以 ChromeDriver 为例:
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver();
try {
// 设置隐式等待 10 秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
// 打开目标网页
driver.get("https://www.google.com");
// 使用显示等待:等待页面上的搜索输入框可见
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement searchBox = wait.until(ExpectedConditions
.visibilityOfElementLocated(By.name("q")));
// 输入关键字 Selenium
searchBox.sendKeys("Selenium WebDriver");
// 模拟回车
searchBox.submit();
// 再等待搜索结果的出现
WebElement resultStats = wait.until(ExpectedConditions
.visibilityOfElementLocated(By.id("result-stats")));
System.out.println("搜索结果统计信息: " + resultStats.getText());
// 后续还可以进行 Actions 的鼠标键盘操作
// ...
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭浏览器
driver.quit();
}
}
}
说明:
- 若要使用 Safari,请改用
WebDriver driver = new SafariDriver();并确认在 Safari->开发者设置 中启用了 允许远程自动化。mac不需要额外下载插件,因为本身就有。但要设置一下才能生效 - 如果使用 macOS,需要保证 Safari 与系统版本兼容;Chrome 则需要下载对应版本的 ChromeDriver。
如果是win 浏览器版本和驱动版本一定要匹配
Selenium 的业务应用场景
-
回归测试
- 产品迭代开发后,需要确保已有功能不被破坏,通常会有大量的重复性测试,Selenium 能自动化执行浏览器端操作,大幅降低人工回归成本。
-
功能测试
- 对网站的核心业务流程(如登录、下单、支付、信息填写等)进行自动化测试,减少疏漏。
-
跨浏览器测试
- 产品在 Chrome、Safari、Edge、Firefox 等主流浏览器下的兼容性验证。
-
持续集成/持续交付(CI/CD)
- 与 Jenkins、GitLab CI、GitHub Actions 等整合,在每次代码提交后自动触发 Selenium 测试,快速反馈并保证质量。
- 爬虫和数据采集(虽然不算 Selenium 的主要目的,但也有团队用它进行需要复杂交互场景下的数据采集)。
-
自动化演示、脚本化交互
- 例如做一些自动化网页操作(批量更新信息、自动填写表单等),减少重复人力投入。
总结
- Selenium 是目前 Web 自动化测试最常用的方案之一,兼容各大主流浏览器。
- 驱动与浏览器版本 需要匹配,以避免不必要的问题。
- 隐式等待与显示等待 可以帮助我们更好地控制脚本的执行节奏,从而提高测试稳定性。
- 鼠标和键盘操作 等高级交互功能能覆盖较复杂的场景。