自动化中的PageObject思想

Posted 做梦的人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化中的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思想的主要内容,如果未能解决你的问题,请参考以下文章

python自动化web自动化:3.PO设计模式

PageObject在UI自动化测试中的应用--Junit版

UI自动化项目分层设计思想(po模式)

PageObject设计模式 在selenium 自动化测试里面的应用

接口自动化测试-接口封装思想

接口自动化测试-接口封装思想