WebDriver高级应用实例(7)
7.1在测试中断言失败的步骤进行屏幕截图
目的:在测试过程中,在断言语句执行失败时,对当前的浏览器进行截屏,并在磁盘上新建一个yyyy-mm-dd格式的目录,并在断言失败时新建一个已hh-mm-ss格式的截图文件
被测网页的网址:
http://www.baidu.com
Java语言版本的API实例代码
需要新建一个Package,将FileUtil类、DateUtil类和TestFailCaptureScreen测试类3个文件都放到这个Package下
此例子借助了两个工具类来实现测试目的,此种方式将代码封装,便于提高代码的复用度,提高测试脚本编写的效率
DateUtil类:
import java.util.Date; //DataUtil类主要用于生成年、月、日、小时、分钟和秒的信息,用于生成保存截图文件目录名和文件名 public class DateUtil { /* * 格式化输出日期 * @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类:
import java.io.File; import java.io.IOException; public class FileUtil { /* * FileUtil类用于创目录和文件,此例子中只使用此类的创建目录方法,创建文件的方法仅供大家参考,将来用于根据测试需要创建指定的数据文件 * */ public static boolean createFile(String destFileName){ File file = new File(destFileName); if(file.exists()){ System.out.println("创建单个文件"+destFileName+"失败,目标文件已存在!"); return false; } if(destFileName.endsWith(File.separator)){ System.out.println("创建单个文件"+destFileName+"失败,目标文件不能为目录"); return false; } //判断目标目录是否存在 if(!file.getParentFile().exists()){ System.out.println("目标文件所在目录不存在,准备创建它!"); if(!file.getParentFile().mkdirs()){ System.out.println("创建目标文件所在目录失败"); return false; } } //创建目标文件 try { if(file.createNewFile()){ System.out.println("创建单个文件"+destFileName+"成功"); return true; }else{ System.out.println("创建单个文件"+destFileName+"失败"); return false; } } catch (IOException e) { e.printStackTrace(); System.out.println("创建单个文件"+destFileName+"失败"+e.getMessage()); return false; } } public static boolean createDir(String destDirName){ File dir = new File(destDirName); if(dir.exists()){ System.out.println("创建目录"+destDirName+"失败目标目录已经存在"); return false; } //创建目录 if(dir.mkdirs()){ System.out.println("创建目录"+destDirName+"成功!"); return true; }else{ System.out.println("创建目录"+destDirName+"失败!"); return false; } } }
TestFailCaptureScreen测试类:
import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import java.io.File; import java.util.Date; import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.Assert; import org.testng.annotations.AfterMethod; public class TestFailCaptureScreen { WebDriver driver; String url = "http://www.baidu.com"; @Test public void testSearch() { driver.findElement(By.id("kw")).sendKeys("seleium"); driver.findElement(By.id("su")).click(); try { /* * 断言页面的代码是否存在‘事在人为’这4个关键字,因页面中没有这4个字所以触发catch语句执行并触发截图操作 * */ Assert.assertTrue(driver.getPageSource().contains("事在人为")); System.out.println("assert后续执行了"); } catch (AssertionError e) { System.out.println("catch中的代码被执行了"); takeTakesScreenshot(driver); } } /* * 在测试类中声明截图的方法,截图方法调用了时间类和文件操作类的静态方法,用时间格式生成目录名称和截图文件名称 * */ public void takeTakesScreenshot(WebDriver driver) { try { //生成日期对象 Date date = new Date(); //调用DateUtil类中的方法,生成截图文件夹日期名称 String picDir = "e:\\"+String.valueOf(DateUtil.getYear(date))+"-"+String.valueOf(DateUtil.getMonth(date))+"-"+String.valueOf(DateUtil.getDay(date)); if(!new File(picDir).exists()){ FileUtil.createDir(picDir); } //调用DateUtil类中的方法,生成截图文件的时间名称 String filePath = picDir+"\\"+String.valueOf(DateUtil.getHour(new Date())) +"-"+String.valueOf(DateUtil.getMinute(new Date())) +"-"+String.valueOf(DateUtil.getSecond(new Date()))+".png"; //进行截图时将文件保存在srcFile对象中 File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); //将截图文件内容写到磁盘中生成截图文件 FileUtils.copyFile(srcFile,new File(filePath)); } catch (Exception e) { e.printStackTrace(); } } @BeforeMethod public void beforeMethod() { System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe"); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get(url); } @AfterMethod public void afterMethod() { driver.quit(); } }