WebDriver实战之Page-Object设计模式

简介: 自动化脚本初写之际一定是只求完成功能测试,页面by.id、by.name、by.xpath满篇飞。业务逻辑代码重复率也是越来越高。慢慢的写着写着开始重构,开始封装一些方法。代码量好一些的人会在代码开始写之前开始预留一些接口来处理可以预见的一些功能扩展

自动化脚本初写之际一定是只求完成功能测试,页面by.id、by.name、by.xpath满篇飞。业务逻辑代码重复率也是越来越高。慢慢的写着写着开始重构,开始封装一些方法。代码量好一些的人会在代码开始写之前开始预留一些接口来处理可以预见的一些功能扩展。当代码封装好咯,会发现页面元素和页面逻辑是杂糅在一起页面更改一个按钮就要去代码里面找到按钮做相应的更改。那么能不能把页面元素和页面逻辑分离开来。当页面更改我就只改page类。逻辑更改就只改logic类。那么久引出了这篇文章的主题:Page-Object设计模式
我把我以前写的功能代码翻译成Page-Object模式用了大概一个星期。有两点写在前面希望对后来者有多帮助
1、page类元素可以是webelement或者By类型
使用方式是:@FindBy(id=“kw”)

        WebElement baiduinput;
        By baidubtn=By.id(“su”);

2、page类一定要提前初始化不然会报错:不能初始化page类
初始化page类不能放在junit的setup()方法、TestNG的beforemorth()
我是放在每个case里面的
我的Page-Object模式是三个没用接口的主要类,test类、page类、logic类。看名字就知道每个类分别放的是什么代码,下面贴一下代码
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;

//查询指标弹框
 @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");

//添加查询条件  勾选第二个复选框
 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();
   
/*
 * 函数功能:用户选择是查找人员 还是查找单位的功能函数 1、查找人员 2、查找单位
 */
public static void SelectSerachWay(String WayID,String AdvanceUrl) {
    ReturnDriver.driver.get(AdvanceUrl);
    WebElementList.SureWebElementByAttribute(
            pagetemp.serachpsnradio, "maindbtype",
            WayID);
}

/*
 * 函数功能:完成查询条件的配置
 * 
 * 1、点击查找人员 2、点击添加条件的 “+” 3、点击查询指标弹出框的 “+” 4、点击性别 5、点击确定
 * 6、勾选查询结果的第二个input复选框 比如:勾选性别=女的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");

}
/*
 * 函数功能:保存查询条件
 * 
 * 1、调用函数 SerachSelect 完成查询条件的配置 2、点击开始查询按钮 3、点击保存条件按钮 4、输入条件名称 5、点击确定
 */
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、点击主页的条件添加 “+”
 * 
 * 验证是否弹出查询指标弹出框
 */
@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、点击 “查看保存的查询” 3、删除刚刚保存的查询条件 验证弹出框的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();

}
相关文章
|
1月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
35 2
|
3月前
|
设计模式 数据管理 测试技术
PHP中的设计模式:单一职责原则在实战项目中的应用
在软件开发中,设计模式是解决问题的最佳实践。本文通过分析单一职责原则(SRP),探讨了如何运用这一原则来提升PHP项目的可维护性和扩展性。我们将从实际案例出发,展示单一职责原则在业务逻辑分离、代码解耦和提高测试效率方面的应用。无论是新手还是经验丰富的开发者,都能从中获益,进而编写出更健壮、更灵活的PHP代码。
45 5
|
3月前
|
设计模式 安全 PHP
PHP中的设计模式:单一职责原则在实战中的应用
在软件开发中,设计模式是解决常见问题的成熟方案。本文将通过分析单一职责原则这一设计原则,探讨如何在PHP应用程序中应用这一原则来提高代码的可维护性、扩展性和灵活性。我们将从实际案例出发,展示单一职责原则的具体应用方法,并解释其对项目开发周期和质量的积极影响。无论你是PHP初学者还是经验丰富的开发者,都能从中获益,提升你的编程实践水平。
35 4
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
4月前
|
设计模式 存储 Java
掌握Java设计模式的23种武器(全):深入解析与实战示例
掌握Java设计模式的23种武器(全):深入解析与实战示例
|
4月前
|
前端开发 开发者 开发框架
JSF与Bootstrap,打造梦幻响应式网页!让你的应用跨设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,响应式设计至关重要,以确保不同设备上的良好用户体验。本文探讨了JSF(JavaServer Faces)与Bootstrap框架的结合使用,展示了如何构建响应式网页。JSF是一个基于Java的Web应用框架,提供丰富的UI组件和表单处理功能;而Bootstrap则是一个基于HTML、CSS和JavaScript的前端框架,专注于实现响应式设计。通过结合两者的优势,开发者能够更便捷地创建自适应布局,提升Web应用体验。然而,这种组合也有其局限性,如JSF组件库较小和较高的学习成本等,因此在选择开发框架时需综合考虑具体需求和应用场景。
58 0
|
4月前
|
设计模式 前端开发 开发者
Angular携手Material Design:探索设计模式下的UI组件开发之道——从按钮到对话框的全面实战演示
【8月更文挑战第31天】在现代Web应用开发中,Angular框架结合Material Design设计原则与组件库,显著提升了用户界面的质量与开发效率。本文通过具体代码示例,详细介绍如何在Angular项目中引入并使用Material Design的UI组件,包括按钮、表单和对话框等,帮助开发者快速构建美观且功能强大的应用。通过这种方式,不仅能提高开发效率,还能确保界面设计的一致性和高质量,为用户提供卓越的体验。
34 0
|
6月前
|
设计模式 算法 Java
Java中的设计模式:实战案例分享
Java中的设计模式:实战案例分享
|
6月前
|
设计模式 存储 前端开发
【设计模式】MVC与MVVM详尽解读与实战指南
【设计模式】MVC与MVVM详尽解读与实战指南
1004 0
|
7月前
|
设计模式 Java 数据库连接
JAVA设计模式解析与实战
本文探讨了Java中的常见设计模式,包括单例模式、工厂模式和观察者模式。单例模式确保类只有一个实例,常用于管理资源;工厂模式通过抽象工厂接口创建对象,降低了耦合度;观察者模式实现了一对多的依赖关系,当主题状态改变时,所有观察者都会收到通知。理解并运用这些设计模式能提升代码的复用性、可扩展性和可维护性。