抄来的

原作者:http://blog.sina.com.cn/s/articlelist_1371809337_1_1.html

clip_image001

clip_image003

clip_image005

clip_image007clip_image009

clip_image011

clip_image013

clip_image015

分离页面操作01-PageElement 页面元素提取

1.页面元素的提取
package com.app.pageobjects;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class PageElement {
    // 登录
    @FindBy(className = "login")
    private WebElement login;
    // 登陆名
    @FindBy(id = "login_name_d")
    // 缓存
    // @CacheLookup
    private WebElement loginName;
    // 密码
    @FindBy(id = "login_pass_d")
    // @CacheLookup
    private WebElement loginPass;
    // 记住登录状态
    @FindBy(id = "login_save")
    private WebElement loginSave;
    // 登录按钮
    @FindBy(id = "login_button")
    @CacheLookup
    private WebElement loginButton;
    // 登录失败断言
    @FindBy(id = "login_div_error")
    private WebElement loginDivError;
    // 登录成功断言
    @FindBy(xpath = "//a[@id='SG_Publish']/em")
    private WebElement sgPublish;
    public PageElement(WebDriver dr) {
        PageFactory.initElements(dr, this);
    }
    public WebElement getLogin() {
        return login;
    }
    public WebElement getLoginName() {
        return loginName;
    }
    public WebElement getLoginPass() {
        return loginPass;
    }
    public WebElement getLoginSave() {
        return loginSave;
    }
    public WebElement getLoginButton() {
        return loginButton;
    }
    public WebElement getLoginDivError() {
        return loginDivError;
    }
    public WebElement getSgPublish() {
        return sgPublish;
    }
}

分离页面操作02-ElementAction 页面元素动作

2.页面元素的操作
使用到的类:WebDriverInstance,PageElement
WebDriverInstance-用来获得webdriver实例.根据传递的参数,获得不同浏览器的实例

PageElement-用来获得页面元素
package com.app.pageobjects;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import com.app.publics.Browsers;
public class ElementAction {
    private String baseUrl;
    public final WebDriver driver;
    public final PageElement pageElement;
    private static ElementAction elementAction;
    private ElementAction(String browser) {
        //根据传递的参数初始化driver
        driver = WebDriverInstance.getDriver(browser);
        baseUrl = "http://blog.sina.com.cn/dlr521sara";
        // 隐性等待
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // 页面加载,仅适用于ff
        driver.manage().timeouts().pageLoadTimeout(2000, TimeUnit.SECONDS);
        // 窗口最大化
        driver.manage().window().maximize();
        // 清楚所有cookie
        driver.manage().deleteAllCookies();
        pageElement = new PageElement(this.driver);
    }
    public static ElementAction getInstance(String browser) {
        if (elementAction == null)
            return new ElementAction(browser);
        return elementAction;
    }
    public void load() {
        driver.get(baseUrl);
    }
    public void login() {
        pageElement.getLogin().click();
    }
    public void loginFailure(String name, String pass)
            throws InterruptedException {
        pageElement.getLoginName().clear();
        pageElement.getLoginName().sendKeys(name);
        Thread.sleep(1000);
        pageElement.getLoginPass().clear();
        pageElement.getLoginPass().sendKeys(pass);
        Thread.sleep(1000);
        pageElement.getLoginButton().click();
        Thread.sleep(1000);
    }
    public void loginSuccess() {
        pageElement.getLoginName().clear();
        pageElement.getLoginName().sendKeys("");
        pageElement.getLoginPass().clear();
        pageElement.getLoginPass().sendKeys("");
        pageElement.getLoginButton().click();
    }
    public void close() {
        driver.quit();
    }
    public String getBaseUrl() {
        return baseUrl;
    }
}

分离页面操作03-WebDriverInstance初始化

3.WebDriverInstance-初始化webdriver实例
package com.app.publics;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
public final class WebDriverInstance {
    private static WebDriver dr;
    private WebDriverInstance(){
    }
    public static WebDriver getDriver(String str){
        if(dr != null)
            return dr;
        else{
            if(str.equals("ff")){
                System.setProperty("webdriver.firefox.bin",
                        "D:\Program Files\Mozilla Firefox\firefox.exe");
                dr = new FirefoxDriver();
                return dr;
            }
            if(str.equals("ie")){
                //IEDriver。exe加载写在此处
                dr = new InternetExplorerDriver();
                return dr;
            }
            if(str.equals("chrome")){
                //同上
                dr = new ChromeDriver();
                return  dr;
            }
            else{
                System.out.println("参数错误,只能为 ff/ie/chrome!");
                return null;
            }
        }
    }
}

分离页面操作04-HashMapExcel读取数据驱动文件excel

4.读取数据驱动文件excel中内容,并转为二维数组
package com.app.dataProvider;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public final class HashMapExcel {
    public static Object[][] getData(HashMap<Integer, Cell[]> hm) {
        if (hm == null) {
            System.out.println("参数传递错误");
            return null;
        }
        // 将hm中value转为stringBuffer
        StringBuffer strBuffer = new StringBuffer();
        // StringBuilder strBuilder = new StringBuilder();
        for (int i = 1; i < hm.size(); i++) {
            for (int j = 0; j < hm.get(i).length; j++) {
                if (String.valueOf(hm.get(i)[j].getContents()).trim()
                        .equals("")) {
                    continue;
                }
                strBuffer.append(hm.get(i)[j].getContents() + ",");
            }
            strBuffer.append(" ");
        }
        // 将stringBuffer转为一维字符串数组
        String[] str = new String[hm.size()];
        str = strBuffer.toString().split(" ");
        for (int i = 0; i < str.length; i++) {
            System.out.println(str[i]);
        }
        // 将一维字符串数组转为二维数组
        String[][] s2 = new String[str.length][];
        for (int i = 0; i < s2.length; i++) {
            s2[i] = str[i].split(",");
        }
        for (int i = 0; i < str.length; i++) {
            for (int j = 0; j < s2[i].length; j++) {
                if (s2[i][j].equals("空"))
                    s2[i][j] = "";
                if (s2[i][j].equals("空格"))
                    s2[i][j] = "      ";
            }
        }
        return s2;
    }
    public static void print(HashMap<Integer, Cell[]> hm) {
        String value = null;
        if (hm == null) {
            System.out.println("参数传递错误");
            return;
        }
        // 输出
        for (int i = 0; i < hm.keySet().size(); i++) {
            for (int j = 0; j < hm.get(i).length; j++) {
                value = hm.get(i)[j].getContents();
                if (!value.equals("")) {
                    System.out.print(String.valueOf(hm.get(i)[j].getContents())
                            + " ");
                }
            }
            System.out.println();
        }
    }
    public static HashMap<Integer, Cell[]> m0(String filePath,
            String sheetName, String key) throws IOException, BiffException {
        // 判断文件是否有效
        if (!isFilePath(filePath)) {
            System.out.println("file【" + filePath + "】 not found!");
            return null;
        }
        // HashMap
        Map<Integer, Cell[]> hashMap = new HashMap<Integer, Cell[]>();
        File file = new File(filePath);
        // 工作薄
        Workbook wb = Workbook.getWorkbook(file);
        // 根据名字获得工作表
        Sheet sheet = wb.getSheet(sheetName);
        // 判断工作表是否存在
        if (!isSheet(wb, sheetName)) {
            System.out.println("工作表 【 " + sheetName + "】not found!");
            return null;
        }
        // 获得工作表的总行数、总列数
        int rows = getRowNum(sheet);
        int columns = getColumnNum(sheet);
        // 根据内容定位到单元格
        Cell cellKey = sheet.findCell(key);
        if (cellKey == null) {
            System.out.println("关键字 【 " + key + "】not found!");
            return null;
        }
        // key 坐标
        int yKey = cellKey.getColumn();
        int xKey = cellKey.getRow();
        // 存储数据
        Cell[] cells2 = null;
        for (int i = 0; i < (rows - xKey); i++) {
            cells2 = sheet.getRow(xKey + i);
            hashMap.put(i, cells2);
        }
        // 关闭
        wb.close();
        return (HashMap<Integer, Cell[]>) hashMap;
    }
    public static HashMap<Integer, Cell[]> m0(String filePath, String sheetName)
            throws BiffException, IOException {
        // 判断文件是否有效
        if (!isFilePath(filePath)) {
            System.out.println("file【" + filePath + "】 not found!");
            return null;
        }
        // HashMap
        Map<Integer, Cell[]> hashMap = new HashMap<Integer, Cell[]>();
        File file = new File(filePath);
        // 工作薄
        Workbook wb = Workbook.getWorkbook(file);
        // 根据名字获得工作表
        Sheet sheet = wb.getSheet(sheetName);
        // 判断工作表名称是否正确
        if (!isSheet(wb, sheetName)) {
            System.out.println("工作表 【 " + sheetName + "】not found!");
            return null;
        }
        // 获得工作表的总行数、总列数
        int rows = getRowNum(sheet);
        int columns = getColumnNum(sheet);
        // 存储数据
        Cell[] cells2 = null;
        for (int i = 0; i < rows; i++) {
            cells2 = sheet.getRow(i);
            hashMap.put(i, cells2);
        }
        wb.close();
        return (HashMap<Integer, Cell[]>) hashMap;
    }
    public static boolean isFilePath(String filePath) {
        if (new File(filePath).isFile()) {
            return true;
        }
        return false;
    }
    public static boolean isSheet(Workbook wb, String sheetName) {
        if (wb.getSheet(sheetName) != null) {
            return true;
        }
        return false;
    }
    public static int getRowNum(Sheet st) {
        if (st == null) {
            return 0;
        }
        return st.getRows();
    }
    public static int getColumnNum(Sheet st) {
        if (st == null) {
            return 0;
        }
        return st.getColumns();
    }
}

分离页面操作05-DataProvider提供测试数据

5.类DataProvider-提供测试数据
使用到的类:HashMapExcel
HashMapExcel-读取数据驱动文件excel中内容,并转为二维数组
package com.app.dataProvider;
import java.io.IOException;
import java.util.HashMap;
import jxl.Cell;
import jxl.read.biff.BiffException;
import org.testng.annotations.DataProvider;
public class DataProviderTest {
  // DataProvider如果与测试类不在同一个类中,则需要static修饰方法,excel中
    private static HashMap hm = new HashMap();
    @DataProvider(name = "loginDataProvider")
    public static Object[][] data2() throws BiffException, IOException {
        hm = HashMapExcel.m0("./excel/parameters.xls", "login", "userName");
        if(hm == null){
            return null;
        }
        return HashMapExcel.getData(hm);
    }
}

分离页面操作06-测试

6.测试
使用到的类:ElementAction

package com.test;
import static org.testng.Assert.*;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;
import com.app.pageobjects.ElementAction;
public class Tester {
    private ElementAction elementAction;
    @Test(groups="login")
    public void f0() {
        elementAction.load();
        assertEquals(elementAction.getBaseUrl(),
                elementAction.driver.getCurrentUrl());
    }
    @Test(dependsOnMethods = "f0",groups="login")
    public void f1() {
        elementAction.login();
    }
    @Test(dependsOnMethods = "f1", dataProvider = "test0", dataProviderClass = com.app.dataProvider.DataProviderTest.class)
    public void f2(String name, String pass) throws InterruptedException {
        elementAction.loginFailure(name, pass);
        // 断言 登录失败
        WebElement loginDivError = elementAction.pageElement.getLoginDivError();
        if (name.trim().equals(""))
            assertEquals("请输入登录名", loginDivError.getText());
        else if (pass.equals(""))
            assertEquals("请输入密码", loginDivError.getText());
        else
            assertEquals("登录名或密码错误", loginDivError.getText());
        Thread.sleep(3000);
    }
    @Test(dependsOnMethods = "f1",groups="login")
    public void f3() throws InterruptedException {
        elementAction.loginSuccess();
        assertEquals("发博文", elementAction.pageElement.getSgPublish().getText());
    }
    @BeforeSuite
    public void beforeSuite() {
        elementAction = ElementAction.getInstance("ff");
    }
    @AfterSuite
    public void afterSuite() {
        // blogPageService.close();
    }
}

原文地址:https://www.cnblogs.com/stay-sober/p/4158850.html