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

  • 相关阅读:
    javascript中this使用规律
    call和apply的作用和不同
    SVN的标准目录结构:trunk、branches、tags
    SVN 多人修改,如何管理 关于版本的问题
    公司考勤系统项目设计
    CDI Features
    Java Design Pattern
    公司考勤系统设计文件
    spring( history Design Philosophy )
    JSON/xml
  • 原文地址:https://www.cnblogs.com/chongyou/p/5831102.html
Copyright © 2020-2023  润新知