谈着这个话题很大,因为我自己在自动化分层的方面做的就不是很好,最近在做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思想的更多相关文章

  1. 说说UI自动化中的PO模式

    PO模式,全称PageObject模式,即页面对象模式.将页面定位与业务操作分离. po模式有以下几个优点: 1.易读性好 2.扩展性高 3.复用性强 4.维护性好 5.代码冗余率低 了解了po模式及 ...

  2. 工作流引擎在vivo营销自动化中的应用实践 | 引擎篇03

    作者:vivo 互联网服务器团队- Cheng Wangrong 本文是<vivo营销自动化技术解密>的第4篇文章,分析了在营销自动化业务引入工作流技术的背景和工作流引擎的介绍,同时介绍了 ...

  3. Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析

    加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景       在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链 ...

  4. Selenium2学习-036-WebUI自动化实战实例-034-JavaScript 在 Selenium 自动化中的应用实例之六(获取 JS 执行结果返回值)

    Selenium 获取 JavaScript 返回值非常简单,只需要在 js 脚本中将需要返回的数据 return 就可以,然后通过方法返回 js 的执行结果,方法源码如下所示: /** * Get ...

  5. Selenium2学习-032-WebUI自动化实战实例-030-JavaScript 在 Selenium 自动化中的应用实例之五(高亮标示元素)

    在自动化脚本编写过程中,操作元素之前,需要对元素进行高亮显示(通过修改元素的边框样式),同时进行截图,以记录操作的元素对象.在实际应用中较为少见,通常用于演示,或者发生错误时的屏幕截图捕捉,用于错误报 ...

  6. Selenium2学习-031-WebUI自动化实战实例-029-JavaScript 在 Selenium 自动化中的应用实例之四(获取元素位置和大小)

    通过 JS 或 JQuery 获取到元素后,通过 offsetLeft.offsetTop.offsetWidth.offsetHeight 即可获得元素的位置和大小,非常的简单,直接上源码了,敬请参 ...

  7. Selenium2学习-027-WebUI自动化实战实例-025-JavaScript 在 Selenium 自动化中的应用实例之三(页面滚屏,模拟鼠标拖动滚动条)

    日常的 Web UI 自动化测试过程中,get 或 navigate 到指定的页面后,若想截图的元素或者指定区域范围不在浏览器的显示区域内,则通过截屏则无法获取相应的信息,反而浪费了无畏的图片服务器资 ...

  8. Selenium2学习-022-WebUI自动化实战实例-020-JavaScript 在 Selenium 自动化中的应用实例之二(获取浏览器显示区域大小)

    前几篇文章中简略概述了,如何获取.设置浏览器窗口大小,那么我们该如何获取浏览器显示区域的大小呢?此文讲对此进行简略概述,敬请各位小主参阅.若有不足之处,敬请各位大神指正,不胜感激! 获取浏览器显示区域 ...

  9. Selenium2学习-011-WebUI自动化实战实例-009-JavaScript 在 Selenium 自动化中的应用实例之一(赋值)

    通常在编写 Selenium 的 WebUI 自动化脚本时,有些元素不易定位元素,或有些元素为隐藏的(此时用 WebElement.getText() 获取其值的时候,返回的结果为空),对日常的 UI ...

随机推荐

  1. Android问题-DelphiXE8安装后编译Android提示SDK无法更新问题(XE10也可以解决)

    资料来原:http://www.chenruixuan.com/archives/479.html (DelphiXE8 更新SDK)http://www.dfwlt.com/forum.php?mo ...

  2. HDU 5821 Ball (贪心)

    Ball 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5821 Description ZZX has a sequence of boxes nu ...

  3. Spring Auto-Wiring Beans

    In Spring framework, you can wire beans automatically with auto-wiring feature. To enable it, just d ...

  4. Java IO (4) - Writer

    Java IO (4) - Writer 前言 JavaIO一共包括两种,一种是stream,一种是reader/writer,每种又包括in/out,所以一共是四种包.Java 流在处理上分为字符流 ...

  5. Spring Data JPA教程, 第八部分:Adding Functionality to a Repository (未翻译)

    The previous part of my tutorial described how you can paginate query results with Spring Data JPA. ...

  6. 【不积跬步,无以致千里】DELETE SINGLE IPTABLES RULES

    You can delete them based on what they’re doing: iptables -D INPUT -s 127.0.0.1 -p tcp --dport 111 - ...

  7. 建立名称server

    一.实验的目的:     实现DNSserver功能,提供正向.反向解析 二.实验环境     装有Linux的Windows系统 IP为192.168.6.3的虚拟机 三.实验目的 建立gr.org ...

  8. Codeforces Gym 100418K Cards 暴力打表

    CardsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action? ...

  9. androidstudio构建(或导入)工程(不用gradle)

    获取源代码: ---assets ---libs ---res ---src 先备份AndroidManifest.xml,然后工程中只保留这四个文件夹,其他文件删除, 然后在studio中导入工程, ...

  10. win7中USB音箱没有声音解决的方法

    Win7装好后,原来在XP中工作正常的USB小音箱却不工作了,重装了声卡驱动还是一样,后来通过下面尝试最终好用了. 1.右键右下角喇叭button. 2.点击"播放设备". 3.设 ...