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();
  }

}

  

posted @ 2019-03-15 11:21  心生意动  阅读(119)  评论(0编辑  收藏  举报