自动化中的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 ...
随机推荐
- Codeforces Round #257 (Div. 1) C. Jzzhu and Apples (素数筛)
题目链接:http://codeforces.com/problemset/problem/449/C 给你n个数,从1到n.然后从这些数中挑选出不互质的数对最多有多少对. 先是素数筛,显然2的倍数的 ...
- string中c_str()、data()、copy(p,n)函数的用法
标准库的string类提供了3个成员函数来从一个string得到c类型的字符数组:c_str().data().copy(p,n). 1. c_str():生成一个const char*指针,指向以空 ...
- java中动态代理
一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...
- Linux学习笔记--(1)
今天用Linux 的 test 命令,发现了一个有趣的现象: 打入 " test "abc"="abc" ;echo $? " 后,结果应该 ...
- HTTP请求头详解【转】
http://blog.csdn.net/kfanning/article/details/6062118 HTTP由两部分组成:请求和响应.当你在Web浏览器中输入一个URL时,浏览器将根据你的要求 ...
- UVa540 Team Queue
// 题意:有t个团队的人在排队.每次来了一个新人之后,如果他有队友在排队,那么这个新人会插队到队友的身后. // 要求支持三种指令:ENQUEUE x; DEQUEUE(队首出队); STOP.模拟 ...
- 开始学习web前端技术
不能再蹉跎了,不能再徘徊了,不能再犹豫了,犹豫徘徊等于白来…… 感觉之前浪费了太多的岁月,必须得学习一门实用的技术来充实自己空虚的心情了. 想来想去网页应该是万金油的,大大小小多多少少都得用到.既然如 ...
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 有n个长度为m的二进制串,每个都是不同的. 为了把所有字符串区分开,你可以询问,每次可 ...
- Delphi 7 升级到 Delphi 2010 总结
1 字符串 >>string =unicodeString 字母的处理要定义AnsiString了 >>PChar =PWidechar >>str='普通汉字' ...
- pt-table-checksum 与pt-table-sync
http://www.lai18.com/user/481193.html?id=481193&p=1 主从数据校验使用percona-toolkit工具集的以下两个工具(主库上使用): pt ...