自动化中的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 ...
随机推荐
- Mybatis中实体类中的字段跟对应表的字段不一致时解决办法
解决字段名与实体类属性名不相同的冲突 实体类字段: public class Order { private int id; private String orderNo; private float ...
- hibernate id生成器配置
1.uuid配置 <id name="tomdId" type="java.lang.String"> <column name=" ...
- hdu 4786 Fibonacci Tree (2013ACMICPC 成都站 F)
http://acm.hdu.edu.cn/showproblem.php?pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) ...
- VC中监测程序运行时间(二)-毫秒级
/* * 微秒级计时器,用来统计程序运行时间 * http://blog.csdn.net/hoya5121/article/details/3778487#comments * //整理 [10/1 ...
- twisted 安装时,安装顺序为 zope.interface ->twisted
最近想学 twisted ,就去下载 twisted 的windows版本,并且 安装.运行 twisted 例子后,发现出现了问题: ImportError: Twisted requires zo ...
- PostgreSQL的schema信息,存储于何处
查看schema信息: [pgsql@localhost bin]$ ./psql psql () Type "help" for help. pgsql=# create sch ...
- 基础数据结构 之 队列(python实现)
队也是编程开发中常见的一种数据结构.栈和队可用来模拟函数的递归过程.队的特点为先入先出,主要操作包括入队和出队.入队时需判断队是否已满,出队时需判断队是否为空.下面给出一个队的python实现的例子: ...
- URAL 1774 A - Barber of the Army of Mages 最大流
A - Barber of the Army of MagesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/v ...
- 根据字符串创建FTP本地目录 并按照日期建立子目录返回路径
/** * 根据字符串创建FTP本地目录 并按照日期建立子目录返回 * @param path * @return */ private String getFolder(String path) { ...
- delphi 取得汉字的第一个字母
功能说明://取得汉字的第一个字母 function GetPYIndexChar( hzchar:string):char;begin caseWORD(hzchar[1])shl8+WORD(h ...