Selenium+Java 自動化測試入門到實踐:從環境搭建到元素操作

在自動化測試領域,Selenium 憑借其強大的跨瀏覽器兼容性和靈活的 API,成為 Web 應用測試的首選工具。而 Java 作為一門穩定且廣泛應用的編程語言,與 Selenium 結合能構建出高效、可維護的自動化測試框架。本文將從環境搭建開始,逐步介紹 Selenium+Java 的核心用法,幫助新手快速上手。

一、環境搭建:讓工具跑起來

1. 安裝 Java 開發環境

Selenium 的 Java 客戶端需要依賴 JDK,建議安裝 JDK 8 及以上版本。安裝完成后,需配置環境變量:

  • 新建JAVA_HOME,指向 JDK 安裝目錄(如C:\Program Files\Java\jdk1.8.0_301
  • Path中添加%JAVA_HOME%\bin%JAVA_HOME%\jre\bin
  • 配置CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

通過java -versionjavac -version命令驗證安裝是否成功。

2. 配置開發工具

推薦使用 IntelliJ IDEA 或 Eclipse 作為開發 IDE。以 IntelliJ IDEA 為例,新建 Maven 項目后,在pom.xml中添加 Selenium 依賴:

Maven 會自動下載 Selenium 相關的 JAR 包,無需手動導入。

3. 下載瀏覽器驅動

Selenium 需要通過驅動程序與瀏覽器交互,不同瀏覽器需對應不同驅動:

  • Chrome:ChromeDriver(版本需與瀏覽器版本匹配)
  • Firefox:GeckoDriver
  • Edge:EdgeDriver

下載后將驅動文件放在無空格的目錄下(如D:\drivers),并將該目錄添加到系統Path中,或在代碼中指定驅動路徑。

二、第一個 Selenium+Java 程序:打開百度首頁

環境就緒后,我們來編寫第一個自動化腳本,實現打開 Chrome 瀏覽器并訪問百度首頁的功能:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class FirstSeleniumTest {public static void main(String[] args) {// 初始化WebDriver實例(Chrome瀏覽器)WebDriver driver = new ChromeDriver();// 打開百度首頁driver.get("https://www.baidu.com");// 打印頁面標題System.out.println("頁面標題:" + driver.getTitle());// 等待3秒后關閉瀏覽器try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}// 關閉瀏覽器driver.quit();}
}

運行代碼后,會自動啟動 Chrome 瀏覽器并打開百度首頁,控制臺輸出頁面標題,3 秒后瀏覽器自動關閉。這里的WebDriver是 Selenium 的核心接口,封裝了瀏覽器的各種操作方法。

三、核心操作:元素定位與交互

自動化測試的核心是與頁面元素交互,而元素定位是前提。Selenium 提供了 8 種元素定位方式,常用的有以下幾種:

1. 元素定位方法

  • id:通過元素的id屬性定位(唯一性高,優先使用)
    WebElement searchBox = driver.findElement(By.id("kw")); // 百度搜索框
    
  • name:通過元素的name屬性定位
    WebElement searchBox = driver.findElement(By.name("wd"));
    
  • xpath:通過 XML 路徑語言定位,支持復雜場景
    // 絕對路徑(不推薦,易受頁面結構變化影響)
    WebElement searchBtn = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input"));// 相對路徑(推薦,更靈活)
    WebElement searchBtn = driver.findElement(By.xpath("//input[@value='百度一下']"));
    
  • cssSelector:通過 CSS 選擇器定位,速度比 xpath 快
    WebElement searchBtn = driver.findElement(By.cssSelector("#su")); // 百度搜索按鈕
    

2. 元素交互操作

定位到元素后,可執行點擊、輸入、清除等操作:

// 定位搜索框并輸入內容
WebElement searchBox = driver.findElement(By.id("kw"));
searchBox.sendKeys("Selenium+Java");// 定位搜索按鈕并點擊
WebElement searchBtn = driver.findElement(By.id("su"));
searchBtn.click();// 清除輸入框內容
searchBox.clear();

四、進階技巧:等待機制與窗口切換

在實際測試中,頁面加載、異步請求等可能導致元素未及時出現,直接操作會拋出異常。Selenium 提供了三種等待機制解決這一問題:

1. 等待機制

  • 隱式等待:設置全局等待時間,在規定時間內輪詢查找元素
    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    
  • 顯式等待:針對特定元素設置等待條件和超時時間
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    WebElement result = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[contains(@class,'result')]")));
    
  • 線程休眠:強制等待(不推薦,影響執行效率)
    Thread.sleep(2000);
    

2. 窗口切換

當頁面打開新窗口時,需切換到對應窗口才能操作其中的元素:

// 獲取當前所有窗口句柄
Set<String> windowHandles = driver.getWindowHandles();
List<String> handlesList = new ArrayList<>(windowHandles);// 切換到新窗口(假設新窗口是第二個打開的)
driver.switchTo().window(handlesList.get(1));// 切回原窗口
driver.switchTo().window(handlesList.get(0));

五、高級元素操作與 JavaScript 執行

1. 復雜表單處理

對于下拉框、復選框、單選按鈕等特殊表單元素,Selenium 提供了專門的處理類:

// 處理下拉框(Select類)
WebElement selectElement = driver.findElement(By.id("selectId"));
Select select = new Select(selectElement);// 通過索引選擇(從0開始)
select.selectByIndex(1);
// 通過可見文本選擇
select.selectByVisibleText("選項二");
// 通過value屬性選擇
select.selectByValue("option2");// 獲取所有選項
List<WebElement> options = select.getOptions();// 處理復選框
WebElement checkbox = driver.findElement(By.id("checkbox1"));
if (!checkbox.isSelected()) {checkbox.click();
}// 處理單選按鈕
List<WebElement> radios = driver.findElement(By.name("radioGroup"));
for (WebElement radio : radios) {if (radio.getAttribute("value").equals("male")) {radio.click();break;}
}

2. 文件上傳與下載

文件上傳和下載是 Web 測試中常見場景:

// 文件上傳(input標簽type=file)
WebElement uploadInput = driver.findElement(By.id("uploadFile"));
// 直接發送文件路徑即可,無需點擊上傳按鈕
uploadInput.sendKeys("D:\\test\\upload.txt");// 文件下載(配置瀏覽器下載路徑)
ChromeOptions options = new ChromeOptions();
// 設置下載路徑
Map<String, Object> prefs = new HashMap<>();
prefs.put("download.default_directory", "D:\\test\\downloads");
// 禁止下載彈窗
prefs.put("download.prompt_for_download", false);
options.setExperimentalOption("prefs", prefs);// 用配置好的選項初始化driver
WebDriver driver = new ChromeDriver(options);

3. 執行 JavaScript 代碼

對于 Selenium 原生 API 難以實現的操作(如滾動頁面、修改元素屬性),可以通過執行 JavaScript 實現:

JavascriptExecutor js = (JavascriptExecutor) driver;// 滾動到頁面底部
js.executeScript("window.scrollTo(0, document.body.scrollHeight)");// 滾動到指定元素
WebElement target = driver.findElement(By.id("targetId"));
js.executeScript("arguments[0].scrollIntoView();", target);// 修改元素屬性(如移除readonly屬性)
js.executeScript("arguments[0].removeAttribute('readonly')", element);// 獲取頁面標題(通過JS)
String title = (String) js.executeScript("return document.title");

六、測試框架設計與優化

1. 基礎框架結構

一個規范的 Selenium 測試框架應包含以下結構:

src/main/java
├── common/           // 公共工具類
│   ├── DriverUtil.java  // 驅動管理
│   ├── WaitUtil.java    // 等待工具
│   └── ScreenShotUtil.java // 截圖工具
├── page/             // 頁面對象
│   ├── LoginPage.java
│   └── HomePage.java
└── test/             // 測試用例├── LoginTest.java└── HomeTest.java

2. 頁面對象模型(POM)

POM 模式將頁面元素和操作封裝到頁面對象類中,提高代碼復用性和可維護性:

// 登錄頁面對象
public class LoginPage {private WebDriver driver;private WebDriverWait wait;// 元素定位@FindBy(id = "username")private WebElement usernameInput;@FindBy(id = "password")private WebElement passwordInput;@FindBy(id = "loginBtn")private WebElement loginButton;// 構造方法public LoginPage(WebDriver driver) {this.driver = driver;this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));PageFactory.initElements(driver, this); // 初始化頁面元素}// 頁面操作public void enterUsername(String username) {usernameInput.sendKeys(username);}public void enterPassword(String password) {passwordInput.sendKeys(password);}public HomePage clickLogin() {loginButton.click();return new HomePage(driver); // 登錄后跳轉到首頁}public void login(String username, String password) {enterUsername(username);enterPassword(password);clickLogin();}
}

使用 POM 后的測試用例更加簡潔:

public class LoginTest {private WebDriver driver;private LoginPage loginPage;@BeforeEachpublic void setUp() {driver = DriverUtil.getDriver();driver.get("https://example.com/login");loginPage = new LoginPage(driver);}@Testpublic void testSuccessfulLogin() {loginPage.login("testuser", "testpass");// 驗證登錄成功Assertions.assertTrue(driver.getCurrentUrl().contains("/home"));}@AfterEachpublic void tearDown() {DriverUtil.quitDriver();}
}

3. 數據驅動測試

結合 TestNG 和 Excel 實現數據驅動測試,用不同數據執行相同測試邏輯:

// 讀取Excel數據工具類
public class ExcelUtil {public static Object[][] readTestData(String filePath, String sheetName) {// 實現Excel讀取邏輯,返回二維數組// 每行代表一組測試數據,每列代表一個參數}
}// 數據驅動測試用例
public class LoginDataDrivenTest {private WebDriver driver;private LoginPage loginPage;@BeforeMethodpublic void setUp() {driver = DriverUtil.getDriver();driver.get("https://example.com/login");loginPage = new LoginPage(driver);}@Test(dataProvider = "loginData")public void testLoginWithDifferentData(String username, String password, String expectedResult) {loginPage.enterUsername(username);loginPage.enterPassword(password);loginPage.clickLogin();if (expectedResult.equals("success")) {Assertions.assertTrue(driver.getCurrentUrl().contains("/home"));} else {Assertions.assertTrue(driver.findElement(By.cssSelector(".error-msg")).isDisplayed());}}@DataProvider(name = "loginData")public Object[][] provideTestData() {return ExcelUtil.readTestData("src/test/resources/loginData.xlsx", "Sheet1");}@AfterMethodpublic void tearDown() {DriverUtil.quitDriver();}
}

七、測試報告與持續集成

1. 生成美觀的測試報告

使用 ExtentReports 生成詳細的 HTML 測試報告:

public class ExtentReportUtil {private static ExtentReports extent;private static ExtentTest test;public static void initReport() {extent = new ExtentReports();File reportDir = new File("test-reports");if (!reportDir.exists()) {reportDir.mkdir();}ExtentSparkReporter spark = new ExtentSparkReporter("test-reports/result.html");extent.attachReporter(spark);}public static void createTest(String testName) {test = extent.createTest(testName);}public static void logPass(String message) {test.pass(message);}public static void logFail(String message) {test.fail(message);// 失敗時截圖String screenshotPath = ScreenShotUtil.takeScreenshot(driver, "fail");test.addScreenCaptureFromPath(screenshotPath);}public static void flushReport() {extent.flush();}
}

2. 集成到 CI/CD 流程

將 Selenium 測試集成到 Jenkins 等 CI 工具,實現自動化構建和測試:

  1. 在項目中添加 Maven Surefire 插件,用于執行測試用例:
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0-M5</version><configuration><suiteXmlFiles><suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile></suiteXmlFiles></configuration></plugin></plugins>
</build>
  1. 在 Jenkins 中配置:
    • 拉取代碼倉庫
    • 執行mvn clean test命令
    • 配置測試報告展示(ExtentReports 或 TestNG 報告)
    • 設置郵件通知,發送測試結果

八、常見問題與解決方案

1. 元素定位不穩定

  • 優先使用顯式等待,而非隱式等待或線程休眠
  • 避免使用絕對 XPath,改用相對 XPath 并結合多種屬性定位
  • 對于動態 ID,使用包含部分固定文本的定位方式://div[contains(@id, 'prefix_')]

2. 瀏覽器兼容性問題

  • 使用 WebDriverManager 管理不同瀏覽器驅動,自動匹配版本:
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
  • 編寫測試基類,通過參數控制啟動不同瀏覽器:
public class TestBase {protected WebDriver driver;@Parameters("browser")@BeforeMethodpublic void setUp(String browser) {if (browser.equals("chrome")) {driver = new ChromeDriver();} else if (browser.equals("firefox")) {driver = new FirefoxDriver();} else if (browser.equals("edge")) {driver = new EdgeDriver();}driver.manage().window().maximize();}
}

3. 執行速度優化

  • 減少不必要的等待時間,合理設置超時參數
  • 避免在循環中頻繁查找元素,可一次查找后緩存
  • 使用 Headless 模式運行瀏覽器(無界面模式):
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless=new"); // Chrome 112+版本
WebDriver driver = new ChromeDriver(options);

九、總結與學習資源

Selenium+Java 的學習是一個循序漸進的過程,從基礎操作到框架搭建需要不斷實踐和總結

自動化測試的核心價值在于提高測試效率和回歸測試覆蓋率,在實際項目中,應根據需求選擇合適的測試場景進行自動化,避免盲目追求自動化率。隨著經驗的積累,你會逐漸掌握如何設計出穩定、高效、易維護的自動化測試框架。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90077.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hugging Face 模型的緩存和直接下載有什么區別?

Hugging Face 模型的緩存和直接下載&#xff08;下載到本地文件夾&#xff09;是兩種不同的模型管理方式&#xff0c;它們在使用場景、存儲結構和效率上各有優劣。 以下是它們之間的主要區別&#xff1a; Hugging Face 緩存 (Cache) 當您通過 transformers 庫中的 from_pretrai…

JavaScript AJAX 實現,演示如何將 Token 添加到 Authorization

以下是一個完整的原生 JavaScript AJAX 實現&#xff0c;演示如何將 Token 添加到 Authorization 頭部的示例&#xff1a;基礎實現html復制代碼<!DOCTYPE html> <html> <head><title>AJAX Token 示例</title><script>// 獲取當前用戶的 To…

開發語言的優劣勢對比及主要應用領域分析

開發語言是程序員用來編寫軟件指令的工具。每種語言都有自己的設計哲學、語法&#xff08;規則&#xff09;和應用場景&#xff0c;但沒有“放之四海而皆準”的最佳語言。以下是主流和重要開發語言的介紹&#xff0c;按主要應用領域分類&#xff1a; 一、全能型語言 (可在多個領…

Java學習-------事務失效

在 Java 開發中&#xff0c;事務是保證數據一致性和完整性的關鍵機制&#xff0c;尤其在涉及多步數據庫操作的業務場景中不可或缺。然而&#xff0c;在實際開發過程中&#xff0c;事務常常會出現 “失效” 的情況 —— 預期的回滾沒有發生&#xff0c;數據出現不一致。 Java 事…

JavaScript 01 JavaScript 是什么

1.1 JavaScript 是什么JavaScript 是一門世界上最流行的腳本語言&#xff08;基本所有平臺的所有軟件都會用到它&#xff09;。“1994年&#xff0c;網景公司(Netscape)發布了Navigator瀏覽器0.9版。這是歷史上第一個比較成熟的網絡瀏覽器&#xff0c;轟動一時。但是&#xff0…

Bun v1.2.19發布,node_modules隔離,sql比node快6倍

大家好,我是農村程序員,獨立開發者,行業觀察員,前端之虎陳隨易。我會在這里分享關于 獨立開發、編程技術、思考感悟 等內容,歡迎關注。 技術群與交朋友請在個人網站聯系我,網站 1??:https://chensuiyi.me,網站 2??:https://me.yicode.tech。 如果你覺得本文有用…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 主頁布局實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解主頁布局實現 視頻在線地址&#xff1a; …

# 微調需要準備哪些環境配置?

微調需要準備哪些環境配置&#xff1f; 如果沒有 GPU&#xff0c;即便是微調較小的大語言模型&#xff08;LLMs&#xff09;&#xff0c;過程也會比較慢。如果你已經有了現成的 GPU&#xff0c;那就可以直接開工了。不過&#xff0c;并不是所有人都能負擔得起 GPU—— 這種情況…

ClickHouse物化視圖避坑指南:原理、數據遷移與優化

摘要ClickHouse物化視圖通過預計算和自動更新機制&#xff0c;顯著提升大數據分析查詢性能&#xff0c;尤其適合高并發聚合場景。本文將深入解析其技術原理、生產實踐中的優化策略&#xff0c;以及數據遷移的實戰經驗。一、物化視圖核心概念ClickHouse的物化視圖(Materialized …

Springboot3整合Elasticsearch8(elasticsearch-java)

1、Elasticsearch的JAVA客戶端選擇 Elasticsearch官方支持的客戶端 客戶端名稱簡介使用建議Elasticsearch Java API Client&#xff08;新客戶端&#xff09;官方推薦的新客戶端&#xff0c;基于 JSON Mapping&#xff08;如 ElasticsearchClient 類&#xff09;&#xff0c;…

OpenCV 官翻8 - 其他算法

文章目錄高動態范圍成像引言曝光序列源代碼示例圖像說明結果色調映射圖像曝光融合附加資源高級圖像拼接 API&#xff08;Stitcher 類&#xff09;目標代碼說明相機模型試用指南圖像拼接詳解 (Python OpenCV >4.0.1)stitching_detailed如何使用背景減除方法目標代碼代碼解析結…

2025年一區SCI-回旋鏢氣動橢圓優化算法Boomerang Aerodynamic Ellipse-附Matlab免費代碼

引言 本期介紹一種新的元啟發式算法——回旋鏢氣動橢圓優化算法Boomerang Aerodynamic Ellipse Optimizer (BAEO)。該優化器的靈感來自于飛行中的回旋鏢的空氣動力學行為&#xff0c;明確地建模了釋放角和發射力如何塑造其軌跡。于2025年7月最新發表在JCR 1區&#xff0c;中科…

Custom SRP - Custom Render Pipeline

https://catlikecoding.com/unity/tutorials/custom-srp/custom-render-pipeline/ 1. 新建 Render Pipeline 任何內容的渲染&#xff0c;最終都是要由 unity 決定在哪里&#xff0c;什么時候&#xff0c;以哪些參數進行渲染。根據目標效果的復雜程度&#xff0c;決定渲染的過程…

C語言面向對象編程

1.內核通用鏈表一、什么是 list_head&#xff1f;list_head 是 Linux 內核中自己實現的一種 雙向循環鏈表 的結構&#xff0c;定義在 <linux/list.h> 中。它設計得非常輕巧、靈活&#xff0c;廣泛用于內核模塊、驅動、進程調度、網絡協議棧等。它的關鍵思想是&#xff1a…

Spring Boot+Redis Zset:三步構建高可靠延遲隊列系統

系統設計架構圖---------------- ----------------- ---------------- | | | | | | | 生產者 |------>| Redis ZSet |------>| 定時任務消費者 | | (添加延遲任務) | | (延…

MCP vs 傳統集成方案:REST API、GraphQL、gRPC的終極對比

MCP vs 傳統集成方案&#xff1a;REST API、GraphQL、gRPC的終極對比 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特…

SQL語句中鎖的使用與優化

一、鎖機制簡介1.定義在數據庫中&#xff0c;除了傳統的計算資源&#xff08;如CPU、RAM、I/O等&#xff09;的爭用以外&#xff0c;數據也是一種供需要用戶共享的資源。如何保證數據并發訪問的一致性、有效性是所有數據庫必須解決的一個問題&#xff0c;鎖沖突也是影響數據庫并…

Linux筆記1——簡介安裝

操作系統給用戶一個操作界面&#xff0c;用戶通過操作界面使用系統資源Linux內核管理控制硬件&#xff0c;和硬件打交道SCSI&#xff08;盤&#xff09;sd**;第一個*表示磁盤順序&#xff0c;第二個*表示分區。例如&#xff1a;sda\sdb\sdc,sda1,sda2NVMe&#xff08;盤&#x…

GoLand 部署第一個項目

前言&#xff1a;Go環境部署分為兩種模式&#xff0c;一種是基于GOPATH部署&#xff08;老版本&#xff09;&#xff0c;另一種是基于Module部署&#xff08;新版本v1.11開始&#xff09;。GOPATH&#xff1a;需要配置GOPATH路徑&#xff0c;將GOPATH目錄視為工作目錄&#xff…

Mosaic數據增強介紹

1. 核心概念與目標Mosaic 是一種在計算機視覺&#xff08;尤其是目標檢測任務&#xff09;中非常流行且強大的數據增強技術。它最早由 Ultralytics 的 Alexey Bochkovskiy 在 YOLOv4 中提出并推廣&#xff0c;后來被廣泛應用于 YOLOv5, YOLOv7, YOLOv8 等模型以及其他目標檢測框…