自動(dòng)化腳本初寫之際一定是只求完成功能測(cè)試,頁(yè)面by.id卦停、by.name、by.xpath滿篇飛恼蓬。業(yè)務(wù)邏輯代碼重復(fù)率也是越來(lái)越高惊完。慢慢的寫著寫著開始重構(gòu),開始封裝一些方法处硬。代碼量好一些的人會(huì)在代碼開始寫之前開始預(yù)留一些接口來(lái)處理可以預(yù)見的一些功能擴(kuò)展小槐。當(dāng)代碼封裝好咯,會(huì)發(fā)現(xiàn)頁(yè)面元素和頁(yè)面邏輯是雜糅在一起頁(yè)面更改一個(gè)按鈕就要去代碼里面找到按鈕做相應(yīng)的更改荷辕。那么能不能把頁(yè)面元素和頁(yè)面邏輯分離開來(lái)凿跳。當(dāng)頁(yè)面更改我就只改page類。邏輯更改就只改logic類疮方。那么久引出了這篇文章的主題:Page-Object設(shè)計(jì)模式
我把我以前寫的功能代碼翻譯成Page-Object模式用了大概一個(gè)星期控嗜。有兩點(diǎn)寫在前面希望對(duì)后來(lái)者有多幫助
1、 page類元素可以是webelement或者By類型
使用方式是:
@FindBy(id=“kw”)
WebElement baiduinput骡显;
By baidubtn=By.id(“su”);
2疆栏、 page類一定要提前初始化不然會(huì)報(bào)錯(cuò):不能初始化page類
初始化page類不能放在junit的setup()方法、TestNG的beforemorth()
我是放在每個(gè)case里面的
我的Page-Object模式是三個(gè)沒用接口的主要類蟆盐,test類承边、page類、logic類石挂〔┲看名字就知道每個(gè)類分別放的是什么代碼,下面貼一下代碼
Page類:
//重置查詢
@FindBy(id="aReset" )
WebElement aReset;
//查找人員
By serachpsnradio=By.cssSelector("div#divSelSearchType span");
//查找單位
By serachunitradio=By.cssSelector("div#divSelSearchType span");
//查看保存的查詢
@FindBy(id="aViewSaved" )
WebElement seesaveconditions;
//查詢指標(biāo)彈框
@FindBy(id="dlgSelectItem" )
WebElement searchdlg;
//開始查詢
@FindBy(id="btnSearch" )
WebElement startsearch;
//保存條件
@FindBy(id="btnSave" )
WebElement saveconditions;
//保存條件彈框input
@FindBy(id="txtConditionName" )
WebElement saveconditiondlginput;
//添加查詢條件 +
@FindBy(id="liAddSearch" )
WebElement addconditions;
//添加查詢條件 imggroup
By addconditiondlgitemgroup=By.cssSelector("div#dlgSelectItem div#tree_selectItem.tv div.tv-tn span");
//添加查詢條件 imggroup
By addconditiondlgimggroup=By.cssSelector("div#dlgSelectItem div#tree_selectItem.tv div.tv-tn img");
//添加查詢條件 itemnamespangroup
By addconditiondlgresultnamespangroup=By.cssSelector("div.tv-chi div.tv-tn span");
//添加查詢條件 勾選第二個(gè)復(fù)選框
By addconditionsitemresult=By.cssSelector("div.spanCode span#lic_0.codeDiv span input");
Logic類:
static AdvanceSearchPageWebElement pagetemp=PageFactory.initElements(ReturnDriver.driver,AdvanceSearchPageWebElement.class);
static BaseFunLib basefunlib=new BaseFunLib();
/*
* 函數(shù)功能:用戶選擇是查找人員 還是查找單位的功能函數(shù) 1痹愚、查找人員 2富岳、查找單位
*/
public static void SelectSerachWay(String WayID,String AdvanceUrl) {
ReturnDriver.driver.get(AdvanceUrl);
WebElementList.SureWebElementByAttribute(
pagetemp.serachpsnradio, "maindbtype",
WayID);
}
/*
* 函數(shù)功能:完成查詢條件的配置
*
* 1蛔糯、點(diǎn)擊查找人員 2、點(diǎn)擊添加條件的 “+” 3窖式、點(diǎn)擊查詢指標(biāo)彈出框的 “+” 4蚁飒、點(diǎn)擊性別 5、點(diǎn)擊確定
* 6萝喘、勾選查詢結(jié)果的第二個(gè)input復(fù)選框 比如:勾選性別=女的input
*/
public static void SerachSelect(String AdvanceUrl,String ItemName,String MainName) {
SelectSerachWay("1",AdvanceUrl);
pagetemp.addconditions.click();
doubleclickmainname(pagetemp.addconditiondlgitemgroup,MainName);
WebElementList.SureWebElementByText(
pagetemp.addconditiondlgresultnamespangroup,ItemName);
// 勾選性別=女
basefunlib.ClickSurebtn();
WebElementList.SureWebElementByAttribute(pagetemp.addconditionsitemresult,
"codeitemid", "2");
}
/*
* 函數(shù)功能:保存查詢條件
*
* 1淮逻、調(diào)用函數(shù) SerachSelect 完成查詢條件的配置 2、點(diǎn)擊開始查詢按鈕 3阁簸、點(diǎn)擊保存條件按鈕 4爬早、輸入條件名稱 5、點(diǎn)擊確定
*/
public static void saveserachterm(String serachName,String AdvanceUrl,String ItemName,String MainName) {
SerachSelect(AdvanceUrl,ItemName,MainName);
pagetemp.startsearch.click();
pagetemp.saveconditions.click();
basefunlib.sleep(1);
pagetemp.saveconditiondlginput.sendKeys(
serachName);
basefunlib.ClickSurebtn();
}
//double click
public static void doubleclickmainname(By locate,String mainname) {
List<WebElement> webelementlist = ReturnDriver.driver
.findElements(locate);
for (WebElement webelementID : webelementlist) {
test類:
static BaseFunLib basefunlib=new BaseFunLib();
//@Parameters({ "ProjectID", "ProjectName" })
@BeforeMethod
public void beforeTestMethod() {
ReturnDriver.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
/*
* 1启妹、選擇查找人員 2筛严、點(diǎn)擊主頁(yè)的條件添加 “+”
*
* 驗(yàn)證是否彈出查詢指標(biāo)彈出框
*/
@Test (dataProvider = "AdvanceSerach",dataProviderClass=StaticProvider.class)
public void testserachPSN(String PID,String PName,String UserName,String MainName,String ItemName,String ItemResult,String B01tName) {
AdvanceSearchPageWebElement pagetemp=PageFactory.initElements(ReturnDriver.driver,AdvanceSearchPageWebElement.class);
//初始化用列
loginclass.login(PID,PName,UserName);
GetTestUrlByXmlParameter GetUrlTool=new GetTestUrlByXmlParameter(PID,PName);
String AdvanceUrl=GetUrlTool.GetAdvanceSerachUrl();
AdvanceSearchLogicMethod.SelectSerachWay("1",AdvanceUrl);
pagetemp.addconditions.click();
Assert.assertTrue(pagetemp.searchdlg.getText().contains(MainName));
}
/*
* 1、保存查詢條件 2饶米、點(diǎn)擊 “查看保存的查詢” 3桨啃、刪除剛剛保存的查詢條件 驗(yàn)證彈出框的text是否包含剛剛保存的條件名稱
*/
@Test (dataProvider = "AdvanceSerach",dataProviderClass=StaticProvider.class)
public void testserachBysex(String PID,String PName,String UserName,String MainName,String ItemName,String ItemResult,String B01tName) {
AdvanceSearchPageWebElement pagetemp=PageFactory.initElements(ReturnDriver.driver,AdvanceSearchPageWebElement.class);
//初始化用列
loginclass.login(PID,PName,UserName);
GetTestUrlByXmlParameter GetUrlTool=new GetTestUrlByXmlParameter(PID,PName);
String AdvanceUrl=GetUrlTool.GetAdvanceSerachUrl();
String AdvanceSerachName=ItemName + "=" + ItemResult+ System.currentTimeMillis();
AdvanceSearchLogicMethod.saveserachterm(AdvanceSerachName,AdvanceUrl,ItemName,MainName);
pagetemp.seesaveconditions.click();
Assert.assertTrue(pagetemp.seeconditionsdlg.getText()
.contains(AdvanceSerachName));
basefunlib.Clickdeletelink();
}