Page Object设计模式
对一UI经常变动的自动化测试,可以采用Page Object 设计模式,Page Object 主要是对界面元素和基本操作进行封装,这样可以使测试用例更关注与业务而非界面细节,提高测试案例的可读性,且可以减少代码的重复性并提高可维护性。
下面以selenium自动化测试入门到进阶 一 中的用例来封装成Page Object模式为例
封装后项目框架如下
pages包下面存放封装页面元素的类
获取导入客户弹窗的元素
ImportCustomerPage.java
package com.kdzwy.pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By.ByXPath;
/*
*包名:com.kdzwy.pages
*作者:灵枢
*时间:2017-7-18 下午2:36:10
*描述:获取导入客户弹窗的元素
**/
public class ImportCustomerPage {
private static WebElement element = null;
//客户名称输入框
public static WebElement cusNameInput(WebDriver driver) {
WebElement element = driver.findElement(By.xpath("(//*[@id='con-wraper']//form//input)[1]"));
return element;
}
//确认按钮
public static WebElement confirmBtn(WebDriver driver) {
WebElement element = driver.findElement(By.xpath("//*[@id='con-wraper']/div[@class='el-dialog__wrapper addCustomer']//button[2]"));
return element;
}
}
获取服务管理页面元素
ServiceManagePage.java
package com.kdzwy.pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
/*
*包名:com.kdzwy.pages
*作者:灵枢
*时间:2017-7-18 下午4:57:32
*描述:服务管理页面元素
**/
public class ServiceManagePage {
private static WebElement element = null;
//代账服务标签
public static WebElement AgencyLabel(WebDriver driver) {
WebElement element = driver.findElement(By.xpath("//span[text()='代账服务']"));
return element;
}
//下拉菜单
public static WebElement dropdownBtn(WebDriver driver){
WebElement element = driver.findElement(By.xpath("//*[@id='control-con']//div[@class='el-dropdown']"));
return element;
}
//导入客户按钮
public static WebElement importBtn(WebDriver driver){
WebElement element = driver.findElement(By.xpath("//ul[@class='el-dropdown-menu']//li[text()='导入客户']"));
return element;
}
//导入成功提示语
public static WebElement tipText(WebDriver driver){
WebElement element = driver.findElement(By.xpath("//div[@class='el-message__group']//p[text()='新增客户成功']"));
return element;
}
//搜索文本框
public static WebElement searchInput(WebDriver driver){
WebElement element = driver.findElement(By.xpath("//input[@placeholder='企业名称/编号']"));
return element;
}
//搜索确认按钮
public static WebElement searchBtn(WebDriver driver){
WebElement element = driver.findElement(By.xpath("//div[@class='el-input el-input--small el-input-group el-input-group--append']"
+ "//button[@class='el-button el-button--default']"));
return element;
}
//获取搜索结果的第一个客户
public static WebElement firstSearchResult(WebDriver driver){
WebElement element = driver.findElement(By.xpath(".//*[@id='con-wraper']/div[1]/div[5]/div/div[2]/div[1]"));
return element;
}
}
Operate包下面存放封装页面基本操作的类
封装导入客户弹窗的公共操作
ImportCustomerOperate.java
package com.kdzwy.operate;
import org.openqa.selenium.WebDriver;
import com.kdzwy.pages.ImportCustomerPage;
/*
*包名:com.kdzwy.operate
*作者:灵枢
*时间:2017-7-18 下午5:13:53
*描述:封装导入客户弹窗的公共操作
**/
public class ImportCustomerOperate {
//导入单个客户
public static void importOneCustomer(WebDriver driver,String customerName){
// 获取输入用户名文本框,并输入客户名
ImportCustomerPage.cusNameInput(driver).sendKeys(customerName);
// 点击确定按钮
ImportCustomerPage.confirmBtn(driver).click();
}
//批量导入客户
public static void importBatchCustomer(WebDriver driver){
}
}
封装服务管理页面的公共操作
ServiceManageOperate.ava
package com.kdzwy.operate;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import com.kdzwy.bean.Customer;
import com.kdzwy.pages.ServiceManagePage;
/*
*包名:com.kdzwy.operate
*作者:灵枢
*时间:2017-7-18 下午5:14:33
*描述:封装服务管理页面的公共操作
**/
public class ServiceManageOperate {
//搜索客户
public static void searchCustomer(WebDriver driver,String customerName){
ServiceManagePage.AgencyLabel(driver).click();
// 获取搜索文本框,并输入用户名
WebElement searchInput = ServiceManagePage.searchInput(driver);
searchInput.clear();
searchInput.sendKeys(customerName);
// 点击搜索
ServiceManagePage.searchBtn(driver).click();
}
}
cases包下面存放测试用例类
最后的测试用例如下:
AgencyServiceCase.java
package com.kdzwy.cases;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import com.kdzwy.bean.Customer;
import com.kdzwy.operate.ImportCustomerOperate;
import com.kdzwy.operate.ServiceManageOperate;
import com.kdzwy.pages.ImportCustomerPage;
import com.kdzwy.pages.ServiceManagePage;
import com.kdzwy.publics.CommonMethods;
/*
*包名:com.kdzwy.case
*作者:灵枢
*时间:2017-5-25 上午10:27:31
*描述:代账服务自动化用例
**/
public class AgencyServiceCase {
private static ChromeDriver driver;
@BeforeClass
public static void setUp() {
// 设置chrome驱动器的地址
System.setProperty("webdriver.chrome.driver","resource/chromedriver.exe");
driver = new ChromeDriver();
// 识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement 异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// 浏览器窗口最大化
driver.manage().window().maximize();
// 调用封装后的登录方法,传入driver、用户名和密码
CommonMethods.login(driver, "13152640586", "123456@");
}
@AfterClass
public static void tearDown() {
driver.quit();
}
@Test
public static void testImportCustomer() throws Exception {
// 线程停1s,等待页面加载
Thread.sleep(1000);
// 通过CommonMethods.getCurrentTime()获取当期时间
String customerName = "AutoTest" + CommonMethods.getCurrentTime();
// 点击代账服务标签
ServiceManagePage.AgencyLabel(driver).click();
// 点击下拉选项
ServiceManagePage.dropdownBtn(driver).click();
Thread.sleep(1500);
// 获得“导入客户”元素,该元素直接点击会报“element not visible”,所以用js来执行点击事件
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click()", ServiceManagePage.importBtn(driver));
//调用PageObject封装后的操作
ImportCustomerOperate.importOneCustomer(driver, customerName);
// 获取新增客户成功的提示语
String successTip = ServiceManagePage.tipText(driver).getText();
// 验证提示语是否正确
Assert.assertEquals(successTip, "新增客户成功");
System.out.println("导入的客户名:" + customerName);
Customer.setCustomerName(customerName);
}
@Test
public static void testSearchCustomer() throws Exception {
Thread.sleep(1000);
// 获取要搜索的客户名
String customerName =Customer.getCustomerName();
//调用PageObject封装后的操作
ServiceManageOperate.searchCustomer(driver, customerName);
Thread.sleep(3000);
// 获取搜索结果的第一个客户名称
String resultName = ServiceManagePage.firstSearchResult(driver).getText();
// 验证搜索结果的第一个客户名称是否和输入的客户名相同
Assert.assertEquals(resultName, customerName);
}
}
项目源码下载:http://download.csdn.net/detail/galen2016/9903268
下一篇介绍testng自动获取用例失败截图,以及谷歌浏览器定位插件xpathHelper