WebDriver实战之Page-Object设计模式

自动化脚本初写之际一定是只求完成功能测试,页面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();

    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 一阵冷战开始这次写作。不是我失败才写,是收到各种打击,躲到这个角落,被逼的,因为还总是沉浸在心中的那个理想世界,当...
    夜月神阅读 170评论 0 1
  • 现在,大学生越来越少,学习也越来越苦,我们都开始抱怨读书苦,可是妈妈老给我说这句话:‘‘孩子,不要抱怨读书苦,...
    加油妹妹阅读 256评论 1 1
  • 俗有云:‘民以食为先,食以汤为先’。汤,可以滋润人的身体、可加强身体免疫力补、充营养和水份、令人易於吸收、效果使人...
    井冈工社阅读 379评论 0 0