zoukankan      html  css  js  c++  java
  • selenium测试框架篇

    做自动化框架,不可避免的就是对象库。

    有一个好的对象库,可以让整个测试体系:

    •  更容易维护
    •  大大增加代码重用
    •  增加测试系统的稳定性

    这里先了解一下我所说的对象库:

    所谓的页面对象,是指每一个真是的页面是一个对象。

    比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin

    这个页面对象主要包含一个输入邮箱的输入框(一个元素对象),一个输入密码的密码框

    一个登陆框。当然,zhihu不止一个页面,有无数页面,每一个页面都可以封装为一个对象。而每个

    页面的元素,也可以封装成一个个元素对象。

    为什么要封装成一个个对象?

    还是以这个登陆页面为例,如果有一天zhihu改版,登陆界面UI变了,(但是需要输入用户名和密码还有登陆按钮不会消失吧)。

    登陆页面的元素的位置也相应改变,如果你的测试用例没有封装过页面和元素, 每个页面都是拿webdriver 直接写,页面元素定位

    也分布到测试用例中,这要维护起来要全部改掉测试用例。如果你封装了页面,封装了元素,再封装一个对应的登陆Action,你的每个

    测试用例是调用的login.action()。  这样,你只需要改变你对象库的内容就完美解决UI变化,而不必一个个修改测试用例。

    测试框架目录如下:

      

    接下来一这个登陆为例:

    首先封装一个BasePage的类,毕竟所有的页面都有共同的东西,每个页面都有元素,每个页面元素都有相应的方法

    这里简单封装了几个方法,如type 

    复制代码
    package com.dbyl.libarary.utils;
    
    import java.io.IOException;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.interactions.Actions;
    import org.openqa.selenium.support.ui.ExpectedCondition;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class BasePage {
    
        protected WebDriver driver;
        protected String[][] locatorMap;
    
        protected BasePage(WebDriver driver) throws IOException {
            this.driver = driver;
            locatorMap = ReadExcelUtil.getLocatorMap();
        }
    
        protected void type(Locator locator, String values) throws Exception {
            WebElement e = findElement(driver, locator);
            e.sendKeys(values);
        }
    
        protected void click(Locator locator) throws Exception {
            WebElement e = findElement(driver, locator);
            e.click();
        }
    
        protected void clickAndHold(Locator locator) throws IOException {
            WebElement e = findElement(driver, locator);
            Actions actions = new Actions(driver);
            actions.clickAndHold(e).perform();
        }
    
        public WebDriver getDriver() {
            return driver;
        }
    
        public void setDriver(WebDriver driver) {
            this.driver = driver;
        }
    
        public WebElement getElement(Locator locator) throws IOException {
            return getElement(this.getDriver(), locator);
        }
    
        /**
         * get by parameter
         * 
         * @author Young
         * @param driver
         * @param locator
         * @return
         * @throws IOException
         */
        public WebElement getElement(WebDriver driver, Locator locator)
                throws IOException {
            locator = getLocator(locator.getElement());
            WebElement e;
            switch (locator.getBy()) {
            case xpath:
                e = driver.findElement(By.xpath(locator.getElement()));
                break;
            case id:
                e = driver.findElement(By.id(locator.getElement()));
                break;
            case name:
                e = driver.findElement(By.name(locator.getElement()));
                break;
            case cssSelector:
                e = driver.findElement(By.cssSelector(locator.getElement()));
                break;
            case className:
                e = driver.findElement(By.className(locator.getElement()));
                break;
            case tagName:
                e = driver.findElement(By.tagName(locator.getElement()));
                break;
            case linkText:
                e = driver.findElement(By.linkText(locator.getElement()));
                break;
            case partialLinkText:
                e = driver.findElement(By.partialLinkText(locator.getElement()));
                break;
            default:
                e = driver.findElement(By.id(locator.getElement()));
            }
            return e;
        }
    
        public boolean isElementPresent(WebDriver driver, Locator myLocator,
                int timeOut) throws IOException {
            final Locator locator = getLocator(myLocator.getElement());
            boolean isPresent = false;
            WebDriverWait wait = new WebDriverWait(driver, 60);
            isPresent = wait.until(new ExpectedCondition<WebElement>() {
                @Override
                public WebElement apply(WebDriver d) {
                    return findElement(d, locator);
                }
            }).isDisplayed();
            return isPresent;
        }
    
        /**
         * This Method for check isPresent Locator
         * 
         * @param locator
         * @param timeOut
         * @return
         * @throws IOException
         */
        public boolean isElementPresent(Locator locator, int timeOut)
                throws IOException {
            return isElementPresent(driver,locator, timeOut);
        }
    
        /**
         * 
         * @param driver
         * @param locator
         * @return
         */
        public WebElement findElement(WebDriver driver, final Locator locator) {
            WebElement element = (new WebDriverWait(driver, locator.getWaitSec()))
                    .until(new ExpectedCondition<WebElement>() {
    
                        @Override
                        public WebElement apply(WebDriver driver) {
                            try {
                                return getElement(driver, locator);
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                return null;
                            }
    
                        }
    
                    });
            return element;
    
        }
    
        public Locator getLocator(String locatorName) throws IOException {
    
            Locator locator;
            for (int i = 0; i < locatorMap.length; i++) {
                if (locatorMap[i][0].endsWith(locatorName)) {
                    return locator = new Locator(locatorMap[i][1]);
                }
            }
    
            return locator = new Locator(locatorName);
    
        }
    }
    复制代码

    接下来封装元素,Webdriver的元素,每个元素都有相应的定位地址(xpath路径或css或id)等待时间和定位类型,默认为By.xpath

    复制代码
    package com.dbyl.libarary.utils;
    
    /**
     * This is for element library
     * 
     * @author Young
     *
     */
    public class Locator {
        private String element;
    
        private int waitSec;
    
        /**
         * create a enum variable for By
         * 
         * @author Young
         *
         */
        public enum ByType {
            xpath, id, linkText, name, className, cssSelector, partialLinkText, tagName
        }
    
        private ByType byType;
    
        public Locator() {
    
        }
    
        /**
         * defaut Locator ,use Xpath
         * 
         * @author Young
         * @param element
         */
        public Locator(String element) {
            this.element = element;
            this.waitSec = 3;
            this.byType = ByType.xpath;
        }
    
        public Locator(String element, int waitSec) {
            this.waitSec = waitSec;
            this.element = element;
            this.byType = ByType.xpath;
        }
    
        public Locator(String element, int waitSec, ByType byType) {
            this.waitSec = waitSec;
            this.element = element;
            this.byType = byType;
        }
    
        public String getElement() {
            return element;
        }
    
        public int getWaitSec() {
            return waitSec;
        }
    
        public ByType getBy() {
            return byType;
        }
    
        public void setBy(ByType byType) {
            this.byType = byType;
        }
    
    }
    复制代码

    接下来就是登陆页面的类,这个登陆页面的元素,放在excel统一管理,要获取元素的信息,首先从excel读取。

    读取excel的页面元素是使用POI开源框架

    复制代码
    package com.dbyl.libarary.utils;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DateUtil;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    
    public class ReadExcelUtil {
    
        static String path;
    
        /**
         * @author Young
         * @return
         * @throws IOException
         */
        public static String[][] getLocatorMap() throws IOException {
            path = "C:/Users/Young/workspace/Demo/src/com/dbyl/libarary/pageAction/UILibrary.xls";
            File f1 = new File(path);
            FileInputStream in = new FileInputStream(f1);
            HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(in));
            Sheet sheet = wb.getSheetAt(0);
            Row header = sheet.getRow(0);
            String[][] locatorMap = new String[sheet.getLastRowNum() + 1][header
                    .getLastCellNum()];
            for (int rownum = 0; rownum <= sheet.getLastRowNum(); rownum++) {
                // for (Cell cell : row)
                Row row = sheet.getRow(rownum);
    
                if (row == null) {
    
                    continue;
    
                }
                String value;
                for (int cellnum = 0; cellnum <= row.getLastCellNum(); cellnum++) {
                    Cell cell = row.getCell(cellnum);
                    if (cell == null) {
                        continue;
                    } else {
                        value = "";
                    }
                    switch (cell.getCellType()) {
                    case Cell.CELL_TYPE_STRING:
                        value = cell.getRichStringCellValue().getString();
                        break;
                    case Cell.CELL_TYPE_NUMERIC:
                        if (DateUtil.isCellDateFormatted(cell)) {
                            value = cell.getDateCellValue().toString();
    
                        } else {
                            value = Double.toString((int) cell
                                    .getNumericCellValue());
    
                        }
                        break;
                    case Cell.CELL_TYPE_BOOLEAN:
                        value = Boolean.toString(cell.getBooleanCellValue());
                        break;
                    case Cell.CELL_TYPE_FORMULA:
                        value = cell.getCellFormula().toLowerCase();
                        break;
                    default:
                        value = " ";
                        System.out.println();
                    }
                    locatorMap[rownum][cellnum] = value;
    
                }
            }
            in.close();
            wb.close();
    
            return locatorMap;
        }
    
    }
    复制代码

    页面类

    复制代码
    package com.dbyl.libarary.pageAction;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.WebDriver;
    
    import com.dbyl.libarary.utils.BasePage;
    import com.dbyl.libarary.utils.Locator;
    
    public class LoginPage extends BasePage {
    
        WebDriver driver;
    
        public WebDriver getDriver() {
            return driver;
        }
    
        public LoginPage(WebDriver driver) throws IOException {
            super(driver);
            driver.get("http://www.zhihu.com/#signin");
        }
    
        Locator loginEmailInputBox = new Locator("loginEmailInputBox");
    
        Locator loginPasswordInputBox = new Locator("loginPasswordInputBox");
        Locator loginButton = new Locator("loginButton");
        Locator profile = new Locator(
                "profile");
    
        public void typeEmailInputBox(String email) throws Exception {
            type(loginEmailInputBox, email);
        }
    
        public void typePasswordInputBox(String password) throws Exception {
            type(loginPasswordInputBox, password);
        }
    
        public void clickOnLoginButton() throws Exception {
            click(loginButton);
        }
    
        public boolean isPrestentProfile() throws IOException {
            return isElementPresent(profile, 20);
    
        }
    
        public void waitForPageLoad() {
            super.getDriver().manage().timeouts()
                    .pageLoadTimeout(30, TimeUnit.SECONDS);
        }
    
        
    }
    复制代码

    接下来就是登陆的Action

    复制代码
    package com.dbyl.libarary.action;
    
    import org.openqa.selenium.WebDriver;
    import org.testng.Assert;
    
    import com.dbyl.libarary.pageAction.HomePage;
    import com.dbyl.libarary.pageAction.LoginPage;
    
    public class CommonLogin {
    
        private static WebDriver driver;
    
        public static WebDriver getDriver() {
            return driver;
        }
    
        static LoginPage loginPage;
    
        public static HomePage login(String email, String password)
                throws Exception {
            loginPage = new LoginPage(getDriver());
            loginPage.waitForPageLoad();
            loginPage.typeEmailInputBox(email);
            loginPage.typePasswordInputBox(password);
            loginPage.clickOnLoginButton();
            Assert.assertTrue(loginPage.isPrestentProfile(), "login failed");
            return new HomePage(getDriver());
        }
    
        public static HomePage login() throws Exception {
            return CommonLogin.login("seleniumcookies@126.com", "cookies123");
        }
    
        public static void setDriver(WebDriver driver) {
            CommonLogin.driver = driver;
        }
    
    }
    复制代码

    至此为止,已经封装完毕

    接下来就能在测试用例直接调用者

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package com.dbyl.tests;
     
    import org.openqa.selenium.WebDriver;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Test;
     
    import com.dbyl.libarary.action.ViewHomePage;
    import com.dbyl.libarary.utils.DriverFactory;
    import com.dbyl.libarary.utils.UITest;
     
    public class loginTest extends UITest{
     
     
        WebDriver driver=DriverFactory.getChromeDriver();
        @BeforeMethod(alwaysRun=true)
        public void init()
        {
            super.init(driver);
            ViewHomePage.setDriver(driver);
            //CommonLogin.setDriver(driver);
        }
        @Test(groups="loginTest")
        public void loginByUerName() throws Exception
        {
            //CommonLogin.login("seleniumcookies@126.com","cookies123");
            ViewHomePage.viewMyProfile();
        }
     
        @AfterMethod(alwaysRun=true)
        public void stop() {
            super.stop();
        }         
    }

      

    demo的下载地址:https://github.com/tobecrazy/Demo

  • 相关阅读:
    redis+nginx+tomcat故障大全
    Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享
    Redis初步认识
    私有IP地址共有三个范围段
    公有云和私有云的区别
    svn安装与其服务器搭建
    datagrid后台分页js
    easyui.dialog.js
    EasyUI 另一种form提交方式
    easyui- grid前台分页
  • 原文地址:https://www.cnblogs.com/wangcp-2014/p/5545271.html
Copyright © 2011-2022 走看看