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();
}
Page-Object设计模式的更多相关文章
- Page Object设计模式实践
Page Object模式是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织. Page Object模式,创建一个对 ...
- selenium+Python(Page Object 设计模式实例)
以下实例演示了采用了page Object设计模式的方式登录qq空间: 1.创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(ti ...
- Page Object 设计模式介绍
Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案 ...
- Python+selenium之Page Object设计模式
Page Object是selenium自动化测试项目开发实践的最佳设计模式之一,他主要提现在对界面交互细节的封装,这样可以使测试案例隔你给加关注于业务而非界面细节,从而提高测试案例的可读性. Pag ...
- Selenium+java - Page Object设计模式
前言 Page Object(页面对象)模式,是Selenium实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一.在设计测试时,把页面元素定位和元素操作方法按照页面抽象出来,分离成一 ...
- Selenium(十九):unittest单元测试框架(五) Page Object设计模式
1. Page Object设计模式 Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试方案更关注于业务而非界面细节.从 ...
- web端自动化——selenium Page Object设计模式
Page Object设计模式的优点如下: ① 减少代码的重复. ② 提高测试用例的可读性. ③ 提高测试用例的可维护性,特别是针对UI频繁变化的项目. 当为Web页面编写测试时,需 ...
- Selenium 2自动化测试实战39(Page Object设计模式)
Page Object设计模式 Page object是selenium自动化测试项目开发时间的最佳设计模式之一,主要体现在对界面交互细节的封装. 1.认识page object优点如下:1.减少代码 ...
- 18、Page Object 设计模式
Page Object 设计模式的优点如下: 减少代码的重复. 提高测试用例的可读性. 提高测试用例的可维护性, 特别是针对 UI 频繁变化的项目. 当你针对网页编写测试时,你需要引用该网页中的元素, ...
- Page Object设计模式(一)
一.简介 主要特点体现在“对界面交互细节的封装”上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性.解决UI变动问题. page对象的一个基本原则经验法则是:凡是人能做的事,page对象通过 ...
随机推荐
- mybatis入门-动态sql
什么是动态sql 判断的动态sql mybatis核心就是对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 现有需求如下:需要查询用户,输入的是用户类,如果用户的性别类不为空 ...
- Jquery 文字上下滚动效果示例代码
<!doctype html> <html> <head> <meta charset="utf-8"> ...
- LVS的十种调度算法
LVS十种调度算法 1.静态调度: ①rr(Round Robin):轮询调度,轮叫调度 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重 ...
- web前端学习路线推荐(讲的很细致)
前端要学习三个部分:HTML,CSS,JavaScript(简称JS),因此首先明确三个概念:HTML是内容层,它的目的是表示一个HTML标签在页面里是个什么角色. CSS是样式层,它的目的是表示一块 ...
- 【CNMP系列】CentOS7.0下安装MySql5.6服务
接上一回的话,CentOS7.0下安装好了Nginx服务,对于我们的CNMP,我们可以开始我们的M啦,就是传统意义上的MySql服务 MySql简介 MySQL是一个关系型数据库管理系统,由瑞典MyS ...
- PHP字符串三种定义方式
PHP的字符串有三种定义方式:单引号 .双引号 .定界符 1.单引号:指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来. 在被单引号括起来的字符串中,要再表示一个单引号,需要用反斜线(\ ...
- 屏幕适配基础——了解:ppi、dpi、px、sp、dp
做android开发绕不开的几个名词:ppi.dpi.px.sp.dp.那么它们的定义.区别和联系都是什么呢?这篇博客系统的做一个概述和总结. 1.基本概念 px:pixel,像素,电子屏幕上组成一幅 ...
- 【新建项目&使用viewPager】实现一个Android电子书阅读APP
本章结尾处已放出应用DEMO,已经实现所有本文及后续文章所述全部功能,大家可以先下载下来玩玩看,欢迎在本文下方评论,小方很需要鼓励支持!!! 新建一个项目 呼-我们即将步入安卓开发之旅了,首先要新建一 ...
- 【2017-02-24】循环嵌套、跳转语句、异常语句、迭代穷举、while
一.循环嵌套 1.格式 for() { for() { } } 2.执行顺序 先执行外边循环进到循环体发现里面的循环,开始执行里面的循环.等到里面的循环执行完毕,再执行外边的循环. 在外面循环第一次, ...
- js相关小实例——div实现下拉菜单
代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...