WEB-UI自動化測試實踐

??🔥 交流討論:歡迎加入我們一起學習!

🔥 資源分享耗時200+小時精選的「軟件測試」資料包

🔥?教程推薦:火遍全網的《軟件測試》教程??

📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!

一、設計背景

隨著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自動化還不完美,后期還需繼續努力。感謝一直以來支持研究的小伙伴。

最后我邀請你進入我們的【軟件測試學習交流群:785128166】, 大家可以一起探討交流軟件測試,共同學習軟件測試技術、面試等軟件測試方方面面,還會有免費直播課,收獲更多測試技巧,我們一起進階Python自動化測試/測試開發,走向高薪之路

作為一個軟件測試的過來人,我想盡自己最大的努力,幫助每一個伙伴都能順利找到工作。所以我整理了下面這份資源,現在免費分享給大家,有需要的小伙伴可以關注【公眾號:程序員二黑】自提!

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

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

相關文章

已解決的問題:BIOS中Enter鍵失效_BIOS中回車鍵沒反應

問題: 未解決的問題:BIOS中enter鍵失效_bios回車鍵沒反應-CSDN博客 問題復現: Windows7 關機 開機按F2進入BIOS 調整Boot Mode,按Enter建,Enter鍵失效 按F10,按Enter鍵,Enter鍵失效 按E…

LeetCode59-螺旋矩陣II

參考鏈接&#xff1a;代碼隨想錄->螺旋矩陣II 關鍵是學視頻鏈接里面的編碼思想&#xff0c;然后背下來 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> resvector(n,vector<int>(n,0));int sx0,s…

HTML好玩代碼(正式版)

今天給大家幾個好玩兒的HTML代碼&#xff0c;可以自行修改文字&#xff0c;更改效果&#xff08;一定要看到最后&#xff09;&#xff0c;代碼&#xff0c;&#x1f389;走起&#xff1a; 一、圣誕樹效果&#xff08;音樂可自行選擇&#xff09; 代碼&#xff1a; <!DOCTY…

vite是什么

vite 是什么 vite —— 一個由 vue 作者尤雨溪開發的 web 開發工具 Vite由兩個主要部分組成 dev server&#xff1a;利用瀏覽器的ESM能力來提供源文件&#xff0c;具有豐富的內置功能并具有高效的HMR生產構建&#xff1a;生產環境利用Rollup來構建代碼&#xff0c;提供指令用…

基于情感分析的網上圖書推薦系統

項目&#xff1a;基于情感分析的網上圖書推薦系統 摘 要 基于網絡爬蟲的數據可視化服務系統是一種能自動從網絡上收集信息的工具&#xff0c;可根據用戶的需求定向采集特定數據信息的工具&#xff0c;本項目通過研究爬取網上商品評論信息實現商品評論的情感分析系統功能。對于…

嵌入式學習25-復習指針要點

1指針 1.1語法&#xff1a; 【基類型*指針變量名】 【int *p&a】 1 2 1.2語義&#xff1a; 【基類型】&#xff1a;指針變量指向的目標的數據類型 【*】&#xff1a;表示此時定義的變量是一個指針類型的變量 【&a】&#xff1a;一塊存放著int類型數據的空間的地址 【*p…

Flutter開發LongPressDraggable、Draggable 的onDragEnd沒有被調用

文章目錄 onDragEnd 什么時候執行&#xff1f;onDragEnd 在拖動結束時沒有被調用的可能原因 onDragEnd 什么時候執行&#xff1f; onDragEnd 回調函數在拖動結束時執行&#xff0c;但要注意&#xff0c;拖動結束有多種情況&#xff0c;不僅僅是松開手指觸發的。 onDragEnd 會…

【國產MCU】-CH32V307-通用定時器(GPTM)-單脈沖模式

通用定時器(GPTM)-單脈沖模式 文章目錄 通用定時器(GPTM)-單脈沖模式1、單脈沖模式介紹2、驅動API介紹3、單脈沖使用實例本文將詳細介紹如何使用CH32V307通用定時器的單脈沖模式。 1、單脈沖模式介紹 單脈沖模式可以響應一個特定的事件,在一個延遲之后產生一個脈沖,延遲…

Seata 的 AT 模式

目錄 概述 Springcloud 整合 Seata 數據庫腳本 服務依賴 Springboot 配置 代碼改造 AT模式下的數據隔離 寫隔離 讀隔離 概述 Seata 的 AT 模式是 Seata 的默認模式&#xff0c;它的原理是依賴于數據庫事務&#xff0c;以數據庫事務保證本地事務分支特性&#xff0c;結合…

windows系統用VS環境開發linux程序之一

主要有兩種方法&#xff0c;一種是在windows中安裝linux子系統&#xff0c;即WSL&#xff0c;另一種是windows系統裝linux虛擬機。 這里先用虛擬機方法。參考文章&#xff1a; 用VS2015開發Linux程序詳細教程-配置篇_vs2015可以在linux安裝嗎-CSDN博客 這篇基本就夠了。不過…

nginx之web性能location優先級

4.2 event事件 events {worker_connections 65536; #設置單個工作進程的最大并發連接數use epoll;#使用epoll事件驅動&#xff0c;Nginx支持眾多的事件驅動&#xff0c;比如:select、poll、epoll&#xff0c;只能設置在events模塊中設置。accept_mutex on; #on為同一時刻一個…

設計模式之委派模式

文章目錄 前言正文一、生活中的例子二、Java代碼實現2.1 類設計2.2 代碼實現2.2.1 Employee2.2.2 ArchitectureDesignEmployer2.2.3 BackEmployer2.2.4 FrontEmployer2.2.5 Leader2.2.6 EmployeeStrongPointEnum2.2.7 Boss 2.3 測試2.3.1 Client2.3.2 測試結果 三、委派模式的優…

Docker Desktop 4.27.1 Windows 10 安裝 教程

Docker Desktop 4.27.1 Windows 10 安裝 版本要求windows 版本要求wsl 版本要求docker desktop 版本 安裝首先確保系統版本符合要求前提下安裝wsl安裝 Dockers Desktop安裝說明 安裝問題docker Desktop 無法正常啟動&#xff0c;提示wsl 相關信息wsl --install 執行輸出幫助日志…

Python 程序中查看 Python version

Python 程序中查看 Python version 1. Code2. OutputReferences 1. Code #!/usr/bin/env python3 # -*- coding:utf-8 -*-import platform import sysprint("\nplatform.python_version():") print(platform.python_version())print("\nsys.version:") pr…

springboot大學生體質測試管理系統源碼和論文

大學生體質測試管理系統提供給用戶一個簡單方便體質測試管理信息&#xff0c;通過留言區互動更方便。本系統采用了B/S體系的結構&#xff0c;使用了java技術以及MYSQL作為后臺數據庫進行開發。系統主要分為系統管理員、教師和用戶三個部分&#xff0c;系統管理員主要功能包括首…

圖像分類入門:使用Python和Keras實現卷積神經網絡

文章標題&#xff1a;圖像分類入門&#xff1a;使用Python和Keras實現卷積神經網絡 簡介 圖像分類是計算機視覺領域的一個重要任務&#xff0c;它涉及將圖像分成不同的類別或標簽。卷積神經網絡&#xff08;CNN&#xff09;是圖像分類任務中的一種常用模型&#xff0c;它能夠…

rust實戰系列十四:復合數據類型

復合數據類型可以在其他類型的基礎上形成更復雜的組合關系。 本章介紹tuple、struct、enum等幾種復合數據類型。數組留到第6章介紹。 2.3.1 tuple tuple指的是“元組”類型&#xff0c;它通過圓括號包含一組表達式構成。tuple內的元素沒 有名字。tuple是把幾個類型組合到一起的…

第三十九天| 62.不同路徑、63. 不同路徑 II

Leetcode 62.不同路徑 題目鏈接&#xff1a;62 不同路徑 題干&#xff1a;一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “…

c#之列表

// List<int> scoreList new List<int>();//創建空列表var scoreListnew List<int>();//匿名方式創建scoreList.Add(912);//插入數據scoreList.Add(45);scoreList.Add(415);scoreList.Add(452);scoreList.Add(4451);scoreList.Add(245);scoreList.Add(445);…

十六、多邊形填充和繪制

項目功能實現&#xff1a;對多邊形進行輪廓繪制和填充 按照之前的博文結構來&#xff0c;這里就不在贅述了 一、頭文件 mult-drawing.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class Mult_Drawing { public:void mult_drawing(); };#pragma onc…