目的:
在測試過程中,斷言失敗的時候,對當前瀏覽器顯示的內容進行截屏操作,把截圖文件保存到磁盤。
步驟:新建名為 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文件里面還有一個當前時間的文件夾及截圖,如下圖所示: