在上篇中,我們已經搭建好了框架的基本雛形,但只是引入了頁面層、用例層的思想,我們在實際使用中會發現,如果我們很多的用例需要很多前置工作,這些前置工作又有可能涉及到多個頁面,那么我們在維護的時候就會顯得很棘手,舉個例子:用例需要驗證下單支付操作,涉及到的頁面操作可能有登錄頁面、商品列表頁面、商品詳情頁面、商品結算頁面,而我們的用例實際只需要關心下單的業務,這顯然多了很多我們當前用例無需關心的操作,這種情況下,如果我們還是用頁面層、用例層的思想編寫代碼,會顯得非常難維護。此時我們加入業務邏輯層,可以很好地解決這一問題。
下面拿百度舉個簡單例子說明:我們想要測試百度搜索框的時候,每次都想按照時間"最近一月"搜索,按照前面兩層模型(頁面層、用例層)的做法,那么每條用例都需要添加把鼠標移動到"設置按鈕",然后再選擇"高級設置",然后再點擊"時間下拉框",再選擇"最近一月",最后再點擊"高級搜索"的代碼,如下圖:
顯然上面的操作是非常繁瑣的,那么這時候,我們就可以考慮將這些每個用例執行前都必須執行的一系列操作封裝到業務邏輯層,然后我們在用例中只需調用業務邏輯層里的方法就可以完成這一系列的繁瑣操作。
下面,我們對前面的框架添加上一個業務邏輯層,編寫百度頁面的時間選擇操作。
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("最近一月");
就可以完成高級搜索的時間選擇,后邊如果用例非常多,就可以明顯看到代碼簡潔了許多。
運行效果: