51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1771|回复: 2
打印 上一主题 下一主题

[资料] UI自动化测试框架之Selenium关键字驱动

[复制链接]
  • TA的每日心情
    奋斗
    2015-8-28 12:55
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]测试营长

    跳转到指定楼层
    1#
    发表于 2018-1-19 13:57:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    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

      在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中读取的



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-8-28 12:55
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]测试营长

    2#
     楼主| 发表于 2018-1-19 14:00:10 | 只看该作者
      4、增加测试场景
      从Excel中我们可以看到,这操作是对应的用例编写中的我们的操作步骤,在用例设计的时候还有测试场景和结果,这里
      我们先增加个场景在EXCEL中增加一个名称为Suite的Sheet页
      我们程序的运行逻辑是循环读取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

      在Login_Script中定义一个boolean类型的变量bResult,默认是true在各个地方try,,cacth,当出现异常的时候在bResult赋值为false,在Excel工具类中增加一个写入excel值得方法

      四、小结
      这样我们的关键字驱动框架就初步搭好了,下面我们回归一下基本思路:

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-17 16:50 , Processed in 0.071552 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表