zoukankan      html  css  js  c++  java
  • java-selenium 测试断言失败进行截图

      目的:

      在测试过程中,断言失败的时候,对当前浏览器显示的内容进行截屏操作,把截图文件保存到磁盘。

      步骤:新建名为 cn.ErrorScreenshot的package,并在此包下新建DataUtil类、FileUtil类、Screenshot类和TestCase类。

      DataUtil类的代码如下:

    package cn.ErrorScreenshot;
    
    import java.util.Date;
    
    //DataUtil类主要用于生成年、月、日、时、分、秒的信息,用于生成保存截图文件目录名和文件名
    public class DataUtil{
        //格式化输入日期,@return 返回字符型日期
        public static String format(java.util.Date date,String format){
            String result="";
            try{
                if(date != null){
                    java.text.DateFormat df=new java.text.SimpleDateFormat(format);
                    result=df.format(date);
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return result;
        }
        
        //返回年份   @return返回年份
        public static int getYear(java.util.Date date){
            java.util.Calendar c=java.util.Calendar.getInstance();
            c.setTime(date);
            return c.get(java.util.Calendar.YEAR);
        }
        
        //返回月份 @return返回月份
        public static int getMonth(java.util.Date date){
            java.util.Calendar c= java.util.Calendar.getInstance();
            c.setTime(date);
            return c.get(java.util.Calendar.MONTH)+1;
        }
        
        //返回在月份中的第几天  @return返回月份中的第几天
        public static int getDay(java.util.Date date){
            java.util.Calendar c= java.util.Calendar.getInstance();
            c.setTime(date);
            return c.get(java.util.Calendar.DAY_OF_MONTH);
        }
        
        /*
         * 返回小时
         * @param date
         * 日期
         * @return返回小时
         */
        public static int getHour(java.util.Date date){
            java.util.Calendar c=java.util.Calendar.getInstance();
            c.setTime(date);
            return c.get(java.util.Calendar.HOUR_OF_DAY);
        }
        
        /*
         * 返回分钟
         * @param date
         * 日期
         * @return返回分钟
         */
        public static int getMinute(java.util.Date date){
            java.util.Calendar c=java.util.Calendar.getInstance();
            c.setTime(date);
            return c.get(java.util.Calendar.MINUTE);
        }
        
        /*
         * 返回秒
         * @param date
         * 日期
         * @return返回秒
         */
        public static int getSecond(java.util.Date date){
            java.util.Calendar c=java.util.Calendar.getInstance();
            c.setTime(date);
            return c.get(java.util.Calendar.SECOND);
        }
    }

      FileUtil类代码如下:

      本类调用Log4j方法,log4j相关代码可参考:java-selenium 使用log4j在测试过程中打印执行日志  如不需要去掉本类中相关代码即可

    package cn.ErrorScreenshot;
    
    import java.io.File;
    import java.io.IOException;
    
    //自己工程目录下的log4j代码
    import cn.Log4j.Log;
    
    //FileUtil 类用于创建目录和文件,此例子只是用此类的创建目录的方法
    public class FileUtil{
        final static Log log=Log.getlogger(FileUtil.class);
        
        public static boolean createFile(String destFileName){
            File file=new File(destFileName);
            if(file.exists()){
                Log.info("创建单个文件"+destFileName+"失败,目标文件已存在!");
                return false;
            }
            if(destFileName.endsWith(file.separator)){
                Log.info("创建单个文件"+destFileName+"失败,目标文件不能为目录!");
                return false;
            }
            //判断目标文件所在目录是否存在
            if(!file.getParentFile().exists()){
                //如果目标文件所在的目录不存在,则创建父目录
                Log.info("目录文件所在目录不存在,准备创建它!");
                if(!file.getParentFile().mkdirs()){
                    Log.info("创建目标文件所在目录失败!");
                    return false;
                }
            }
            //创建目标问价
            try{
                if(file.createNewFile()){
                    Log.info("创建单个文件"+destFileName+"成功!");
                    return true;
                }else{
                    Log.info("创建单个文件"+destFileName+"失败!");
                    return false;
                }
            }catch(IOException e){
                e.printStackTrace();
                Log.info("创建单个文件"+destFileName+"失败!"+e.getMessage());
                return false;
            }
        }
        public static boolean createDir(String destDirName){
            File dir=new File(destDirName);
            if(dir.exists()){
                Log.info("创建目录"+destDirName+"失败,目标目录已存在");
                return false;
            }
            //创建目录
            if(dir.mkdirs()){
                Log.info("创建目录"+destDirName+"成功!");
                return true;
            }else{
                Log.info("创建目录"+destDirName+"失败!");
                return false;
            }
        }
    
    }

      Screenshot类代码如下:

    package cn.ErrorScreenshot;
    
    import java.io.File;
    import java.util.Date;
    
    import org.apache.commons.io.FileUtils;
    import org.openqa.selenium.OutputType;
    import org.openqa.selenium.TakesScreenshot;
    import org.openqa.selenium.WebDriver;
    import cn.ErrorScreenshot.DataUtil;
    import cn.ErrorScreenshot.FileUtil;
    
    public class Screenshot{
    
    
        /*
         *截图方法,调用了时间类和文件操作类的静态方法并传入一个String类型的CaseName参数
         *用来以yyyy-MM-dd的格式生成目录,HH时mm分ss秒加CaseName的格式命名文件名。如果命
         *名不需要CaseName去掉代码中的两处CaseName即可。
         */
        public static void DN(WebDriver driver,String CaseName) {
            try{
                //生成日期对象
                Date date=new Date();
                //调用DateUtil类中的方法,生成截图所在的文件夹日期类型
                String picDir="C:\"+"errorScreenshot"+"\"+String.valueOf(DataUtil.getYear(date))+"-"
                +String.valueOf(DataUtil.getMonth(date))+"-"+String.valueOf(DataUtil.getDay(date));
                if(!new File(picDir).exists()){
                    FileUtil.createDir(picDir);
                }
                //调用DataUtil类中的方法,生成截图文件的时间名称
                String filePath=picDir+"//"+String.valueOf(DataUtil.getHour(new Date()))+"时"+
                String.valueOf(DataUtil.getMinute(new Date()))+"分"+
                String.valueOf(DataUtil.getSecond(new Date()))+"秒"+CaseName+".png";
                //进行截图,并将文件内容保存在srcFile对象中
                File srcFile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    //            File scrFile = new File("");
    //            scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
                //将截图文件内容写入磁盘中,生成截图文件
                FileUtils.copyFile(srcFile, new File(filePath));
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    
    }

      TestCase类代码如下:

    package cn.ErrorScreenshot;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.Assert;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Test;
    
    public class TestCase {
        WebDriver driver;
        @BeforeMethod
        public void Bfore(){
            System.setProperty("webdriver.chrome.driver","E://chromedriver.exe");
            driver=new ChromeDriver();
            driver.get("http://www.baidu.com");
        }
        @Test
        public void test(){
            driver.findElement(By.id("kw")).sendKeys("java");
            driver.findElement(By.id("su")).click();
            //创建一个WebDriverWait对象,设置等待时长5秒
            WebDriverWait w=new WebDriverWait(driver,5);
            //等待百度搜索结果页面中class属性值为 nums_text的元素
            w.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("nums_text")));
            try{
                //断言页面源码包含  selenium
                Assert.assertTrue(driver.getPageSource().contains("selenium"));            
            }catch(AssertionError e){
                //断言失败则调用截图方法进行截图
                //传入用例名字  搜索java,在截图文件命名中的时间后面加上用例名
                Screenshot.DN(driver,"搜索java");
            }
        }
        @AfterMethod
        public void After(){
            driver.quit();
        }
    
    }

      运行TestCase测试类结束后,电脑C盘会生成errorScreenshot文件夹,errorScreenshot文件里面还有一个当前时间的文件夹及截图,如下图所示:

  • 相关阅读:
    git命令设置
    spring boot之常用注解(二)
    spring boot之入门配置(一)
    Java核心技术第四章——2.final 和 static
    Java核心技术第四章——1.封装性
    Flutter学习笔记(1)--环境安装
    Android 遍历手机应用,跳转应用市场详情页面
    Android 布局渲染流程与卡顿优化
    weex 数据绑定,动态控制组件的显示内容及样式
    weex常用属性梳理
  • 原文地址:https://www.cnblogs.com/puhongjun/p/12291525.html
Copyright © 2011-2022 走看看