基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一個WebUI自動化框架(2)對框架加入業務邏輯層

在上篇中,我們已經搭建好了框架的基本雛形,但只是引入了頁面層、用例層的思想,我們在實際使用中會發現,如果我們很多的用例需要很多前置工作,這些前置工作又有可能涉及到多個頁面,那么我們在維護的時候就會顯得很棘手,舉個例子:用例需要驗證下單支付操作,涉及到的頁面操作可能有登錄頁面、商品列表頁面、商品詳情頁面、商品結算頁面,而我們的用例實際只需要關心下單的業務,這顯然多了很多我們當前用例無需關心的操作,這種情況下,如果我們還是用頁面層、用例層的思想編寫代碼,會顯得非常難維護。此時我們加入業務邏輯層,可以很好地解決這一問題。

下面拿百度舉個簡單例子說明:我們想要測試百度搜索框的時候,每次都想按照時間"最近一月"搜索,按照前面兩層模型(頁面層、用例層)的做法,那么每條用例都需要添加把鼠標移動到"設置按鈕",然后再選擇"高級設置",然后再點擊"時間下拉框",再選擇"最近一月",最后再點擊"高級搜索"的代碼,如下圖:

顯然上面的操作是非常繁瑣的,那么這時候,我們就可以考慮將這些每個用例執行前都必須執行的一系列操作封裝到業務邏輯層,然后我們在用例中只需調用業務邏輯層里的方法就可以完成這一系列的繁瑣操作。

下面,我們對前面的框架添加上一個業務邏輯層,編寫百度頁面的時間選擇操作。

1、由于點擊"高級設置"是需要鼠標懸停在"設置"上才可以點擊的,而鼠標懸停的操作是屬于頁面層的通用操作,在上一篇中頁面層通用操作類BasePage沒有封裝鼠標懸停操作,因此需要在BasePage類添加此操作代碼封裝:

/*** 鼠標聚焦到指定元素的通用方法* @param driver 驅動對象* @param by 元素單位信息* @param elementName 元素名稱*/
public void moveToElement(RemoteWebDriver driver,By by,String elementName){Actions actions=new Actions(driver);actions.moveToElement(waitElementVisible(driver,by)).perform();logger.info("鼠標移動到元素【"+elementName+"】上了");
}

2、在百度頁面類BaiduPage中添加"高級設置"的元素定位信息與元素操作方法:

(1)元素定位信息:

   //設置的標簽
//    private By setSpanBy=By.id("s-usersetting-top");private By setSpanBy=By.xpath("//a[text()='設置']");//高級搜索private By highSearchBy=By.xpath("//a[text()='高級搜索']");//時間選擇下拉框private By timeSelectBy=By.xpath("//span[@id='adv-setting-gpc']//div[@class='c-select-selection']");//最近一天private By recentDayBy=By.xpath("//p[text()='最近一天']");//最近一周private By recentWeekBy=By.xpath("//p[text()='最近一周']");//最近一月private By recentMonthBy=By.xpath("//p[text()='最近一月']");//最近一年private By recentYearBy=By.xpath("//p[text()='最近一年']");//高級搜索確認按鈕private By highSearchSubmitBy=By.xpath("//input[@value='高級搜索']");

(2)元素操作方法:

//封裝鼠標移動到"設置"的方法
public void moveToSet(){moveToElement(driver,setSpanBy,"設置的Span標簽");
}
//封裝點擊"高級搜索"的方法
public void clickHighSearch(){click(driver,highSearchBy,"高級搜索");
}
//封裝點擊"時間選擇下拉框"
public void clickSelectTime(){click(driver,timeSelectBy,"時間選擇下拉框");
}
//封裝點擊"最近一天"
public void clickRecentDay(){click(driver,recentDayBy,"最近一天");
}
//封裝點擊"最近一周"
public void clickRecentWeek(){click(driver,recentWeekBy,"最近一周");
}
//封裝點擊"最近一月"
public void clickRecentMonth(){click(driver,recentMonthBy,"最近一月");
}
//封裝點擊"最近一年"
public void clickRecentYear(){click(driver,recentYearBy,"最近一年");
}
//封裝點擊"高級搜索確認按鈕"
public void clickHighSearchSubmit(){click(driver,highSearchSubmitBy,"高級搜索確認按鈕");
}

3、在業務邏輯層(businesslogic)中添加一個百度搜索流程類BaiduFlow,為了自動化執行效果更明顯點,此處我添加個硬等待1.5秒,觀察選擇時間的動作。

package com.howentech.businesslogic;import com.howentech.page.BaiduPage;
import org.openqa.selenium.remote.RemoteWebDriver;/*** @param* @author rebort* @create 2025/07/08* @return* @description**/
public class BaiduFlow {private RemoteWebDriver driver;public BaiduFlow(RemoteWebDriver driver) {this.driver = driver;}public void selectTime(String time){try {BaiduPage baiduPage=new BaiduPage(driver);baiduPage.moveToSet();//移動到設置按鈕Thread.sleep(1500);baiduPage.clickHighSearch();//點擊高級搜索Thread.sleep(1500);baiduPage.clickSelectTime();//點擊時間選擇下拉框if ("最近一天".equals(time)){baiduPage.clickRecentDay();Thread.sleep(1500);}else if("最近一周".equals(time)){baiduPage.clickRecentWeek();Thread.sleep(1500);}else if("最近一月".equals(time)){baiduPage.clickRecentMonth();Thread.sleep(1500);}else if("最近一年".equals(time)){baiduPage.clickRecentYear();Thread.sleep(1500);}baiduPage.clickHighSearchSubmit();//點擊高級搜索提交按鈕}catch (Exception e){e.printStackTrace();}}
}

4、在測試用例類中使用業務邏輯層的方法,完成時間選擇動作

package com.howentech.testcases;import com.howentech.businesslogic.BaiduFlow;
import com.howentech.common.BaseTest;
import com.howentech.config.GlobalDatas;
import com.howentech.page.BaiduPage;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;/*** @param* @author rebort* @create 2025/07/08* @return* @description**/
public class TestBaidu2 extends BaseTest {@BeforeMethodpublic void setup(){//用例前置//1、打開瀏覽器openBrowser(GlobalDatas.BROWSER_NAME);maxBrowser();//2、進入百度頁面toURL(GlobalDatas.INDEX_URL);}@Testpublic void test_baidu_01(){BaiduPage baiduPage=new BaiduPage(driver);baiduPage.inputData(GlobalDatas.USER_NAME);BaiduFlow baiduFlow=new BaiduFlow(driver);baiduFlow.selectTime("最近一月");}@AfterMethodpublic void teardown(){//用例后置//退出瀏覽器try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}quitBrowser();}
}

至此,我們就完成了業務邏輯層的設計,可以看到,通過這么設計,代碼顯得簡單很多,只需要兩行代碼

BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");

就可以完成高級搜索的時間選擇,后邊如果用例非常多,就可以明顯看到代碼簡潔了許多。

運行效果:

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

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

相關文章

uniapp ruoyi-app 中使用checkbox 無法選中問題

<view class"flex align-center"> <checkbox-group> <label> <checkbox value"cb" checked"true" /> 記住密碼 </label> </checkbox-group> </view>colorui.css 文件中注釋掉兩處即可全局搜索…

如何快速學習GO語言

https://go.dev/tour/welcome/1 這個是官方的引導&#xff0c;很實用基本重點內容都涵蓋了&#xff0c;并且可以一邊學習一邊練習&#xff0c;非常好用 簡單介紹一下&#xff1a; Hello, 世界 歡迎訪問 Go 編程語言教程。 本教程分為幾個模塊&#xff0c;點擊本頁左上角的 …

AI 產品經理必看:神秘技術架構圖如何打通跨團隊溝通壁壘?

? 你好&#xff0c;我是 三橋君 引言 在AI產品的開發過程中&#xff0c;技術架構圖是連接業務需求與技術實現的橋梁。然而&#xff0c;許多AI產品經理常常面臨以下挑戰&#xff1a;研發團隊認為需求描述不清晰&#xff0c;業務團隊與技術團隊溝通不暢&#xff0c;技術選型時…

【科研繪圖系列】R語言繪制解剖圖

文章目錄 介紹加載R包數據下載導入數據數據預處理畫圖系統信息參考介紹 【科研繪圖系列】R語言繪制解剖圖 加載R包 # install.packages("devtools") # library(devtools) # devtools::install_github("jespermaag/gganatogram")library(gganatogram) li…

【unity編輯器開發與拓展EditorGUILayoyt和GUILayoyt】

EditorGUILayout 與 GUILayout 的核心區別及使用場景詳解 一、對比表特性GUILayoutEditorGUILayout命名空間UnityEngineUnityEditor使用場景運行時 UI 編輯器擴展僅限編輯器擴展控件風格基礎游戲風格&#xff08;無編輯器優化&#xff09;原生 Unity 編輯器風格布局復雜度基礎…

【數據結構】8. 二叉樹

文章目錄一、樹的概念及結構1、樹的概念2、樹的相關概念3、樹的表示4、樹的實際運用二、二叉樹的概念及結構1、二叉樹的概念2、特殊的二叉樹3、二叉樹的性質4、二叉樹的存儲結構三、二叉樹的順序結構及實現1、二叉樹的順序結構2、堆的概念及結構3、堆的實現0&#xff09;準備工…

Spring MVC中異常處理

1.全局異常處理1.1什么是全局異常處理器全局異常處理器是SpringMVC框架中的一種異常處理機制&#xff0c;用于統一處理由控制器拋出的異常。全局異常處理器可以幫助我們捕獲和處理控制器中的異常&#xff0c;并且根據不同的異常類型進行不同的處理操作&#xff0c;從而保障應用…

imx6ull-系統移植篇2—— U-Boot 命令使用(上)

目錄 前言 U-Boot 命令 help 信息查詢命令 bdinfo printenv version 環境變量操作命令 setenv 和 saveenv 修改環境變量 新建環境變量 刪除環境變量 內存操作命令 md nm mm mw cp cmp 網絡操作命令 ping 命令 dhcp 命令 nfs 命令 tftp 命令 EMMC 和 S…

vector之動態二維數組的底層

引言&#xff1a;在計算機編程領域&#xff0c;二維動態數組是一種能夠在程序運行期間動態調整其大小的二維數組數據結構。它與靜態二維數組的關鍵區別在于&#xff0c;靜態二維數組在編譯時就需要確定其大小&#xff0c;而二維動態數組的大小可以在程序運行過程中根據實際需求…

第十六天,7月10日,八股

1、mybatis的延遲加載需要時才加載關聯對象&#xff0c;而不是查詢主對象時&#xff0c;立刻加載所有關聯對象&#xff0c;這樣可以提高查詢性能并減少不必要的數據庫訪問&#xff0c;例如&#xff1a;一個訂單表包含著商品列表&#xff08;一對多&#xff09;&#xff0c;當查…

CSS中的Element語法

1.1 Element語法1.1.1 案例 1. 快速生成10個div,并且每個div里面是從1到10的內容2.生成一個div標簽&#xff0c;類名為one,并且同時生成一個id為first的p標簽1.1.2 快速生成CSS樣式語法 CSS基本采取簡寫形式即可 比如w22 按住tab鍵 可以生成 width:200px比如lh26px 按住tab鍵 可…

Go從入門到精通(21) - 一個簡單web項目-添加swagger文檔

Go從入門到精通(20)-一個簡單web項目-服務搭建 文章目錄Go從入門到精通(20)-一個簡單web項目-服務搭建前言前期準備為API 添加 Swagger 文檔1.安裝依賴2.添加 Swagger 注釋main.goapp.goapi.gopublic_handler.goauth_handler.gocommon_constant.gocommon_dto.gotoken_utils.go3…

自動駕駛環境感知:天氣數據采集與融合技術實戰

天氣與我們日常各類生活場景密不可分&#xff0c;在駕駛場景里當車主發動汽車準備駛向目的地時&#xff0c;窗外的陰晴或許只是直觀感受&#xff0c;而真正影響駕駛安全與行程效率的&#xff0c;可能是幾公里外的突發暴雨、橋面的結冰預警&#xff0c;或是前方路段的強側風等級…

基于svga+uniapp的微信小程序動畫組件開發指南

lottie動畫指南 效果 概述 本項目使用 svgaplayer.weapp.js 庫來實現 SVGA 動畫播放功能&#xff0c;支持在微信小程序、H5 等多端環境下播放高質量的矢量動畫。SVGA 是一種跨平臺的開源動畫格式&#xff0c;具有文件小、渲染性能高的特點。 技術棧 核心庫: svgaplayer.wea…

數據結構與算法——計算直線的交點數

前言&#xff1a; 這是之前做的一道筆試題&#xff0c;當時沒寫出來煩惱很久&#xff0c;這次記錄一下。 題目鏈接&#xff1a; Dotcpp--題目 1174: 計算直線的交點數 參考文章&#xff1a; CSDN--槐陽7--計算直線的交點數 題目&#xff1a; 解題思考&#xff1a; 在當時…

大模型及agent開發6 OpenAI Assistant API 高階應用 - 流式輸出功能

1.Assistant API 的主要優點&#xff1a; 減少編碼工作量、自動管理上下文窗口、安全的訪問控制、工具和文檔的輕松集成 本節講應用設計和性能流式輸出&#xff1a;借助流式輸出&#xff0c;可以讓應用程序實時處理和響應用戶輸入。具體來說&#xff0c;這種技術允許數據在生成…

React Native安卓劉海屏適配終極方案:僅需修改 AndroidManifest.xml!

&#x1f4cc; 問題背景在 React Native 開發中&#xff0c;我們經常會遇到安卓設備劉海屏&#xff08;Notch&#xff09;適配問題。即使正確使用了 react-native-safe-area-context 和 react-navigation&#xff0c;在一些安卓設備&#xff08;如小米、華為、OPPO 等&#xff…

Spring Boot整合MyBatis+MySQL實戰指南(Java 1.8 + 單元測試)

一、環境準備 開發工具&#xff1a;IntelliJ IDEA 2023.1 JDK 1.8.0_382 Maven3.6.3數據庫&#xff1a;MySQL 8.0.21依賴版本&#xff1a;<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifact…

游戲開發日記

如何用數據表來儲存&#xff0c;位置坐標&#xff08;XYZ&#xff09;&#xff1a;決定了對象在世界中的擺放資源ID / 圖片URL&#xff1a;決定了使用什么模型或貼圖事件ID / 特效&#xff1a;是否觸發某些事件&#xff08;例如點擊、交互&#xff09;邏輯索引&#xff08;Grid…

如何使用xmind編寫測試用例

如何使用xmind編寫測試用例為什么要使用xmind&#xff1f;使用xmind編寫測試用例是為了梳理我們的思路。使用xmind編寫測試用例的思路是什么&#xff1f;先進行分析再提取測試用例。 例如下面的注冊功能的測試用例的分析&#xff1a; 分析&#xff1a; 先提取出需要測試的功能點…