前端测试 java+selenium+testNG+excel 实现 web 网页的自动化测试

周小丽 · 2016年12月23日 · 最后由 吃小鱼的虾米 回复于 2018年05月05日 · 3699 次阅读

好久没发过帖子了,最近公司主力做微站了,以前 appium 的框架改了改,主要用 selenium 的 webdriver 来实现。好了说下主要的设计思路吧

  1. webdriver 的关键字从 excel 读取,这样测试人员只需要在 excel 中填写相关用例即可
  2. 前端微站和后台系统的用例可整合在同一 excel 中,这样可实现前端与后台的闭循环测试
  3. 除了一些基本的校验规则外,添加了微站数据库校验

接下来还是贴上一些相关代码

1. 可以设定多轮测试,每轮测试数据都不一样,测试数据来源于 excel 的 sheet_2

/**设定测试轮次**/
public static void  main() {
    try{
        for(k=0;k<numTotal;k++){
            File file = new File("e:\\data.xls");   //采用的是jxl.jar读取写入表格方式
            InputStream in = new FileInputStream(file);  //新建一可读取本地内容的文件
            Workbook workbook = null;
            workbook = Workbook.getWorkbook(in);  //获取本地可读取的文件
            mWorkBook =  workbook;              
            getExcel();
            Sheet1DataList.clear();

            /**获取cookies**/
            for (Cookie ck : driver.manage().getCookies()) {
                String CK = ck.getName() + "=" + ck.getValue() + ";";
                System.out.println("cookie:" + CK);
               // sendGet(CK);
            }           
        }
    }

2. 从 excel 获取 webdriver 关键字以及相关测试用例数据

private static void  getExcel() {
    try{        
        getTestSettingFromSheet1();
        getDataFromSheet2();
        Thread.sleep(1000);
        sqlDriver.findElement(By.name("auth[password]")).sendKeys("test@628");;
        sqlDriver.findElement(By.cssSelector("#content > form > p > input[type='submit']")).click();
        sql = sqlDriver.findElement(By.tagName("pre"));

        if(Sheet0MethodList.size() != Sheet0ItemList.size()){
            System.out.println("Input Sheet Value Wrong!!!!Please Check Your Sheet" );
        }

        for(int listId=0;listId<Sheet0ActionList.size();listId++){  
            System.out.println("Sheet0ActionList.size:" + Sheet0ActionList.size());
            System.out.println("OK,Begin Commit!!!" );
            Thread.sleep(500);  
            if(Sheet0PlatList.get(listId).equals("后台"))
                driver = backDriver;
            loginBtn = getMethods(Sheet0MethodList.get(listId),Sheet0ItemList.get(listId),driver); 
            String strCmd = Sheet0CheckList.get(listId);
            String strAct = Sheet0ActionList.get(listId);
            getAssert(strAct,strCmd,listId);
            //InputCmdId++;
        }   
    }

3.将测试结果保存到 excel 中

private static void getAssert(String getStrAct,String getStrCmd,int getListId){
    try{
        Workbook wb=Workbook.getWorkbook(new File("e:\\data.xls"));   //获取本地路径的excel文件
        WritableWorkbook book= Workbook.createWorkbook(new File("e:\\data.xls"),wb);   //将本地已存在的可读文件转成可写文件
        WritableSheet sheet0_1=book.getSheet(0);
        if(getStrAct.equals("frame")){
            Thread.sleep(1000);
            driver.switchTo().frame(loginBtn);
        }

        if(getStrAct.equals("back"))
            driver.navigate().back();

        if(getStrCmd.equals("输入值获取")){
            Thread.sleep(1000);
            String text = Sheet1DataList.get(getInputCmdId);
            System.out.println("SenKeys:"+text);
            loginBtn.sendKeys(text);    
            Thread.sleep(1000); 
            if(loginBtn.getAttribute("value").equals(text)){  
                System.out.println("成功numTotal :" + numTotal);
                sheet0_1.addCell(new Label(10+numTotal+k,getListId+1,"true"));   
                Cell AI = sheet0_1.getCell(10+numTotal+k,getListId+1);
                String strAI = AI.getContents();
                System.out.println(">>>>>>>>>>>>" + strAI);
            }
            else{
                System.out.println("失败 numTotal:" + numTotal);
                sheet0_1.addCell(new Label(10+numTotal+k,getListId+1,"false")); 
            }   
            getInputCmdId++;
        }

        if(getStrCmd.equals("文本校验")){
            loginBtn.click();
            Thread.sleep(1000);
            isContentAppeared(driver,Sheet0ReseltList.get(clickId));
            System.out.println("status:" + status); 
            String clickResult = String.valueOf(status);
            sheet0_1.addCell(new Label(10+numTotal+k,getListId+1,clickResult));     
            clickId++;
        } 
        if(getStrCmd.equals("数据库校验")){
            String currentUrl = driver.getCurrentUrl();
            System.out.println("当前页面url---:" + currentUrl); 
            String[] urlList = currentUrl.split("\\/");  
            String[] urlArry = urlList[urlList.length-1].split("\\.");  
            String orderId = urlArry[0];
            System.out.println("订单ID号:" + orderId);
            sql.clear();
            sql.sendKeys("select * from order_info where order_id = " + orderId);
            sqlDriver.findElement(By.cssSelector("#form > p:nth-child(2) > input[type='submit']:nth-child(1)")).click();
            String sqlStr = "无数据";
            isContentAppeared(sqlDriver,sqlStr);
            System.out.println("status:" + status); 
            String clickResult = String.valueOf(status);
            if(clickResult.equals("false")){
                clickResult = "true";                               
            }else{
                clickResult = "false";                              
            }
            sheet0_1.addCell(new Label(10+numTotal+k,getListId+1,clickResult)); 
            Thread.sleep(1000);             
            loginBtn.click();

          //  clickId++;
        } 

        book.write(); 
        book.close();
    }

最后我想请教大神们,在测试用例断言这块我太缺乏经验了,用例执行后不知道有什么好的断言方式,请大神们说说你们工作中的例子,一般每条用例怎么做断言,我说的是思路,而不是语法实现,我脑子思路太少,谢谢!

共收到 4 条回复 时间 点赞

页面 diff 逻辑 diff

如果是用例中的断言的话 我这边大概:
最基本的:
1,元素值断言
2,元素是否存在
3,元素数量
4,所在容器的具体位置

更深入一点:
页面截图比对
完整页面 xml 比对

我这边大概就这么多啦

有个问题想请教一下, 在写框架的时候,以 name 或者是 tagname 为 定位方式 那么被测界面出现多个相同 name 或 tagname 时 就活获取到一个 元素集合, 这个时候框架中 excel 中如何去区分这个元素的唯一性呢? 加字段么

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册