自动化中的PageObject思想
谈着这个话题很大,因为我自己在自动化分层的方面做的就不是很好,最近在做java+selenium中,如果不分层去管理,代码就显得很乱,如下:
下面代码主要是做了一个登录,登录后在修改自己的一些个人信息,第一次就把最通用的查找控件的方法,写在一个方法里面,所以能看到这样的方式“getmethod.getXpath“取控件。而且登陆这个方法在另外一个方法中也要使用。这里很重复
这个代码第一眼就给人感觉很乱,而且所有内容和执行的操作,都放在一个页面中,太乱了。那我如何整理这样的代码
public class Register {
static WebDriver driver=null;
SeekMethod getmethod=new SeekMethod();
public String filePath = "E:\\senlenium\\Date.txt";
//Basetest testdriver=new Basetest();
@Before
public void StartDriver() { System.out.println("srart selenium");
driver=new ChromeDriver();
driver.get("http://www.91testing.net");
} public void Login(String name,String password) throws InterruptedException{
driver.findElement(By.linkText("登录")).click();
System.out.printf("url of current page is %s\n", driver.getCurrentUrl());
getmethod.getId("login_username",driver).clear();
((JavascriptExecutor)driver).executeScript("document.getElementById('login_username').value='"+name+"';");
driver.findElement(By.name("_password")).clear();
((JavascriptExecutor)driver).executeScript("document.getElementById('login_password').value='"+password+"';");
Thread.sleep(300);
driver.findElement(By.cssSelector("button[type='submit']")).click();
} @Test
public void TestLogin(){
try {
Login("xiaozhang","xiaozhang");
String loginassert=getmethod.getXpath(("//li[@class='visible-lg']"),driver).getText();
System.out.print(loginassert);
Assert.assertEquals("我的学习",loginassert);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
解决方法:我把他分为3个类,拿登陆举例
第一个类:定义页面上所有的元素,我取名为LoginElment
package com.Method;
public class LoginElment {
/*
* 只是定义界面的元素
*/
public static String name="login_username";
public static String passWord="_password";
public static String LoginBtn="button[type='submit']";
}
第二个类:定义所有控件的操作。如查找到控件,对他进行单击,双击,填入,因为我的登录在很多地方要使用,所以我使用了单例模式
package com.Method; import org.openqa.selenium.WebDriver; public class LoginBusiness {
/*
* 主要实现控件的方法
* 如查找到控件
*/
/*
* 单例模式
*/
private static LoginBusiness loginbusiness=null;
public static LoginBusiness getInstance(){
if(loginbusiness==null){
loginbusiness=new LoginBusiness();
}
return loginbusiness;
}
public void LoinTab(){
SeekMethod.getLink("登录", BaseTest.driver).click();
}
public void inputUserName(String name){ SeekMethod.getId((LoginElment.name),BaseTest.driver).sendKeys(name);
}
public void inputPassword(String word){ SeekMethod.getName((LoginElment.passWord), BaseTest.driver).sendKeys(word);
}
public void clickButton(WebDriver driver){
SeekMethod.getcssSelector(LoginElment.LoginBtn, BaseTest.driver).click();
}
//做断言使用
public String getmethod(){
String loginassert=SeekMethod.getXpath(("//li[@class='visible-lg']"),BaseTest.driver).getText(); return loginassert;
} public void login(String userName,String pw){
SeekMethod.getLink("登录", BaseTest.driver).click();
//driver.findElement(By.linkText("登录")).click();
inputUserName(userName);
inputPassword(pw);
clickButton(BaseTest.driver); }
}
第三个类:实现登录的方法。界面上的自动化就如同手工操作一样,每次执行就是一个操作,如下
public class Login extends BaseTest {
WebDriver Driver;
LoginBusiness loginbusiness;
@BeforeClass
public void setUp(){
loginbusiness=loginbusiness.getInstance();
}
//我这里使用了testng的参数化,下面是两个参数
@Test
@Parameters({"logname","password"})
public void testLogin(String logname,String password){
//第一步:打开登录界面
loginbusiness.LoinTab();
//第二步:输入用户名
loginbusiness.inputUserName(logname);
//第三步:输入密码
loginbusiness.inputPassword(password);
//第四步:点击登录
loginbusiness.clickButton(Driver);
//断言
Assert.assertEquals("我的学习",loginbusiness.getmethod());
}
}
是不是看着很像功能测试一样,一步一步的执行,就这样我的login页面的脚本就算完成了,看了后,其他人员也能够一目了然,心情顿时就美丽了
自动化中的PageObject思想的更多相关文章
- 说说UI自动化中的PO模式
PO模式,全称PageObject模式,即页面对象模式.将页面定位与业务操作分离. po模式有以下几个优点: 1.易读性好 2.扩展性高 3.复用性强 4.维护性好 5.代码冗余率低 了解了po模式及 ...
- 工作流引擎在vivo营销自动化中的应用实践 | 引擎篇03
作者:vivo 互联网服务器团队- Cheng Wangrong 本文是<vivo营销自动化技术解密>的第4篇文章,分析了在营销自动化业务引入工作流技术的背景和工作流引擎的介绍,同时介绍了 ...
- Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析
加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景 在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链 ...
- Selenium2学习-036-WebUI自动化实战实例-034-JavaScript 在 Selenium 自动化中的应用实例之六(获取 JS 执行结果返回值)
Selenium 获取 JavaScript 返回值非常简单,只需要在 js 脚本中将需要返回的数据 return 就可以,然后通过方法返回 js 的执行结果,方法源码如下所示: /** * Get ...
- Selenium2学习-032-WebUI自动化实战实例-030-JavaScript 在 Selenium 自动化中的应用实例之五(高亮标示元素)
在自动化脚本编写过程中,操作元素之前,需要对元素进行高亮显示(通过修改元素的边框样式),同时进行截图,以记录操作的元素对象.在实际应用中较为少见,通常用于演示,或者发生错误时的屏幕截图捕捉,用于错误报 ...
- Selenium2学习-031-WebUI自动化实战实例-029-JavaScript 在 Selenium 自动化中的应用实例之四(获取元素位置和大小)
通过 JS 或 JQuery 获取到元素后,通过 offsetLeft.offsetTop.offsetWidth.offsetHeight 即可获得元素的位置和大小,非常的简单,直接上源码了,敬请参 ...
- Selenium2学习-027-WebUI自动化实战实例-025-JavaScript 在 Selenium 自动化中的应用实例之三(页面滚屏,模拟鼠标拖动滚动条)
日常的 Web UI 自动化测试过程中,get 或 navigate 到指定的页面后,若想截图的元素或者指定区域范围不在浏览器的显示区域内,则通过截屏则无法获取相应的信息,反而浪费了无畏的图片服务器资 ...
- Selenium2学习-022-WebUI自动化实战实例-020-JavaScript 在 Selenium 自动化中的应用实例之二(获取浏览器显示区域大小)
前几篇文章中简略概述了,如何获取.设置浏览器窗口大小,那么我们该如何获取浏览器显示区域的大小呢?此文讲对此进行简略概述,敬请各位小主参阅.若有不足之处,敬请各位大神指正,不胜感激! 获取浏览器显示区域 ...
- Selenium2学习-011-WebUI自动化实战实例-009-JavaScript 在 Selenium 自动化中的应用实例之一(赋值)
通常在编写 Selenium 的 WebUI 自动化脚本时,有些元素不易定位元素,或有些元素为隐藏的(此时用 WebElement.getText() 获取其值的时候,返回的结果为空),对日常的 UI ...
随机推荐
- POJ 3169 Layout (差分约束系统)
Layout 题目链接: Rhttp://acm.hust.edu.cn/vjudge/contest/122685#problem/S Description Like everyone else, ...
- Spring + JdbcTemplate + JdbcDaoSupport examples
In Spring JDBC development, you can use JdbcTemplate and JdbcDaoSupport classes to simplify the over ...
- 《数据通信与网络》笔记--SCTP
SCTP(stream control transmission protocol)是一种新的可靠的,面向报文的传输层控制协议.它兼有UDP和TCP的特性,它是可靠的面向报文的协议,它保存报文的边界, ...
- 开源原生JavaScript插件-CJPCD(省市区联动)
一.前言 上两篇博客笔者对 JavaScript Module 模式,闭包等知识点做了简单介绍之后,我们今天开始正式开发一款属于自己的 JavaScript 插件.由于最近项目刚好用到地区选择这一块的 ...
- GMT 绘制台站分布图
set ps=test.psset J=M4i set R=73/135.5/10/54rem gmt gmtset FONT_ANNOT_PRIMARY 8p FONT_TITLE 8p gmt ...
- ADO.NET 快速入门(四):从数据库填充 DataSet
从数据库获取数据很容易,处理数据更容易.如果想要从数据库获取只进.只读的数据流结果集,你可以使用 DataReader 执行命令并且检索它.关于如何使用 DataReader,请参考:使用 OLE D ...
- Linux在向磁盘新建文件的时候在系统层面的四步操作
----------- 1.存储文件属性.内核先找到一个空的i节点,并把文件属性信息记录其中. 2.存储数据.先计算要多少个磁盘块,在内核自由块列表找到合适数量的磁盘块,并把数据从内核的缓冲区依次 ...
- java泛型的讲解
java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...
- Android ViewPager使用具体解释
这是谷歌官方给我们提供的一个兼容低版本号安卓设备的软件包,里面包囊了仅仅有在安卓3.0以上能够使用的api.而viewpager就是当中之中的一个利用它,我们能够做非常多事情,从最简单的导航,到页面菜 ...
- JSF教程(10)——生命周期之Update Model Values Phase
在整个JSF生命周期中经历了取值.验证的阶段终于从request中拿到合理的值,以下就是在本阶段给相应的服务端对象(ManageBean)赋值了.JSF实现仅仅是去更新和input组件中value属性 ...