Selenium 定義
Selenium 是一個(gè)用于 Web 應(yīng)用程序自動(dòng)化測試的開源工具集合,最初由 ThoughtWorks 開發(fā),目前由社區(qū)進(jìn)行維護(hù)和更新。它可以幫助開發(fā)人員、測試人員對(duì)網(wǎng)站功能、頁面交互進(jìn)行自動(dòng)化測試或操作,用以替代手動(dòng)測試,提高測試效率和準(zhǔn)確性。Selenium 的核心組件包括 Selenium IDE、Selenium WebDriver、Selenium Grid 等。
Selenium 基本原理
- WebDriver:Selenium 中最核心的組件,通過調(diào)用各個(gè)瀏覽器廠商提供的原生驅(qū)動(dòng)(如 ChromeDriver、SafariDriver)來控制瀏覽器進(jìn)行自動(dòng)化操作。
- 原理簡述:Selenium WebDriver 通過與瀏覽器驅(qū)動(dòng)(Driver)通信,將測試腳本中的各種動(dòng)作(如點(diǎn)擊、輸入文本、切換頁面等)轉(zhuǎn)換為瀏覽器可以理解的原生 API 調(diào)用,從而完成對(duì)瀏覽器的操作。
Selenium 官網(wǎng)
-
Selenium 官方網(wǎng)址:https://www.selenium.dev/
在該網(wǎng)站可以獲取到 Selenium 項(xiàng)目的最新文檔、下載鏈接、更新日志以及社區(qū)資源等。
核心術(shù)語及術(shù)語解釋
-
Selenium IDE
- 是一個(gè)瀏覽器插件(最初是 Firefox,后來也支持 Chrome)可用于錄制回放測試腳本,適用于編寫快速測試驗(yàn)證。
-
Selenium WebDriver
- 最常用的 Selenium 工具,通過瀏覽器驅(qū)動(dòng)程序與瀏覽器通信,提供對(duì)網(wǎng)頁控件的查找、操作、斷言等能力。
-
Selenium Grid
- 用于分布式測試,可將測試任務(wù)分配到不同的機(jī)器或者不同的瀏覽器上并行執(zhí)行,提高測試效率。
-
Browser Driver(瀏覽器驅(qū)動(dòng))
- 如 ChromeDriver、SafariDriver、EdgeDriver、FirefoxDriver 等。每個(gè)瀏覽器都有相應(yīng)的專屬驅(qū)動(dòng),用來接收 Selenium WebDriver 發(fā)送的指令并實(shí)際控制瀏覽器行為。
-
Locator(元素定位器)
- 定位網(wǎng)頁元素的方式,如 id、name、className、cssSelector、xpath 等。是自動(dòng)化腳本中查找元素的核心。
-
Wait(等待)
- 在自動(dòng)化過程中,為了保證元素已經(jīng)加載或處于可操作狀態(tài),需要設(shè)置等待策略,常見有隱式等待(Implicit Wait)和顯示等待(Explicit Wait)。
-
Actions(鼠標(biāo)鍵盤操作)
- Selenium 提供
Actions類用于模擬復(fù)雜的鼠標(biāo)鍵盤動(dòng)作,如鼠標(biāo)懸停、拖拽、右鍵、雙擊、按鍵輸入、組合鍵等。
- Selenium 提供
驅(qū)動(dòng)器版本與瀏覽器版本匹配
Selenium WebDriver 需要使用到各瀏覽器廠商提供的驅(qū)動(dòng),如:
-
Google Chrome 瀏覽器
- 對(duì)應(yīng)的驅(qū)動(dòng)是 ChromeDriver
- 需要確保 ChromeDriver 的版本與本地安裝的 Chrome 瀏覽器版本兼容或匹配,否則運(yùn)行測試時(shí)可能會(huì)出現(xiàn)錯(cuò)誤。
- 例如,本地瀏覽器版本是 108.x,則最好使用對(duì)應(yīng)的 108.x ChromeDriver。
-
Safari 瀏覽器
- 對(duì)應(yīng)的驅(qū)動(dòng)是 SafariDriver(在 macOS 上通常默認(rèn)隨系統(tǒng)自帶 Safari WebDriver,前提是開啟 “允許遠(yuǎn)程自動(dòng)化” 選項(xiàng))。
- 版本兼容性:SafariDriver 與 Safari 瀏覽器在同一個(gè)系統(tǒng)上,只要 macOS 和 Safari 為最新兼容版本即可。
在使用時(shí),可通過以下方式獲取驅(qū)動(dòng):
- 訪問官方驅(qū)動(dòng)下載地址(如 ChromeDriver - WebDriver for Chrome)
- 或使用第三方庫(如 WebDriverManager)自動(dòng)管理驅(qū)動(dòng)版本。
等待機(jī)制(顯示等待與隱式等待)
-
隱式等待(Implicit Wait)
- 在設(shè)置過隱式等待后,WebDriver 在查找元素時(shí)會(huì)默認(rèn)輪詢一定時(shí)間,直到元素出現(xiàn)或時(shí)間超過才拋出異常。它的作用范圍是全局一旦設(shè)置,對(duì)后續(xù)的所有元素定位都生效。
- 示例:
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
-
顯示等待(Explicit Wait)
指定某個(gè)條件(Condition),在該條件滿足之前,WebDriver 會(huì)按一定頻率不斷檢查,直到超時(shí)或者條件滿足才進(jìn)行下一步操作。
常用:
WebDriverWait+ExpectedConditions。-
示例:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("someId")));
兩者區(qū)別:
- 隱式等待適合大部分簡單的元素等待場景,配置較為簡單,但對(duì)全局都生效;
- 顯示等待針對(duì)特定元素或條件,可以靈活控制等待邏輯,更加精細(xì)化。
隱式等待在固定時(shí)間內(nèi)沒有等待到就會(huì)報(bào)錯(cuò)
顯示等待是一直等,即便超過設(shè)置的等待時(shí)間
鼠標(biāo)、鍵盤等驅(qū)動(dòng)操作
Selenium 提供 Actions 類來模擬復(fù)雜的人機(jī)交互動(dòng)作,常見例如:
-
鼠標(biāo)操作
- 移動(dòng)鼠標(biāo)到元素上(懸停)、點(diǎn)擊、雙擊、右鍵點(diǎn)擊、拖拽等。
- 示例:
actions.moveToElement(element).click().perform();
-
鍵盤操作
- 鍵盤按鍵(如 Enter、Esc 等)、按住 Shift 鍵點(diǎn)擊元素、同時(shí)按住 Ctrl 鍵等。
- 示例:
actions.keyDown(Keys.CONTROL).click(element).keyUp(Keys.CONTROL).perform();
通過這些操作,可以模擬真實(shí)用戶在網(wǎng)頁上的各種行為,完成對(duì)應(yīng)用的交互式測試或自動(dòng)化操作。
Code Demo
基配 Maven(3.9.x 以上)、JDK 17 環(huán)境下的 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 自動(dòng)管理驅(qū)動(dòng),可引入 -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.3.2</version>
</dependency>
<!-- Spring Boot 相關(guān)依賴 (若需要) -->
<!--
<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;
// 顯式等待相關(guān)
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
// 如果需要自動(dòng)管理驅(qū)動(dòng):
// import io.github.bonigarcia.wdm.WebDriverManager;
import java.time.Duration;
public class SeleniumDemoApplication {
public static void main(String[] args) {
// 如果使用 WebDriverManager 來自動(dòng)管理 ChromeDriver,可用下面代碼:
// WebDriverManager.chromedriver().setup();
// WebDriver driver = new ChromeDriver();
// 使用 ChromeDriver 手動(dòng)指定路徑或系統(tǒng)已有的可執(zhí)行文件:
// System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
// WebDriver driver = new ChromeDriver();
// 若使用 Safari 瀏覽器,則在 macOS 上需要開啟 “允許遠(yuǎn)程自動(dòng)化”:
// WebDriver driver = new SafariDriver();
// 以下示例以 ChromeDriver 為例:
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver();
try {
// 設(shè)置隱式等待 10 秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
// 打開目標(biāo)網(wǎng)頁
driver.get("https://www.google.com");
// 使用顯示等待:等待頁面上的搜索輸入框可見
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement searchBox = wait.until(ExpectedConditions
.visibilityOfElementLocated(By.name("q")));
// 輸入關(guān)鍵字 Selenium
searchBox.sendKeys("Selenium WebDriver");
// 模擬回車
searchBox.submit();
// 再等待搜索結(jié)果的出現(xiàn)
WebElement resultStats = wait.until(ExpectedConditions
.visibilityOfElementLocated(By.id("result-stats")));
System.out.println("搜索結(jié)果統(tǒng)計(jì)信息: " + resultStats.getText());
// 后續(xù)還可以進(jìn)行 Actions 的鼠標(biāo)鍵盤操作
// ...
} catch (Exception e) {
e.printStackTrace();
} finally {
// 關(guān)閉瀏覽器
driver.quit();
}
}
}
說明:
- 若要使用 Safari,請(qǐng)改用
WebDriver driver = new SafariDriver();并確認(rèn)在 Safari->開發(fā)者設(shè)置 中啟用了 允許遠(yuǎn)程自動(dòng)化。mac不需要額外下載插件,因?yàn)楸旧砭陀?。但要設(shè)置一下才能生效 - 如果使用 macOS,需要保證 Safari 與系統(tǒng)版本兼容;Chrome 則需要下載對(duì)應(yīng)版本的 ChromeDriver。
如果是win 瀏覽器版本和驅(qū)動(dòng)版本一定要匹配
Selenium 的業(yè)務(wù)應(yīng)用場景
-
回歸測試
- 產(chǎn)品迭代開發(fā)后,需要確保已有功能不被破壞,通常會(huì)有大量的重復(fù)性測試,Selenium 能自動(dòng)化執(zhí)行瀏覽器端操作,大幅降低人工回歸成本。
-
功能測試
- 對(duì)網(wǎng)站的核心業(yè)務(wù)流程(如登錄、下單、支付、信息填寫等)進(jìn)行自動(dòng)化測試,減少疏漏。
-
跨瀏覽器測試
- 產(chǎn)品在 Chrome、Safari、Edge、Firefox 等主流瀏覽器下的兼容性驗(yàn)證。
-
持續(xù)集成/持續(xù)交付(CI/CD)
- 與 Jenkins、GitLab CI、GitHub Actions 等整合,在每次代碼提交后自動(dòng)觸發(fā) Selenium 測試,快速反饋并保證質(zhì)量。
- 爬蟲和數(shù)據(jù)采集(雖然不算 Selenium 的主要目的,但也有團(tuán)隊(duì)用它進(jìn)行需要復(fù)雜交互場景下的數(shù)據(jù)采集)。
-
自動(dòng)化演示、腳本化交互
- 例如做一些自動(dòng)化網(wǎng)頁操作(批量更新信息、自動(dòng)填寫表單等),減少重復(fù)人力投入。
總結(jié)
- Selenium 是目前 Web 自動(dòng)化測試最常用的方案之一,兼容各大主流瀏覽器。
- 驅(qū)動(dòng)與瀏覽器版本 需要匹配,以避免不必要的問題。
- 隱式等待與顯示等待 可以幫助我們更好地控制腳本的執(zhí)行節(jié)奏,從而提高測試穩(wěn)定性。
- 鼠標(biāo)和鍵盤操作 等高級(jí)交互功能能覆蓋較復(fù)雜的場景。