自动化中的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页面的脚本就算完成了,看了后,其他人员也能够一目了然,心情顿时就美丽了

时间: 2024-10-26 21:10:37

自动化中的PageObject思想的相关文章

图像对比在UI自动化中的应用

引子  继多版本模拟器的支持工作告一段落之后,如何利用这些技术产生更大的价值,成为了接下来需要思考的问题.当然,接下来的课题就涉及到了今天的图像对比技术.说来有点内疚,虽然也算是科班出身,只可惜大学还没有真正理解图像处理的价值,现在又要为自己的过去买单,看来出来混,迟早是要换的. 大环境       先谈一下图像对比在我厂使用的大环境,调研了几类产品,虽然不能说很全,但是也可以略见一斑. 面对海量的图片数据,使用最多的就是使用全局特征及局部特征进行去重.分类,这个主要应用于图片相关的部门. 还有

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

Selenium 获取 JavaScript 返回值非常简单,只需要在 js 脚本中将需要返回的数据 return 就可以,然后通过方法返回 js 的执行结果,方法源码如下所示: 1 /** 2 * Get Object of return from js 3 * 4 * @author Aaron.ffp 5 * @version V1.0.0: autoSeleniumDemo main.aaron.sele.core SeleniumCore.java execJSR, 2015-8-9

[学习笔记]面向对象开发中的一些思想和原则

摘自<Java与模式>作者阎宏 面向对象的可复用设计的第一块基石:开闭原则(一个软件实体应当对扩展开放,对修改关闭) "开-闭"原则的手段和工具: 1)里氏代换原则:任何基类出现的地方,子类一定可以出现: 2)依赖倒转原则:要依赖于抽象,不要依赖于实现: 3)合成\聚合复用原则:要尽量使用合成\聚合,而不是继承关系达到复用的目的: 4)迪米特法则:一个软件实体应该与尽可能少的其它实体发生相互作用: 5)接口隔离原则:应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口

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

在自动化脚本编写过程中,操作元素之前,需要对元素进行高亮显示(通过修改元素的边框样式),同时进行截图,以记录操作的元素对象.在实际应用中较为少见,通常用于演示,或者发生错误时的屏幕截图捕捉,用于错误报告分析. 直接上码了...... 1 /** 2 * 3 * @function height light the element 4 * 5 * @author Aaron.ffp 6 * @version V1.0.0: autoUISelenium main.java.aaron.sele.c

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

日常的 Web UI 自动化测试过程中,get 或 navigate 到指定的页面后,若想截图的元素或者指定区域范围不在浏览器的显示区域内,则通过截屏则无法获取相应的信息,反而浪费了无畏的图片服务器资源,当然,最重要的还是未能达到自己的预期,是不是很内伤啊.此时,我们就不得不像正常用户操作一样,通过滚动页面至相应的区域,那么该如何滚动呢,此文就此给出答案. 此文实现的页面滚动,是通过 js 操作实现的,敬请各位小主参阅.若有不足之处,敬请大神指正,非常感谢! 直接上码了...... 1 /**

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

前几篇文章中简略概述了,如何获取.设置浏览器窗口大小,那么我们该如何获取浏览器显示区域的大小呢?此文讲对此进行简略概述,敬请各位小主参阅.若有不足之处,敬请各位大神指正,不胜感激! 获取浏览器显示区域的方法,我目前想到的只有以下两种方法: 1.通过 JavaScript  获取浏览器显示区域的大小 2.通过 WebDriver 截图,获取截图的大小,从而获得浏览器显示区域的大小 此文主要以第一种方法示例演示,第二种方法进行后续更新,敬请期待!谢谢! 1 /** 2 * Get width and

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

加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景       在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链接等.比如在用户名输入框和密码输入框输入正确的用户名和密码,然后点击登录按钮进行登录.在Selenium自动化中,Selenium提供多种API来对HTML元素进行操作,对于每个HTML元素,需要一个可以标识它的标识符,在Selenium中称之为定位器,Selenium支持多种不同类型的定位器,有标

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

通过 JS 或 JQuery 获取到元素后,通过 offsetLeft.offsetTop.offsetWidth.offsetHeight 即可获得元素的位置和大小,非常的简单,直接上源码了,敬请参阅! 1 /** 2 * Get element position by jquery, and return integer Array [left distance, top distance, width distance, height distance] 3 * 4 * @author A

软件系统架构中的分层思想

软件系统架构中的分层思想 关于分层结构 众所周知,经典的三层结构包括数据访问层.业务逻辑层和表示层.当然,如果继续扩展下去,还可以分为4层.5层…… 我相信很多人都用过,很多人都写过,但是为什么要这么做,还是有一部分人是不能够说清楚的,这不是我猜想的,而是遇见过很多想分层但是分的乱七八糟的层次结构. 1. 数据访问层: 功能描述:处理与数据库之间的交互,不应对数据做任何业务上的加工.捕获数据库交互式出现的异常,抛出或记录下来. 说明:它的作用就是数据访问,如果你没有用其他的类似于ORM的框架,那