自動化測試selenium(Java版)

1.準備工作

1.1.下載瀏覽器

自動化測試首先我們要準備一個瀏覽器,我們這里使用谷歌(chrome)瀏覽器.

1.2.安裝驅動管理

每一個瀏覽器都是靠瀏覽器驅動程序來啟動,但是瀏覽器的版本更新非常快,可能我們今天測試的是一個版本,第二天發布了一個新的版本,那么我們就要重構代碼,很不方便.于是selenium幫我們生成了驅動管理依賴,只要引入依賴.就不要我們手動的去處理瀏覽器版本的問題,只需要我們在pom.xml文件中引入依賴,每次使用都會幫助我們下載新的驅動

<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope>
</dependency>

此外我們還要引入selenium依賴

<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version>
</dependency>


1.3創建項目

創建一個maven項目

引入相關依賴

到此準備工作就完成了


2. 編寫自動化腳本

2.1 創建文件

對于代碼的測試我們一般都是在test目錄下創建,也可以在main方法中創建,但是一般規范都是讓我們在test中創建,FirstTest用來編寫我們的自動化腳本,run是執行我們的腳本

?2.2 編寫代碼

2.2.1 使用代碼下載對應的瀏覽器驅動

 //自動下載與當前系統和瀏覽器版本匹配的驅動程序WebDriverManager.chromedriver().setup();

2.2.2? 瀏覽器訪問限制處理

//訪問限制處理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");

2.2.3 生成一個瀏覽器對象完成初始訪問

//生成一個瀏覽器對象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.quit();

整體代碼:

public void test(){//自動下載與當前系統和瀏覽器版本匹配的驅動程序WebDriverManager.chromedriver().setup();//訪問限制處理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//生成一個瀏覽器對象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.quit();}

當我們完成一次操作之后要關閉driver對象.[driver.quit();]

這樣我們就完成了一次簡單的簡單的測試用例


3.自動化常用方法

我們先把下載驅動,創建一個瀏覽器對象,解除瀏覽器限制封裝成一個方法,這樣就減少了代碼的冗余

public void createDriver() throws InterruptedException {//自動下載與當前系統和瀏覽器版本匹配的驅動程序WebDriverManager.chromedriver().setup();//訪問限制處理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//生成一個瀏覽器對象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");}

3.1 元素的定位

一般定位一個元素我們一般使用cssSelector和Xpath.

獲取web元素按照上述操作定位元素位置之后,右鍵可以復制?Selector和Xpath

3.1.1?cssSelector

public void test01(){createDriver();//找到搜索框之后,輸入搜索關鍵字鞠婧祎driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");//點擊按鈕,也就是"百度一下".click(點擊操作)driver.findElement(By.cssSelector("#su")).click();driver.quit();}

findeElement:用于定位某個元素

By.cssSelector 使用 CSS 選擇器語法來定位 HTML 元素.

"#kw" 表示通過 id 屬性為 kw 的元素進行定位.(百度的搜索框元素id為kw)

sendKeys:用于向指定的頁面元素發送按鍵(輸入文本或模擬鍵盤操作)

click:用于模擬用戶點擊頁面上的某個元素

driver.quit():關閉由 WebDriver 打開的所有瀏覽器窗口,并終止與瀏覽器的會話連接。


3.1.2 Xpath?

XML路徑語?,不僅可以在XML?件中查找信息,還可以在HTML中選取節點
xpath使?路徑表達式來選擇xml?檔中的節點
xpath語法中:
獲取HTML??所有的節點
//*
獲取HTML??指定的節點
//[ 指定節點 ]
//ul :獲取HTML??所有的ul節點
//input:獲取HTML??所有的input節點
?獲取?個節點中的直接?節點
/
//span/input
?獲取?個節點的?節點
..
//input/.. 獲取input節點的?節點
實現節點屬性的匹配
[@...]
//*[@id='kw'] 匹配HTML??中id屬性為kw的節點
使?指定索引的?式獲取對應的節點內容
注意:xpath的索引是從1開始的。
百度??通過://div/ul/li[3] 定位到第三個百度熱搜標簽
//使用Xpath定位public void test02() {createDriver();driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("鞠婧祎");driver.findElement(By.xpath("//*[@id=\"su\"]")).click();driver.quit();}


3.2 操作測試對象

3.2.1 click

//找到百度?下按鈕并點擊
driver.findElement(By.cssSelector("#su")).click();

?3.2.2 sendKeys("")

driver.findElement(By.cssSelector("#kw")).sendKeys("輸??字");

3.2.3清除?本內容(clear)

將一開始輸入的鞠婧祎刪除后緊接著搜索章若楠

如果不使用clear(),我們搜索的詞條就是"鞠婧祎章若楠"

public void test03() throws InterruptedException {createDriver();driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.findElement(By.cssSelector("#kw")).clear();driver.findElement(By.cssSelector("#kw")).sendKeys("章若楠");Thread.sleep(3000);driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);driver.quit();}


3.2.4 獲取文本信息(getText())

 public void test04() {createDriver();String text = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a")).getText();System.out.println(text);driver.quit();}

?


3.2.5 獲取當前頁面標題(getTitle())或URL(getCurrentUrl)

//獲取標題或urlpublic void test05() {createDriver();String title = driver.getTitle();String currentUrl = driver.getCurrentUrl();System.out.println(title);System.out.println(currentUrl);driver.quit();}


3.2.6窗口

句柄:每個瀏覽器窗口或標簽頁都有一個唯一的標識符(字符串形式),稱為窗口句柄?

3.2.6.1 獲取百度首頁句柄以及新聞頁面句柄
public void test06() {createDriver();//進入新聞頁面driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();//獲取百度首頁句柄String curHandle = driver.getWindowHandle();System.out.println(curHandle);System.out.println("========================");//獲取所有句柄Set<String> windowHandles = driver.getWindowHandles();for (String handle:windowHandles){System.out.println(handle);}driver.quit();}

3.2.6.2 切換句柄

當前driver對象指向的是百度首頁的句柄,我們要使用新聞頁的元素,就要切換窗口,讓driver指向新聞頁

3.2.6.3 設置窗口大小
//窗?最?化
driver.manage().window().maximize();
//窗?最?化
driver.manage().window().minimize();
//全屏窗?
driver.manage().window().fullscreen();
//?動設置窗???
driver.manage().window().setSize(new Dimension(1024, 768));

3.3 屏幕截圖

有時為了觀察我們測試結果,需要保存圖片,于是selenium幫我們生成了截圖

void getScreenShot(String str) throws IOException {//     ./src/test/image///                     /2024-07-17///                                /test01-174530.png//                                /test02-174530.png//                     /2024-07-18///                                /test01-174530.png//                                /test02-174530.pngSimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());//./src/test/image/2024-07-17/test01-174530.pngString filename ="./src/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png";System.out.println("filename:"+filename);File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(srcFile,new File(filename));}

SimpleDateFormat sim1:該行代碼創建了一個日期格式化對象 sim1,用于將時間戳格式化為“年-月-日”的字符串形式


3.4 關閉窗口

//表示關閉當前標簽頁
driver.close();
//斷開連接,關閉driver對象
driver.quit();

3.5 等待

3.5.1 強制等待

Thread.sleep();

優點:代碼簡單

缺點:影響運行效率,浪費大量時間

3.5.2 隱式等待

隱式等待是?種智能等待,他可以規定在查找元素時,在指定時間內不斷查找元素。如果找到則代碼繼續執?,直到超時沒找到元素才會報錯。
 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
隱式等待 作?域 是整個腳本的所有元素。即只要driver對象沒有被釋放掉(driver.quit()),隱式等待就?直?效(全局生效).
但是隱式等待也有缺點,他只能查找元素是否存在,而不管元素對不對.而且只能查找元素
就像下方代碼:
//等待機制的隱式等待//隱式等待只是查找元素,并不關注元素結果對不對,只要是有結果,就繼續執行public void test13() throws InterruptedException {createDriver();driver.findElement(By.cssSelector("#kw")).sendKeys("鄧紫棋");driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span"));driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));//隱式等待,查找后發現有"#kw",所以不管.clear是否執行完成,就繼續查找下一個元素是否存在driver.findElement(By.cssSelector("#kw")).clear();//隱式等待,查找后發現有"#kw",所以不管.sendKeys是否執行完成,就繼續查找下一個元素是否存在driver.findElement(By.cssSelector("#kw")).sendKeys("迪麗熱巴");//隱式等待,查找后發現有"#su",所以不管.click是否執行完成,就繼續查找下一個元素是否存在driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);//如果我們不強制等待上述的三個指令執行完成的話,那么迪麗熱巴這個詞條可能還沒完成輸入(sendKeys("迪麗熱巴");),點擊查詢按鈕(.click();),隱式等待就已經查詢完畢了//此時迪麗熱巴詞條還沒有進行搜索,就結束,所以還是會返回鄧紫棋//Thread.sleep(3000);就是為了等待 driver.findElement(By.cssSelector("#kw")).sendKeys("迪麗熱巴");// driver.findElement(By.cssSelector("#su")).click();執行完畢,更新#\31  > div > div > div > div > div > div.header值為迪麗熱巴WebElement ele=driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span"));System.out.println(ele.getText());driver.quit();

3.5.3 顯式等待

顯?等待也是?種智能等待,在指定超時時間范圍內只要滿?操作的條件就會繼續執?后續代碼
顯式等待可以
? ? ? ?
? ? ??

elementToBeClickable:等待直到指定的元素在頁面上可見并且可以被點擊

 WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(3));wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));

??等待某個元素的文本內容為 "預期文本"(就是看括號內文本在不在前端頁面中)

wait.until(ExpectedConditions.textToBe());

presenceOfElementLocated(By locator) 是 ExpectedConditions 類中的一個方法,用于顯式等待某個元素出現在頁面的 DOM 中。這個方法并不保證元素是可見的或可交互的,只是確保元素已經存在于頁面的 DOM 結構中
 wait.until(ExpectedConditions.presenceOfElementLocated())

檢查當前??的 URL 是?個特定的 URL
urlToBe(java.lang.String url)

3.6瀏覽器導航

//后退
driver.navigate().back();
//前進
driver.navigate().forward();
//刷新
driver.navigate().refresh();

打開網站:

// 更?的?法
driver.navigate().to("https://selenium.dev");
// 簡潔的?法
driver.get("https://selenium.dev");

3.7 彈窗

彈窗不屬于web頁面元素,所以就沒辦法定位元素,這里就要使用Alert類

Alert alert = driver.switchTo.alert();
//確認
alert.accept()
//取消
alert.dismiss()

3.8 文件上傳

點擊?件上傳的場景下會彈窗系統窗?,進??件的選擇。
selenium?法識別?web的控件,上傳?件窗?為系統?帶,?法識別窗?元素
但是可以使?sendkeys來上傳指定路徑的?件,達到的效果是?樣的
WebElement ele = driver.findElement(By.cssSelector("body > div > div > 
input[type=file]"));
//輸入文件本地存儲的路徑即可
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");

3.9 瀏覽器參數設置

1)"無頭模式",指的是執行自動化的時候不會打開網頁

options.addArguments("-headless");
2)設置瀏覽器加載策略
options.setPageLoadStrategy(PageLoadStrategy. NONE );

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

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

相關文章

HarmonyOS Next應用架構設計與模塊化開發詳解

引言 在HarmonyOS Next開發中&#xff0c;合理的應用架構設計和模塊化開發是構建高效、可維護應用的關鍵。本文將深入探討HarmonyOS Next應用的架構設計思路&#xff0c;并通過實際代碼示例展示如何實現模塊化開發。 應用架構設計 HarmonyOS Next應用通常采用分層架構設計&…

伊利工業旅游4.0,近距離感受高品質的魅力

3月24日&#xff0c;在2025年第112屆全國糖酒會&#xff08;簡稱春糖&#xff09;前夕&#xff0c;伊利集團“可感知高品質探尋薈”活動在成都召開&#xff0c;記者走進伊利在西南地區最大的乳制品生產基地—邛崍工廠&#xff0c;零距離見證液態奶、酸奶、冷飲等乳制品的誕生&a…

測試用例生成平臺通過大模型升級查詢功能,生成智能測試用例

在測試工作中&#xff0c;查詢功能是各類系統的核心模塊&#xff0c;傳統的測試用例編寫往往耗時且重復。如何讓老舊平臺煥發新活力&#xff1f;本文將結合大模型技術&#xff0c;通過用戶輸入的字段信息&#xff0c;自動化生成高效、精準的測試用例。同時&#xff0c;我們還將…

基于javaweb的SpringBoot雪具商城系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

【AI學習筆記】Coze平臺實現將Excel文檔批量導入數據庫全過程

背景前搖&原視頻教程&#xff1a; 最近看到很多同學都在用Coze平臺操作數據&#xff0c;我也想了解一下工作流的搭建和數據處理過程&#xff0c;但是一下子又看不懂太復雜的邏輯&#xff0c;于是上B站搜索相關的基礎教程。 Coze官方教程&#xff1a; 之前有看過Coze平臺…

【Axure高保真原型】縱向圖片輪播

今天和大家分享縱向圖片輪播的原型模版&#xff0c;載入后會自動循環輪播&#xff0c;鼠標移入圖片后停止輪播&#xff0c;可以通過點擊上下箭頭&#xff0c;向上或向下滑動切換上一張或下一張圖片&#xff0c;也可以點擊右側小圓點快速切換至對應圖片……具體效果可以打開下方…

力扣32.最長有效括號(棧)

32. 最長有效括號 - 力扣&#xff08;LeetCode&#xff09; 代碼區&#xff1a; #include<stack> #include<string> /*最長有效*/ class Solution { public:int longestValidParentheses(string s) {stack<int> st;int ans0;int ns.length();st.push(-1);fo…

如何在 React 項目中使用React.lazy和Suspense實現組件的懶加載?

大白話如何在 React 項目中使用React.lazy和Suspense實現組件的懶加載&#xff1f; 在 React 項目里&#xff0c;有時候組件功能多、體積大&#xff0c;要是一次性把所有組件都加載進來&#xff0c;網頁加載速度就會變慢。而 React 提供了 React.lazy 和 Suspense 這兩個好東西…

ffmpeg-將多個視頻切片成一個新的視頻

使用 ffmpeg 工具可以輕松完成將多個視頻切片合并為一個新的視頻。以下是實現這一目標的具體步驟和命令。 步驟概覽 1、將多個視頻切片。 2、創建文本文件列出切片的視頻片段。 3、使用 ffmpeg 合并這些切片為一個新的視頻。 一&#xff1a;安裝 ffmpeg 確保你的系統中已經安…

【第2月_day10】Pandas數據查看與選擇

以下是專為小白設計的 Pandas數據查看與選擇 學習內容&#xff0c;從基礎到應用逐步講解&#xff0c;附帶清晰示例和注意事項&#xff1a; 一、數據查看&#xff1a;快速了解你的數據 1. head() 和 tail() 作用&#xff1a;查看數據的前幾行或后幾行&#xff0c;默認顯示5行。…

Jetpack LiveData 使用與原理解析

一、引言 在 Android 開發中&#xff0c;數據的變化需要及時反映到界面上是一個常見的需求。然而&#xff0c;傳統的方式可能會導致代碼復雜、難以維護&#xff0c;并且容易出現內存泄漏等問題。Jetpack 組件中的 LiveData 為我們提供了一種優雅的解決方案&#xff0c;它是一種…

Unity2D 五子棋 + Photon聯網雙人對戰

開發環境配置 Unity版本2022.3 創建Photon賬號以及申請Photon中國區服務 官網申請賬號&#xff1a;Multiplayer Game Development Made Easy Photon Engine 中國區服務&#xff1a; 光子引擎photonengine中文站 成都動聯無限科技有限公司(vibrantlink.com) 導入PUN2插件以及…

(UI自動化測試web端)第二篇:元素定位的方法_css定位之屬性選擇器

看代碼里的【find_element_by_css_selector( )】( )里的表達式怎么寫&#xff1f; 文章介紹了第四種寫法屬性選擇器 &#xff0c;你要根據網頁中的實際情況來判斷自己到底要用哪一種方法來進行元素定位。每種方法都要多練習&#xff0c;全都熟了之后你在工作當中使用起來元素定…

預編譯能否 100%防 sql 注入?

&#x1f31f; 什么是 SQL 注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是指攻擊者利用特殊輸入&#xff0c;讓數據庫執行它本來不應該執行的代碼&#xff0c;從而獲取或篡改數據。 就像在考試的時候偷偷改題目&#xff0c;讓老師改成你想要的內容&#…

第十五章 | Layer2、Rollup 與 ZK 技術實戰解析

&#x1f4da; 第十五章 | Layer2、Rollup 與 ZK 技術實戰解析 ——構建下一代高性能區塊鏈應用&#xff0c;從 Solidity 到 zkSync&#xff01; ? 本章導讀 Layer2 和零知識證明&#xff08;ZK&#xff09;正成為區塊鏈發展的核心方向。 隨著主網 Gas 居高不下、TPS 無法滿…

2025-03-26 學習記錄--C/C++-PTA 6-3 求鏈式表的表長

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 6-3 求鏈式表的表長 本題要求實現一個函數&#xff0c;求鏈式表的表長。 函數接口定義&#xff1a; &…

【Linux】Linux_Ubuntu與Windows之間的文件傳輸

一、Linux終端命令的復制粘貼 1.打開linux 終端&#xff0c;輸入以下命令&#xff1a;&#xff08;注意&#xff0c;需要聯網&#xff09; 2.命令行下載&#xff1a; sudo apt-get autoremove open-vm-tools 3.命令行安裝&#xff1a; sudo apt-get install open-vm-tools-…

Python Sanic面試題及參考答案

目錄 Sanic 的事件循環機制與 uvloop 的關系 Sanic 的 Request/Response 對象生命周期如何管理?如何訪問請求上下文? 對比 Sanic 與 Flask/Django 的異步處理模型差異 Sanic 的 Blueprint 機制如何實現模塊化路由?如何處理跨藍圖中間件? 如何在 Sanic 中實現 WebSocket…

算法每日一練 (18)

&#x1f4a2;歡迎來到張翊塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 算法每日一練 (18)刪除并獲得點數題目描述解題思路解題…

VsCode啟用右括號自動跳過(自動重寫) - 自錄制gif演示

VsCode啟用右括號自動跳過(自動重寫) - 自錄制gif演示 前言 不知道大家在編程時候的按鍵習慣是怎樣的。輸入完左括號后編輯器一般會自動補全右括號&#xff0c;輸入完左括號的內容后&#xff0c;是按→跳過右括號還是按)跳過右括號呢&#xff1f; for (int i 0; i < a.s…