Java&Selenium自动化测试实现页面元素、页面对象及测试代码分离 一、

一、摘要 本篇博文将介绍自动化测试实现页面元素、页面对象及测试代码分离在自动化框架中的实现 二、解析页面元素定位信息 首先,将页面元素与实际的代码分离,首先我们将页面元素定位信息和定位表达式保存在属性文件中,例如我们PaaS平台提供Mysql服务的页面,在工程中新建一个名为MysqlService.properties的文件,文件中保存内容类似如下: 复制代码 [MySQL数据库服务] [MySQL数据库服务-列表] paas.mysql.refreshbutton=xpath>//*[@id='app']/section/section/main/div[2]/div/div[5]/button paas.mysql.createnewinstance=xpath>//*[@id='app']/section/section/main/div[2]/div/div[4]/button paas.mysql.searchinstancenameinput=xpath>//*[@id="app"]/section/section/main/div[2]/div/div[1]/label[1]/div/input paas.mysql.searchinstancenamebutton=xpath>//*[@id='app']/section/section/main/div[2]/div/div[1]/label[2]/button paas.mysql.searchspacename=xpath>//*[@id='app']/section/section/main/div[2]/div/div[3]/label[2]/div/div[1]/input paas.mysql.operation=xpath>//*[@id='app']/section/section/main/section/div[1]/div[3]/table/tbody/tr[1]/td[6]/div/div/span paas.mysql.operationrestart=xpath>/html/body/ul/li[1] paas.mysql.operationrelease=xpath>/html/body/ul/li[2] paas.mysql.operationmanage=xpath>/html/body/ul/li[3] paas.mysql.operationlog=xpath>/html/body/ul/li[4] paas.mysql.operationmonitor=xpath>/html/body/ul/li[5] paas.mysql.confirmrestart=xpath>/html/body/div[1]/div/div[3]/button[2] paas.mysql.cancelrestart=xpath>/html/body/div[1]/div/div[3]/button[1] paas.mysql.releaseconfirmbutton=xpath>/html/body/div[1]/div/div[3]/button[2] paas.mysql.releasecancelbutton=xpath>/html/body/div[1]/div/div[3]/button[1] [MySQL数据库服务-创建] paas.newinstance.instancename=xpath>//*[@id='app']/section/section/main/div[3]/div/div[2]/main/form/div[2]/div/div[1]/input paas.newinstance.description=xpath>//*[@id='app']/section/section/main/div[3]/div/div[2]/main/form/div[10]/div/div/textarea paas.newinstance.standard5.6=xpath>//*[@id='app']/section/section/main/div[3]/div/div[2]/main/form/div[4]/div/div/label[1]/span paas.newinstance.standard5.7=xpath>//*[@id='app']/section/section/main/div[3]/div/div[2]/main/form/div[4]/div/div/label[2]/span paas.newinstance.instancestandard=xpath>//*[@id='app']/section/section/main/div[3]/div/div[2]/main/form/div[5]/div/div/div[1]/input paas.newinstance.1c1gb=xpath>/html/body/div[2]/div[1]/div[1]/ul/li[1] paas.newinstance.1c2gb=xpath>/html/body/div[2]/div[1]/div[1]/ul/li[2] paas.newinstance.2c8gb=xpath>/html/body/div[2]/div[1]/div[1]/ul/li[3] 复制代码 三、解析定位元素属性文件 满足selenium的8中定位方式 复制代码 /* * @FileName GetElementUtil: this util is use for getting page element * @author davieyang * @create 2018-08-21 16:37 */ package util; import org.openqa.selenium.By; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class GetElementUtil { private Properties properties; /** * 用于读取存储页面元素的属性文件 * @param propFile 属性文件的绝对路径,应定义为常量 */ public GetElementUtil(String propFile){ properties = new Properties(); try{ FileInputStream in = new FileInputStream(propFile); properties.load(in); in.close(); }catch (IOException e){ System.out.println("读取对象文件出错"); e.printStackTrace(); } } /** * @param elementName 存储在属性文件中的元素名称"pass.spacemanagement.releasebutton" * @return 根据传入的页面元素名获取元素,返回元素定位 * @throws Exception "输入的locator Type 未在程序中定义:" + locatorType */ public By getLocator(String elementName) throws Exception{ //根据变量ElementNameInproFile,从属性配置文件中读取对应的配置对象 String locator = properties.getProperty(elementName); //将配置对象中的定位类型存到locatorType变量,将定位表达式的值存到locatorValue变量 String locatorType = locator.split(">")[0]; String locatorValue = locator.split(">")[1]; /** * 配置文件均默认为ISO-8859-1编码存储,使用getBytes方法可以将字符串编码转换为UTF-8 * 以此来解决读取中文为乱码的问题 */ locatorValue = new String(locatorValue.getBytes("ISO-8859-1"), "UTF-8"); //输出locatorType变量值和locatorValue变量值,验证是否赋值正确 System.out.println("获取的定位类型:" + locatorType + "\t获取的定位表达式" + locatorValue); //根据locatorType的变量值内容判断返回何种定位方式的By对象 if(locatorType.toLowerCase().equals("id")) return By.id(locatorValue); else if(locatorType.toLowerCase().equals("name")) return By.name(locatorValue); else if(locatorType.toLowerCase().equals("classname")||(locatorType.toLowerCase().equals("class"))) return By.className(locatorValue); else if(locatorType.toLowerCase().equals("tagname")||(locatorType.toLowerCase().equals("tag"))) return By.tagName(locatorValue); else if(locatorType.toLowerCase().equals("linktext")||(locatorType.toLowerCase().equals("link"))) return By.linkText(locatorValue); else if(locatorType.toLowerCase().equals("partiallinktext")) return By.partialLinkText(locatorValue); else if(locatorType.toLowerCase().equals("cssselector")||(locatorType.toLowerCase().equals("css"))) return By.cssSelector(locatorValue); else if(locatorType.toLowerCase().equals("xpath")) return By.xpath(locatorValue); else throw new Exception("输入的locator Type 未在程序中定义:" + locatorType); } } 复制代码 四、将页面元素封装成对象 复制代码 /* * @FileName StoreManagement: 封装Mysql页面对象 * @outhor davieyang * @create 2018-08-08 11:12 */ package pageobject.resourcemanagement; import util.GetElementUtil; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import static constants.Constants.MysqlService_Property; import static util.JavaScriptToDo.highLightElement; public class MySQLService { private static WebElement element = null; /**指定页面元素定位表达式配置文件的绝对路径 * */ private static GetElementUtil getElementUtil = new GetElementUtil(MysqlService_Property); private WebDriver driver; public MySQLService(WebDriver driver){ this.driver = driver; } /**返回MySQL数据库服务页面“刷新”按钮的页面元素对象 * * @param driver 浏览器驱动 * @return * @throws Exception 获取定位信息失败 */ public static WebElement refresh_Button(WebDriver driver) throws Exception{ //调用GetElementUtil中的getLocator方法获取配置文件中关于用户名的定位方式和定位表达式 element = driver.findElement(getElementUtil.getLocator("paas.mysql.refreshbutton")); highLightElement(driver, element); return element; } /**返回MySQL数据库服务页面“创建实例”按钮的页面元素对象 * * @param driver 浏览器驱动 * @return * @throws Exception 获取定位信息失败 */ public static WebElement create_New_Instance_Button(WebDriver driver) throws Exception{ //调用GetElementUtil中的getLocator方法获取配置文件中关于用户名的定位方式和定位表达式 element = driver.findElement(getElementUtil.getLocator("paas.mysql.createnewinstance")); highLightElement(driver, element); return element; } /** * * @param driver * @return * @throws Exception */ public static WebElement search_Instance_Name_Input(WebDriver driver) throws Exception{ //调用GetElementUtil中的getLocator方法获取配置文件中关于用户名的定位方式和定位表达式 element = driver.findElement(getElementUtil.getLocator("paas.mysql.searchinstancenameinput")); highLightElement(driver, element); return element; } /**返回MySQL数据库服务页面MySQL名称检索控件的页面元素对象 * * @param driver 浏览器驱动 * @return * @throws Exception 获取定位信息失败 */ public static WebElement search_Instance_Name_Button(WebDriver driver) throws Exception{ //调用GetElementUtil中的getLocator方法获取配置文件中关于用户名的定位方式和定位表达式 element = driver.findElement(getElementUtil.getLocator("paas.mysql.searchinstancenamebutton")); highLightElement(driver, element); return element; } /**返回MySQL数据库服务页面运行空间检索控件页面元素对象 * * @param driver 浏览器驱动 * @return * @throws Exception 获取定位信息失败 */ public static WebElement search_Space_Name(WebDriver driver) throws Exception{ //调用GetElementUtil中的getLocator方法获取配置文件中关于用户名的定位方式和定位表达式 element = driver.findElement(getElementUtil.getLocator("paas.mysql.searchspacename")); highLightElement(driver, element); return element; } } 复制代码 五、测试代码 复制代码 package testscript; import org.apache.log4j.xml.DOMConfigurator; import org.openqa.selenium.*; import org.testng.Assert; import org.testng.annotations.*; import util.KeyActionsUtil; import static util.KeyActionsUtil.*; import java.util.List; import static appmodule.MysqlService.linkToMysqlPage; import static util.KeyBoardUtil.pressTabKey; import static util.LogUtil.info; import static pageobject.resourcemanagement.MySQLService.*; import static util.ScrollBarUtil.scrolltoBottom; import static util.WaitElementUtil.sleep; // @Listeners({util.TestReport.class}) public class Test_Mysql { static { DOMConfigurator.configure("log4j.xml"); } @BeforeClass public void setUp()throws Exception { WebDriver driver = KeyActionsUtil.initBrowser("chrome"); linkToMysqlPage(driver, "yangdawei", "alex005x"); sleep(2000); } @Test(priority = 0, description = "测试创建mysql数据库服务1CPU2G") public void test_CreateMysqlInstance() throws Exception { create_New_Instance_Button(driver).click(); info("点击创建实例按钮..."); sleep(1000); info("等待3秒..."); instance_Name_in_Create_Instance_Dialog(driver).sendKeys("automationtest"); info("输入实例名:automationtesta"); sleep(1000); info("等待3秒..."); //页面存在相同属性的元素,取所有放到list里,用序号操作 List radios = driver.findElements(By.className("el-radio-button__inner")); radios.get(1).click(); sleep(1000); info("选择数据库版本5.7..."); instance_Standard_in_Create_Instance_Dialog(driver).click(); info("点击实例规格..."); sleep(2000); info("等待2秒..."); one_Core_two_GB(driver).click(); info("选择1CPU2GB..."); storage_Space_in_Create_Instance_Dialog(driver).clear(); info("清空存储空间字段..."); storage_Space_in_Create_Instance_Dialog(driver).sendKeys("1"); info("输入1G...."); scrolltoBottom(driver); sleep(2000); pressTabKey(); outsideaccess_Checkbox_in_Create_Instance_Dialog(driver).click(); info("选择外部链接..."); password_in_Create_Instance_Dialog(driver).sendKeys("111111"); info("输入密码111111..."); repassword_in_Create_Instance_Dialog(driver).sendKeys("111111"); info("确认密码111111..."); description_in_Create_Instance_Dialog(driver).sendKeys("automationtest"); info("描述信息输入automationtest"); sleep(2000); submit_Button_in_Create_Instance_Dialog(driver).sendKeys(Keys.ENTER); info("确认创建..."); sleep(2000); refresh_Button(driver).click(); Assert.assertTrue(driver.getPageSource().contains("automationtest")); Assert.assertTrue(driver.getPageSource().contains("创建中")); } @Test(priority = 1, description = "重启mysql服务") public void test_RestartMysqlInstance()throws Exception { operation_Button(driver).click(); info("点击列表里最后一列的..."); sleep(2000); info("等待3秒..."); operation_Restart_Button(driver).click(); info("点击下拉菜单中的重启按钮..."); sleep(2000); info("等待3秒..."); restart_Confirm_Button(driver).click(); info("点击确定按钮..."); sleep(2000); info("等待3秒..."); Assert.assertTrue(driver.getPageSource().contains("重启请求成功")); Assert.assertTrue(driver.getPageSource().contains("重启中")); } @Test(priority = 2, description = "管理mysql服务页面") public void test_Review_Basic_Mysql_Info()throws Exception{ operation_Button(driver).click(); info("点击列表里最后一列的..."); sleep(2000); info("等待3秒..."); operation_Manage_Button(driver).click(); info("点击下拉菜单里的管理按钮..."); sleep(2000); info("等待三秒"); assertString(driver,"基本信息"); } @Test(priority = 3, description = "管理mysql服务页面") public void test_Review_Mysql_Link()throws Exception{ database_Link_Tab(driver).click(); sleep(2000); Assert.assertTrue(driver.getPageSource().contains("210.13.50.105")); } @Test(priority = 4,description = "查看Mysql日志") public void test_ReviewLog()throws Exception{ operation_Button(driver).click(); info("点击列表里最后一列的..."); sleep(2000); info("等待3秒..."); operation_Log_Button(driver).click(); info("点击下拉菜单中的日志按钮..."); sleep(2000); info("等待3秒..."); extend_Button_in_Log_Page(driver).click(); info("点击展开按钮..."); sleep(2000); info("等待3秒..."); datefrom_in_Log_Page(driver).click(); info("点击第一个日期空间,弹出下拉..."); sleep(2000); info("等待3秒..."); datefrom_by_Date_in_Log_Page(driver).clear(); datefrom_by_Date_in_Log_Page(driver).sendKeys("2018-09-01"); info("输入日期”2018-09-01"); sleep(2000); info("等待3秒..."); datefrom_Sure_Button_in_Log_Page(driver).click(); info("点击确定按钮..."); sleep(2000); info("等待3秒..."); search_Button_in_Log_Page(driver).click(); info("点击筛选按钮..."); sleep(2000); info("等待3秒..."); Assert.assertTrue(driver.getPageSource().contains("Initializing database")); } @Test(priority = 5, description = "查看Mysql服务监控") public void test_MonitorMysqlService()throws Exception{ operation_Button(driver).click(); info("点击列表里最后一列的..."); sleep(3000); info("等待3秒..."); operation_Monitor_Button(driver).click(); info("点击下拉菜单里的监控按钮...");
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信