首页 > 代码库 > 自动化中的PageObject思想

自动化中的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=http://www.mamicode.com/‘"+name+"‘;");        driver.findElement(By.name("_password")).clear();         ((JavascriptExecutor)driver).executeScript("document.getElementById(‘login_password‘).value=http://www.mamicode.com/‘"+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;@BeforeClasspublic 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思想