UI自動化測試實戰

Python接口自動化測試零基礎入門到精通(2025最新版)

一、設計背景

隨著IT行業的發展,產品愈漸復雜,web端業務及流程更加繁瑣,目前UI測試僅是針對單一頁面,操作量大。為了滿足多頁面功能及流程的需求及節省工時,設計了這款UI 自動化測試程序。旨在提供接口,集成到蝸牛自動化測試框架,方便用例的設計。

整個程序是基于 selenium 設計的。程序對 selenium 提供的接口進行了二次封裝以滿足日常的用例設計,二次封裝后的接口解決了元素加載,元素定位解析等問題,可以讓用例設計變得更加簡捷。

之所以采用 Selenium 的模式。原因一,對于用戶來說這是一個開源框架,很想窺探一二; 原因二,Selenium 可無縫接入。這是一個用于Web應用程序測試的工具,支持多平臺、多瀏覽器、多語言去實現自動化測試,Selenium2將瀏覽器原生的API封裝成WebDriver API,可以直接操作瀏覽器頁面里的元素,甚至操作瀏覽器本身(截屏,窗口大小,啟動,關閉之類的),所以就像真正的用戶在操作一樣。

目前支持:Mac、Windows操作系統,chrome、Firefox、IE瀏覽器。

二、工作原理

  • 在蝸牛管理后臺添加測試用例。
  • 蝸牛管理后臺測試用例執行調用任務執行接口,傳送任務id及測試數據的JSON格式字符串給程序。
  • 程序根據獲取數據,解析并處理。
  • 啟動瀏覽器后,selenium-webdriver會將目標瀏覽器綁定到特定的端口,啟動后的瀏覽器則作為webdriver的server。
  • 客戶端(也就是測試腳本),借助ComandExecutor發送HTTP請求給server端(通信協議:The WebDriver Wire Protocol,在HTTP request的body中,會以WebDriver Wire協議規定的JSON格式的字符串來告訴Selenium,我們希望瀏覽器接下來做什么事情)。
  • Server端需要依賴原生的瀏覽器組件,轉化Web Service的命令為瀏覽器native的調用來完成操作。
  • 最后將處理結果及任務id通過JSON字符串的格式返回給蝸牛,通過蝸牛的管理后臺可查看每條用例執行結果。

三、框架介紹

3.1 工程結構

按照實際的業務流程調用對應接口來實現 WEB-UI 自動化測試用例。case 層可調用 service 層和 pageObject 層的接口,pageObject 是對每一個頁面元素的一個封裝,service 是對一個常用的業務模塊功能的封裝。比如一個查詢企業信息的測試用例,需要依賴登入,這個業務功能就可以直接調用 service 中的接口。企業查詢的創建就可以調用 pageObject 中的接口,然后按照查詢的業務流程,在測試用例中把這些接口串起來就形成了一個 UI 自動化測試用例,詳細細節接下去會舉例說明。

如企業查詢。查詢之前,需要登入管理后臺,登入操作已封裝到業務層,直接調用 service 層的接口,不需要在意這個步驟的細節;登入之后要指定一個路徑,找到對應的空間,直接調用 model 層的接口,不需要在意這個步驟的細節;接著是創建查詢,創建查詢的所有定位方法也封裝到業務層,這就是個企業查詢的實現,也是用例設計中最主要的環節。

整個工程基于 selenium,采用 pageObject 模式搭建。下面對工程中的幾個重要模塊做介紹。

3.1.1 driver — 接口層

對 web 頁面所有元素的操作都是在driver定義接口并實現的。driver 對 selenium 提供的接口做了二次封裝,對外提供封裝后的接口。pageObject 實現了一些公共方法,比如給輸入框賦值等,目前 pageObject封裝的方法不多,大多功能都可以通過 selenium 實現。driver 層對開源工具接口做了二次封裝,想要驅動一個瀏覽器還有一個必不可少的工具 —— 瀏覽器驅動,這個驅動放在 Referenced Libraries 里,驅動的版本必須與被測瀏覽器版本相匹配。

3.1.2 model — 數據模型

創建數據模型為了實現測試數據和測試用例分離而采取的一種方法,具體的測試數據初始化。可以對一個業務流程中需要測試數據的元素在一個 model 中定義出來,方便管理和代碼閱讀。

3.1.3 pageObject — 業務層

pageObject 模式,采用接口形式封裝每一個頁面需要用到的元素,實現封裝只要做兩步:

  • 確定元素的定位方式;
  • 調用 driver 中對應的操作接口。

driver 的接口實現包含了一定的容錯能力,但并不是全面的,部分頁面或者組件具有獨特性,單純調用 driver 的接口并不能保證測試用例的穩定性,此時就需要在 pageObject 的接口實現中加入一些容錯算法,確保用例穩定性。

3.1.4 service — 提供業務功能

一個業務流程很多時候依賴其他業務模塊功能,為了方便設計一個測試用例,也為了避免重復造輪子,service 層就提供了一些常用的業務功能,比如登入、企業查詢等。依賴方只需要在 service 層調用即可。

3.2 功能優化

對selenium 做二次封裝的同時也對接口做了優化,框架的初衷是使UI 用例的設計盡可能的易設計、易讀、易維護。

3.2.1 接口優化

直接調用 selenium 的接口經常會遇到些令人頭疼的問題,比如網絡問題使頁面 loading 太慢,需要操作的元素還沒展示出來,這種情況就會經常報元素找不到的 error,導致用例執行失敗,但實際上這種報錯并不是一個 bug,其測試結果是無效的。為了減少誤報率 driver 層接口設計了等待元素加載的功能,使用的關鍵方法:cf.searchForElementVisibleXpath(TestStartQuitwd.wd, "//*[text()='運營平臺登錄']", id, 200, 100L)。參考代碼:

在 click、input 等操作接口中加入循環查找的判斷可最大限度的等待一個元素的加載從而提高測試用例的穩定性。

3.2.2 元素定位統一入口

接觸過 UI 自動化用例設計的測試人員會比較清楚,想通過 selenium 操作一個元素,其中必不可少的就是對元素定位的描述,通俗的講就是要通知接口在當前頁面操作哪個位置上的元素。定位一個元素的方法很多,常用的有 id,name,css,xpath 等,對應不同的定位方法selenium 在處理上也給出了不同接口,這從維護角度上來考慮顯然不是最好的。最好的做法就是用例設計者只管元素定位和操作事件的調用,而事件在實現上走了哪種渠道最好是無感知,無需維護的。對此框架封裝了一個方法供 driver 調用,主要功能就是解析描述元素的字符串自動判斷是 id、css 還是 xpath。

3.3 元素定位

UI自動化用例其實可以分成兩部分:定位元素;調用接口操作該元素。其中定位一個元素的方法很多,常用的有 id,name,css,xpath。實際設計中選擇哪種定位方法一般會在維護角度上考慮的會多一些,因為現在的服務器性能配置等都很優秀,所以跑一個WEB-UI用例可以不用考慮性能問題。從維護成本上考慮會優先選擇 id、name,其次 css,最后用 xpath。

我們不能保證每一個 web 系統的所有元素都能提供一個唯一 id 或 name,當然如果能和前端開發達成合作,這就是一件很美好的事情了。一般情況下我們都需要面對沒有 id 和 name 這兩個屬性的情況。這時我們就可以使用 css 樣式,很多時候 css 樣式是能滿足我們的定位需求。當然在這些都不提供給我們的情況下就只能選擇 xpath,使用 xpath 的優點:

  • 易獲取,主流瀏覽器只要打開“查看”就可以通過 copy 輕松獲取到;
  • 頁面上的元素都可以用 xpath 來描述;缺點,不穩定,大量使用會給用例維護產生很大的負擔。

xpath 一般只要前端在頁面上做一下小調整,用例就必須重新維護,在不得不使用 xpath 的情況下,為了減少今后的維護量,可對 xpath 做一些優化,可以減少 xpath 的路徑長度提高穩定性。以下是實踐過程中最長用到的幾種類型:

  • 依靠自己的屬性文本定位,如 //input[@value=‘XXXXX’]
  • 包含指示性字符,如 //input[contains(text(),’指示性字符’)]
  • 巧妙使用content,如 //*[@id=‘app-container']

四、常見報錯

使用過程中經常會遇到問題,這里做下總結方便 debug。

  • 某些頁面彈窗,有時候定位不到彈窗元素。理論上 selenium 在一個頁面中查找一個元素是可以定位到,但有些時候出現彈窗,此時就需要在重新定位彈窗。解決方法:

  • 有些輸入框不能被 input 接口正常操作。實踐過程中在日歷控件中遇到過,元素定位什么的都對,但就是不能正常被操作。解決方法:判斷元素是否是select類型,之后再賦值。解決代碼:

3.發現 selenium 的某些接口不能 work 了,此時最大的可能就是瀏覽器升級了。解決方法:重新下載低版本瀏覽器。

4.元素不可見。有一種元素能在頁面上正常展示,但對于工具來說它是不可見的,這是因為在一般情況下,元素可見需要滿足以下幾個條件:visibility!=hidden ; display!=none; opacity!=0; height、width都大于0;對于 input 標簽,沒有 hidden 屬性。如截圖就是只讀的實例。

解決方法:調用接口 TestStartQuitwd.js.executeScript("var txtN = document.getElementsByName("timeRange"); txtN[0].readOnly = false;");?

五、結束語

UI自動化是在開源工具的基礎上做了些優化,在 driver 層,數據層、業務層以及用例層的解決方案還有很大的提升空間。WEB-UI自動化還不完美,后期還需繼續努力。感謝一直以來支持研究的小伙伴。

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

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

相關文章

面試實戰,問題六,被問數據庫索引,怎么回答

Java開發面試:數據庫索引的原理及常見問題解答 在Java開發面試中,數據庫索引是核心知識點,涉及數據庫優化和性能調優。索引通過高效的數據結構加速數據檢索,降低磁盤IO成本,并支持排序操作。下面我將逐步解釋索引的原理…

ARM-I2C硬實現

硬件I2C-GD32F4系列的實現初始化操作在初始化函數里執行以下代碼uint32_t i2cx_scl_port_rcu RCU_GPIOB; uint32_t i2cx_scl_port GPIOB; uint32_t i2cx_scl_pin GPIO_PIN_6; uint32_t i2cx_scl_af GPIO_AF_4;uint32_t i2cx_sda_port_rcu RCU_GPIOB; uint32_t i2cx_sda_po…

WinUI3開發_過渡動畫

簡介 過渡動畫是當發生事件時控件UI狀態發生改變時以一種動畫形式來演變到另外一種狀態,而非瞬間改變,使用一種更加平滑的方式來進行切換,例如下圖是文字切換的交叉柵欄效果:還有頁面切換動畫:在或者是圖標動畫&#x…

Linux下提權root權限

現在AI工具這么豐富,稍微搜一下就有一個差不多的總結輸出。但是,可能還不夠詳細,或者給得太多~~~今天時間關系,今天只總結了在Linux如何提權到root,并沒有寫如何進行防護。后面有時間,我再總結一下。命令實…

焊接機器人節能先鋒

汽車制造業中,機器人技術的應用已成為推動工業自動化和生產效率提升的重要力量。機器人在焊接、組裝、涂裝等關鍵制造環節中扮演著不可或缺的角色。隨著工業生產規模的不斷擴大,能源消耗和成本控制成為了企業必須面對的重大挑戰。尤其是工業焊接用氣的大…

MinIO:云原生對象存儲的終極指南

MinIO 是什么? MinIO 是一款高性能、云原生的對象存儲服務,具有以下優勢: 輕量級部署:采用 Go 語言編寫,資源占用低,支持快速部署 兼容性強:完全兼容 Amazon S3 API,輕松對接現有應用 高可用架構:支持分布式部署,確保數據持久性和服務可用性 高性能表現:專為云環境…

Spring AOP `MethodInvocation` 工作原理

?? 一、通知到 MethodInterceptor 的轉換機制 Spring AOP 通過適配器模式將開發者定義的注解型通知(如 Before)統一轉換為 MethodInterceptor 接口實現,確保所有通知類型能接入同一調用鏈。以下是轉換細節: 1. 適配器實現原理 核…

PPO原論文閱讀

一、Introduction1.目前存在的問題:(deep)Q-learning:在一些簡單問題上表現不佳,可理解性差基礎的policy gradient算法:(如REINFORCE)魯棒性差,需要大量數據TRPO:復雜,在包含噪音&am…

零基礎也能創作專屬歌曲:文心一言+蘑兔AI協同教程

在AI技術飛速發展的今天,音樂創作已不再是專業音樂人的專屬領域。通過文心一言與蘑兔AI的協同使用,即使沒有音樂基礎,也能輕松完成從歌詞創作到作曲編曲的全流程。本文將詳細拆解操作步驟,助你快速上手,實現音樂創作夢…

圖論:搜索問題

提到圖論中的搜索問題,首先想到的也就是DFS和BFS了,而提到這兩種搜索,那么最典型的題目就是島嶼問題了,下面就練習幾道相關的題目,為之后的更深奧的圖論學習打下基礎! 孤島的總面積 題目鏈接:…

AI驅動攻防升級,API安全走到關鍵檔口

在數字化轉型與AI技術快速發展的雙重驅動下,API已成為企業業務與外部世界連接的神經中樞。然而,隨著API的深度應用,針對API的攻擊規模與復雜性也在持續升級。 API為何頻頻成為黑客重點盯防的突破口?企業常見的API防護手段是否還能…

網絡基礎DAY18-動態路由協議基礎

動態路由協議基礎知識回顧:1.什么是路由? 答:是三層設備轉發IP報文的路徑信息。 2.路由有哪些來源? 答:1.直連路由2.靜態路由3.動態路由 3.有直連路由的條件? 答:1.二層和三層物理接口狀態為UP …

axios統一封裝規范管理

新建/api/ 1.新建統一處理文件/api/axios.ts import axios from "axios"const http axios.create({baseURL: import.meta.env.VITE_API_BASE_URL, // 從環境變量讀取timeout: 10000, });// 請求攔截器(如添加 Token) http.interceptors.reque…

Java學習第七十四部分——Elasticsearch(ES)

目錄 一、前言提要 二、核心特性 三、應用場景 四、主要優勢 五、集成方式 六、基礎操作 七、高級特性 八、概念類比——與關系型數據庫 九、簡單示例——實現存儲與搜索 十、生態集成——基于Spring Data Elasticsearch 十一、性能優化建議 十二、總結歸納概述 一…

TDengine 轉化函數 TO_UNIXTIMESTAMP 用戶手冊

TDengine TO_UNIXTIMESTAMP 函數用戶使用手冊 函數概述 TO_UNIXTIMESTAMP 是 TDengine 中的標量函數,用于將符合 ISO8601/RFC3339 標準的日期時間字符串轉換為 Unix 時間戳。與 TO_TIMESTAMP 不同,該函數專門處理標準格式的時間字符串,無需指…

Java 中的排序算法詳解

目錄 一、冒泡排序(Bubble Sort) 原理? 二、選擇排序(Selection Sort) 原理? 三、插入排序(Insertion Sort) 原理? 四、快速排序(Quick Sort) 原理? 五、歸并排序&…

Gitee如何成為國內企業DevOps轉型的首選平臺?

Gitee如何成為國內企業DevOps轉型的首選平臺? 在數字化轉型浪潮中,DevOps已成為提升企業研發效能的關鍵引擎。作為國內領先的代碼托管與協作平臺,Gitee憑借本土化優勢與全流程支持能力,正成為越來越多企業DevOps實踐的核心載體。本…

?Excel——SUMPRODUCT 函數

SUMPRODUCT 是 Excel 中最強大的函數之一,可以用于 ?多條件求和、加權計算、數組運算? 等復雜場景。下面通過 ?基礎語法 實用案例? 徹底講透它的用法!?一、基礎語法?SUMPRODUCT(數組1, [數組2], [數組3], ...)?功能?:將多個數組的對…

告別虛函數性能焦慮:深入剖析C++多態的現代設計模式

?? 引言:當多態遇上性能瓶頸 我經常被問到這樣一個問題:“既然virtual函數這么方便,為什么在一些高性能場景下,大家卻避之不及?” 答案很簡單:性能。 在我參與的多個HPC項目和游戲引擎開發中,virtual函數調用往往成為性能分析工具中最顯眼的那個紅點。一個看似無害…

k8s-MongoDB 副本集部署

前提準備一套 k8s 集群worker 節點上的 /nfs/data 目錄掛載到磁盤一、NFS 高可用方案(NFSkeepalivedSersync)本方案 NFS 的高可用方案,應用服務器為 Client ,兩臺文件服務器分別 Master 和 Slave,使用 keepalived 生成…