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("[email protected]", "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("[email protected]","cookies123");

        ViewHomePage.viewMyProfile();

    }

    @AfterMethod(alwaysRun=true)

    public void stop() {

        super.stop();

    }        

}

  

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

时间: 2024-11-08 18:52:16

selenium测试框架篇的相关文章

selenium测试框架篇,页面对象和元素对象的管理

前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让整个测试体系: 更容易维护 大大增加代码重用 增加测试系统的稳定性 这里先了解一下我所说的对象库: 所谓的页面对象,是指每一个真是的页面是一个对象. 比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin 这个页面对象主要包含一个输入邮箱的输入框(一个元素对

selenium测试框架使用xml作为对象库

之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locator对象 不能够实现Locator对象重名 文件比较大,读写速度没有xml快 所以,重新写了使用dom4j操作xml,使用xml管理Locator对象,能够有效解决以上问题 首先,定义Locator文件 <?xml version="1.0" encoding="UTF-8&

selenium 测试框架中使用grid

之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecrazy/p/4529399.html 在测试框架中使用Log4J 2 :http://www.cnblogs.com/tobecrazy/p/4557592.html 首先介绍一下grid ,selenium grid 是一种执行测试用例时使用的包含不同平台(windows.Linux.Androi

selenium测试框架(java) 版本演化一

selenium的自动化测试代码应该如何组织?  如链接:https://code.google.com/p/selenium/wiki/PageObjects  这里提供了一种PageObject的设计思想,并且在百度内部给出了一个感觉比较实用的实现.其组织结构思想如下: Page 封装页面元素,以及页面应提供的服务. 尽量隐藏页面的细节,不要暴露出来. widget 封装Page中的通用的组件. 这里的理念是所有的WebElement都是控件. 通用的页面样式,如导航栏,列表,组合查询框,可

java + selenium测试框架(之等待机制) 版本演化二

使用selenium-ide录制,以及直接用selenium-java.jar写测试用例,你会发现它的执行速度很快.大大超过了手工操作的速度,甚至可能也超过了浏览器加载的速度(比浏览器都快?结果就是找不到元素). 如果页面上确实有某个元素,但是在测试时提示NoSuchElementException,那原因有两个:1,你抓取元素的策略错了:2,执行时元素还没加载出来. 在调用了driver.get(url)之后,为了保证元素能够取到正确初始化,需要增加一个等待加载完成的函数,保证页面完成加载.

Selenium关键字驱动测试框架Demo(Java版)

Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html Selenium关键字驱动测试框架Demo(Java版),布布扣,bubuko.com

TestNG测试框架在基于Selenium进行的web自动化测试中的应用

这个测试框架可以把写好的测试用例按自定义顺序执行,以Selenium WebDriver自动化测试用例为例: 1.新建一个名为forTestNg的java project,然后创建一个libs文件夹,导入所有和Selenium相关的jar包: 2.安装TestNG,在Eclipse中点击Help->Install New Software,点击Add,Location填写“http://beust.com/eclipse”,然后点击OK: 之后勾选TestNG,点击Next进行安装即可: 之后点

selenium一个完整的unittest测试框架格式(单线程,非测试报告)

我在工作中碰到过同事写了些web自动化测试的脚本,有次我问他使用的是什么测试框架, 他居然说不知道.这位同事其实写selenium自动化测试也有些时间了.当我看了他的脚本 不出意外,他使用的就是unittest框架,哈哈.所以我觉得有些同学虽然会做相关东西, 但其实并不知道自己所掌握的东西是什么. 下面呢,我就结合自己写的脚本分析下一个完成的unittest测试框架的包括的内容. 图中我已经写的很详细拉.想交流的可以加QQ群:610845268

selenium之多线程启动grid分布式测试框架封装(四)

九.工具类,启动所有远程服务的浏览器 在utils包中创建java类:LaunchAllRemoteBrowsers package com.lingfeng.utils; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set;