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文件里面還有一個當前時間的文件夾及截圖,如下圖所示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM