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文件里面还有一个当前时间的文件夹及截图,如下图所示:

 

posted @ 2020-02-10 16:46  酱醋茶cha  阅读(947)  评论(0编辑  收藏  举报