51Testing软件测试论坛

标题: UI自动化测试框架之Selenium关键字驱动 [打印本页]

作者: frances720    时间: 2018-1-19 13:57
标题: UI自动化测试框架之Selenium关键字驱动
UI自动化测试框架之Selenium关键字驱动
  一、学习关键点
  使用工具:eclipse
  用到的第三方jar包:poi.jar(操作excel);selenium.jar
  理解难点:java反射机制;逐步分层
  二、框架构思
  1、编写脚本
  首先我们来写一个登陆开源中国的脚本
    publicclassLogin_Script{
  publicstaticWebDriverdriver=null;
  publicstaticvoidmain(String[]agrs)throwsInterruptedException{
  //启动火狐浏览器
  driver=newFirefoxDriver();
  //最大化
  driver.manage().window().maximize();
  //打开开源中国网址
  driver.get("http://www.oschina.net/");
  //点击登录
  driver.findElement(By.xpath("//*[@id='OSC_Userbar']/a[1]")).click();
  //输入用户名
  driver.findElement(By.xpath("//*[@id='f_email']")).sendKeys("XXXXXXB");
  //输入密码
  driver.findElement(By.xpath("//*[@id='f_pwd']")).sendKeys("XXXXXXXA");
  //点击登录按钮
  //driver.findElement(By.xpath("//*[@id='login_osc']/table/tbody/tr[7]/td/input")).click();
  //Thread.sleep(30);
  //点击退出按钮
  driver.findElement(By.xpath("//*[@id='OSC_Userbar']/a[3]")).click();
  //关闭浏览器
  driver.quit();
  }
  }
  2、脚本分析
  这是登陆的场景
  操作步骤
  第一步:启动浏览器
  第二步:输入网址
  第四步:点击登录
  第五步:输入用户名
  第六步:输入密码
  第七步:点击登录按钮
  第八步:点击退出
  第九步:关闭浏览器
  3、使用excel
  建立一个excel
[attach]110183[/attach]
  在java中创建一个操作excel的类,主要实现是对excel的读和写,主要代码如下:
 publicclassExcelUtils{
  publicstaticHSSFSheetExcelSheet;
  publicstaticHSSFWorkbookExcelBook;
  publicstaticHSSFRowRow;
  publicstaticHSSFCellCell;
  publicstaticvoidsetExcelFile(StringPath,StringSheetName)throwsException{
  FileInputStreamExcelFile=newFileInputStream(Path);
  ExcelBook=newHSSFWorkbook(ExcelFile);
  ExcelSheet=ExcelBook.getSheet(SheetName);
  }
  publicstaticvoidsetCellData(StringResult,intRowNum,intColNum,StringPath)throwsException{
  Row=ExcelSheet.getRow(RowNum);
  Cell=Row.getCell(ColNum,Row.RETURN_BLANK_AS_NULL);
  if(Cell==null){
  Cell=Row.createCell(ColNum);
  Cell.setCellValue(Result);
  }else{
  Cell.setCellValue(Result);
  }
  FileOutputStreamfileOut=newFileOutputStream(Path);
  ExcelBook.write(fileOut);
  fileOut.flush();
  fileOut.close();
  }
  publicstaticStringgetCellDate(intRowNum,intCloNum){
  Cell=ExcelSheet.getRow(RowNum).getCell(CloNum);
  StringcellData=Cell.getStringCellValue();
  returncellData;
  }
  }
  4、新建一个ActionKeyWords类
 publicclassActionKeyWords{
  publicstaticWebDriverdriver=null;
  //启动浏览器并最大化
  publicstaticvoidOpenBrowser(){
  driver=newFirefoxDriver();
  driver.manage().window().maximize();
  }
  //打开开源中国网址
  publicstaticvoidNavigate(){
  driver.get("http://www.oschina.net/");
  }
  //点击登录
  publicstaticvoidLogin_Click(){
  driver.findElement(By.xpath("//*[@id='OSC_Userbar']/a[1]")).click();
  }
  //输入用户名
  publicstaticvoidInput_Name(){
  driver.findElement(By.xpath("//*[@id='f_email']")).sendKeys("XXXXXXA");
  }
  //输入密码
  publicstaticvoidInput_Password(){
  driver.findElement(By.xpath("//*[@id='f_pwd']")).sendKeys("XXXXXXB");
  }
  //点击登录按钮
  publicstaticvoidLogin_Button(){
  driver.findElement(By.xpath("//*[@id='login_osc']/table/tbody/tr[7]/td/input")).click();
  }
  //点击退出按钮
  publicstaticvoidLogout_Click(){
  driver.findElement(By.xpath("//*[@id='OSC_Userbar']/a[3]")).click();
  }
  //关闭浏览器
  publicstaticvoidCloseBrowser(){
  driver.quit();
  }
  }
  5、修改Login_Script脚本.
 publicclassLogin_Script{
  publicstaticvoidmain(String[]agrs)throwsException{
  ExcelUtils.setExcelFile("D:\\data\\TestData.xls","steps");
  ActionKeyWordsactionKeyWords=newActionKeyWords();
  StringKeywords=null;
  for(intRowNum=1;RowNum<=ExcelUtils.getLastRowNums();RowNum++){
  Keywords=ExcelUtils.getCellDate(RowNum,3);
  if(Keywords.trim().equals("OpenBrowser")){
  actionKeyWords.OpenBrowser();
  }elseif(Keywords.trim().equals("Navigate")){
  actionKeyWords.Navigate();
  }elseif(Keywords.trim().equals("Login_Click")){
  actionKeyWords.Login_Click();
  }elseif(Keywords.trim().equals("Input_Name")){
  actionKeyWords.Input_Name();
  }elseif(Keywords.trim().equals("Input_Password")){
  actionKeyWords.Input_Password();
  }elseif(Keywords.trim().equals("Login_Button")){
  actionKeyWords.Login_Button();
  }elseif(Keywords.trim().equals("Logout_Click")){
  actionKeyWords.Logout_Click();
  }elseif(Keywords.trim().equals("CloseBrowser")){
  actionKeyWords.CloseBrowser();
  }
  }
  }
  }
  这样代码的框架就基本已经搭建起来了,代码结构如下:
  三、结构优化
  1、优化Login_Script类中的代码
  注:这里用到了反射机制
  publicclassLogin_Script{
  publicstaticActionKeyWordsactionKeyWords;
  publicstaticStringKeywords=null;
  publicstaticMethod[]method;
  publicLogin_Script(){
  actionKeyWords=newActionKeyWords();
  method=actionKeyWords.getClass().getMethods();
  }
  publicstaticvoidmain(String[]agrs)throwsException{
  ExcelUtils.setExcelFile("D:\\data\\TestData.xls","steps");
  newLogin_Script();
  for(intRowNum=1;RowNum<=ExcelUtils.getLastRowNums();RowNum++){
  Keywords=ExcelUtils.getCellDate(RowNum,3);
  login_action();
  }
  }
  publicstaticvoidlogin_action(){
  for(inti=0;i<method.length;i++){
  //System.out.println(method.getName()+""+actionKeyWords+Keywords);
  if(method.getName().trim().equals(Keywords)){
  try{
  method.invoke(actionKeyWords);
  }catch(IllegalAccessExceptione){
  //TODOAuto-generatedcatchblock
  e.printStackTrace();
  }catch(IllegalArgumentExceptione){
  //TODOAuto-generatedcatchblock
  e.printStackTrace();
  }catch(InvocationTargetExceptione){
  //TODOAuto-generatedcatchblock
  e.printStackTrace();
  }
  }
  }
  }
  }
  2、将程序中的常量统一管理
  例如:网页的地址,账户、密码,excel路径,这里我们在文件下面建立一个
  9publicclassContants{
  publicstaticStringurl="http://www.oschina.net/";
  publicstaticStringexcelFile="D:\\data\\";
  publicstaticStringexcelName="TestData.xls";
  publicstaticStringexcelSheet="steps";
  publicstaticintexcelKWCloNum=3;
  publicstaticStringuserName="XXXXXXXA";
  publicstaticStringuserPassword="XXXXXB";
  }
  3、增加对象库
  下面我们看一下ActionKeyWords类中定位元素的路径是在代码里面的,如果每次去修改的定位路径的是时候都要修改代码,为了便于维护,我们将这些元素的对象放在一个文件中,同时我们在Excel增加一列PageObjects,这样程序根据Excel中的PageObjects,去文件中读取相应的元素,这里我们增加一个类OrpUtil,读取元素的对象
  #HomePageObjects
  Userbar_login=//*[@id='OSC_Userbar']/a[1]
  Userbar_logout=//div[@id='OSC_Userbar']/a[3]
  #LoginPageObjects
  Input_name=//*[@id='f_email']
  Input_password=//*[@id='f_pwd']
  Login_button=//*[@id='login_osc']/table/tbody/tr[7]/td/input
  //OrpUtil类
  publicclassOrpUtil{
  publicstaticStringreadValue(Stringa){
  Propertiespro=newProperties();
  Stringpopath=Contants.ObjectReUrl;
  Stringvalue=null;
  try{
  InputStreamin=newBufferedInputStream(newFileInputStream(popath));
  pro.load(in);
  value=pro.getProperty(a);
  }catch(FileNotFoundExceptione){
  //TODOAuto-generatedcatchblock
  e.printStackTrace();
  }catch(IOExceptione){
  //TODOAuto-generatedcatchblock
  e.printStackTrace();
  }
  returnvalue;
  }
  }
  优化后的ActionKeyWords类
  publicclassActionKeyWords{
  publicstaticWebDriverdriver=null;
  //启动浏览器并最大化
  publicstaticvoidOpenBrowser(StringOR){
  System.setProperty("webdriver.chrome.driver",".//server//chromedriver.exe");
  driver=newChromeDriver();
  driver.manage().window().maximize();
  }
  //打开开源中国网址
  publicstaticvoidNavigate(StringOR){
  driver.get(Contants.url);
  }
  //点击登录
  publicstaticvoidLogin_Click(StringOR){
  driver.findElement(By.xpath(OrpUtil.readValue(OR))).click();
  }
  //输入用户名
  publicstaticvoidInput_Name(StringOR){
  driver.findElement(By.xpath(OrpUtil.readValue(OR))).clear();
  driver.findElement(By.xpath(OrpUtil.readValue(OR))).sendKeys(Contants.userName);
  }
  //输入密码
  publicstaticvoidInput_Password(StringOR){
  driver.findElement(By.xpath(OrpUtil.readValue(OR))).click();
  driver.findElement(By.xpath(OrpUtil.readValue(OR))).sendKeys(Contants.userPassword);
  }
  //点击登录按钮
  publicstaticvoidLogin_Button(StringOR){
  driver.findElement(By.xpath(OrpUtil.readValue(OR))).click();
  }
  //点击退出按钮
  publicstaticvoidLogout_Click(StringOR){
  try{
  Thread.sleep(300);
  driver.findElement(By.xpath(OrpUtil.readValue(OR))).click();
  }catch(InterruptedExceptione){
  //TODOAuto-generatedcatchblock
  e.printStackTrace();
  }
  }
  //关闭浏览器
  publicstaticvoidCloseBrowser(StringOR){
  driver.quit();
  }
  }
  这个OR的值是从Excel中读取的
[attach]110184[/attach]



作者: frances720    时间: 2018-1-19 14:00
  4、增加测试场景
  从Excel中我们可以看到,这操作是对应的用例编写中的我们的操作步骤,在用例设计的时候还有测试场景和结果,这里
  我们先增加个场景在EXCEL中增加一个名称为Suite的Sheet页[attach]110185[/attach]
  我们程序的运行逻辑是循环读取Suite页中的Runmode,当为YES时根据对应的TestSuiteID去读取对应的Steps页中的操作在步骤,进行运行
  publicstaticvoidmain(String[]agrs)throwsException{
  ExcelUtils.setExcelFile(Contants.excelFile+Contants.excelName);
  newLogin_Script();
  bResult=true;
  //循环读取suitSheet里面的值,找出运行的场景
  for(intj=1;j<=ExcelUtils.getLastRowNums(Contants.suitSheet);j++){
  StringRunmode=ExcelUtils.getCellDate(j,Contants.suitRunmode,Contants.suitSheet);
  StringsuitTestSuiteId=ExcelUtils.getCellDate(j,Contants.suitTestSuiteId,Contants.suitSheet);
  intsRowNum;
  if(Runmode.equals("YES")){
  //根据stepTestSuiteId在caseSheet中循环查找相对应的执行步骤
  for(sRowNum=1;sRowNum<=ExcelUtils.getLastRowNums(Contants.caseSheet);sRowNum++){
  StringstepTestSuiteId=ExcelUtils.getCellDate(sRowNum,Contants.stepTestSuiteId,Contants.caseSheet);
  System.out.println(ExcelUtils.getCellDate(sRowNum,Contants.excelKWCloNum,Contants.caseSheet));
  if(stepTestSuiteId.trim().equals(suitTestSuiteId)){
  Keywords=ExcelUtils.getCellDate(sRowNum,Contants.excelKWCloNum,Contants.caseSheet);
  r=ExcelUtils.getCellDate(sRowNum,Contants.excelPOCloNum,Contants.caseSheet);
  login_action(sRowNum);
  if(bResult==false){
  ExcelUtils.setCellData(Contants.fail,j,Contants.suitResult,Contants.excelFile+Contants.excelName,Contants.suitSheet);
  }
  }
  }
  if(bResult==true){
  ExcelUtils.setCellData(Contants.pass,j,Contants.suitResult,Contants.excelFile+Contants.excelName,Contants.suitSheet);
  }
  }else{
  System.out.println("没有要执行的用例");
  break;
  }
  }
  }
  5、增加测试结果
  在Excel中新增一列Resut
[attach]110186[/attach]
  在Login_Script中定义一个boolean类型的变量bResult,默认是true在各个地方try,,cacth,当出现异常的时候在bResult赋值为false,在Excel工具类中增加一个写入excel值得方法
[attach]110187[/attach]
  四、小结
  这样我们的关键字驱动框架就初步搭好了,下面我们回归一下基本思路:
[attach]110188[/attach]

作者: 清晨一缕阳光    时间: 2018-1-19 16:21
感谢分享!




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2