在上篇博客中,我们已经搭建好了框架的基本雏形,但只是引入了页面层、用例层的思想,我们在实际使用中会发现,如果我们很多的用例需要很多前置工作,这些前置工作又有可能涉及到多个页面,那么我们在维护的时候就会显得很棘手,举个例子:用例需要验证下单支付操作,涉及到的页面操作可能有登录页面、商品列表页面、商品详情页面、商品结算页面,而我们的用例实际只需要关心下单的业务,这显然多了很多我们当前用例无需关心的操作,这种情况下,如果我们还是用页面层、用例层的思想编写代码,会显得非常难维护。此时我们加入业务逻辑层,可以很好地解决这一问题。
下面拿百度举个简单例子说明:我们想要测试百度搜索框的时候,每次都想按照时间"最近一月"搜索,按照前面两层模型(页面层、用例层)的做法,那么每条用例都需要添加把鼠标移动到"设置按钮",然后再选择"高级设置",然后再点击"时间下拉框",再选择"最近一月",最后再点击"高级搜索"的代码,如下图:
显然上面的操作是非常繁琐的,那么这时候,我们就可以考虑将这些每个用例执行前都必须执行的一系列操作封装到业务逻辑层,然后我们在用例中只需调用业务逻辑层里的方法就可以完成这一系列的繁琐操作。
下面,我们对前面的框架添加上一个业务逻辑层,编写百度页面的时间选择操作。
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.lrc.businesslogic;
import com.lrc.page.BaiduPage;
import org.openqa.selenium.remote.RemoteWebDriver;
/**
* @param
* @author lrc
* @create 2021/12/23
* @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.lrc.testcases;
import com.lrc.businesslogic.BaiduFlow;
import com.lrc.common.BaseTest;
import com.lrc.config.GlobalDatas;
import com.lrc.page.BaiduPage;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @param
* @author lrc
* @create 2021/12/23
* @return
* @description
**/
public class TestBaidu2 extends BaseTest {
@BeforeMethod
public void setup(){
//用例前置
//1、打开浏览器
openBrowser(GlobalDatas.BROWSER_NAME);
maxBrowser();
//2、进入百度页面
toURL(GlobalDatas.INDEX_URL);
}
@Test
public void test_baidu_01(){
BaiduPage baiduPage=new BaiduPage(driver);
baiduPage.inputData(GlobalDatas.USER_NAME);
BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");
}
@AfterMethod
public void teardown(){
//用例后置
//退出浏览器
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
quitBrowser();
}
}
至此,我们就完成了业务逻辑层的设计,可以看到,通过这么设计,代码显得简单很多,只需要两行代码
BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");
就可以完成高级搜索的时间选择,后边如果用例非常多,就可以明显看到代码简洁了许多。
运行效果: