UI自动化中Selenium WebDriver如何截图?这里有答案!
前言
由于在使用Java Selenium做UI自动化的时候,需要在测试方法执行出现Fail的情况下,将当前界面截图并保存在项目指定目录中,最后在Jenkins中执行项目代码后,并将截图与测试报告发送到指定邮箱。下面将几种语言的Selenium的截图方式及实际Java Selenium截图项目实例分享出来。
一、各语言下截图实现方式
参考链接如下,由于可能链接打开较慢,将常用几种语言的实现方式写在下面。https://stackoverflow.com/questions/3422262/how-to-take-screenshot-with-selenium-webdriver
1.1 Jav实现
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("c:\\tmp\\screenshot.png"));
1.2 Python实现
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.google.com/')
browser.save_screenshot('screenie.png')
1.3 C#实现
public void TakeScreenshot()
{
try
{
Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
ss.SaveAsFile(@"D:\Screenshots\SeleniumTestingScreenshot.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw;
}
}
1.4 JavaScript实现
driver.takeScreenshot().then(function(data){
var base64Data = data.replace(/^data:image\/png;base64,/,"")
fs.writeFile("out.png", base64Data, 'base64', function(err) {
if(err) console.log(err);
});
});
二、UI自动化项目实际案例
2.1 实现思路
使用代码截图: 由于项目是Java Selenium实现的,所以实际截图就使用上面Java语言的截图方式。
File sourceFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
截图保存指定目录:面截图是生成了一个File文件,可以使用FileUtils工具类将文件保存到指定目录即可。FileUtils工具类的使用方法可以参考下面链接:https://blog.csdn.net/qq_42402854/article/details/83374559
截图文件名称:实际场景中,我们需要对截图文件命名,然后将文件名和保存目录拼接中,使用FileUtils拷贝文件。由于该项目中是用的Testng的测试框架,就使用Testng提供的ITestResult,来获取@Test方法的相关信息。获取测试方法的类名,然后拼接当前时间即可。ITestResult接口使用参考链接:https://blog.csdn.net/hujyhfwfh2/article/details/84842885
2.2 实际案例代码
public class ScreenShot{
/**
* 定义截图存储的目录
* System.getProperty("user.dir") 获取项目的文件夹路径
* File.separator 系统文件目录分隔符
* */
private static String screenShotDirPath = System.getProperty("user.dir") + File.separator +"target" + File.separator + "test-output" + File.separator + "errorScreenShot";
/**
* 截图并保存在指定目录
* @param driver Webdriver对象
* @param iTestResult ITestResult对象,Testng提供的一个接口,监听@Test注释的方法
*/
public static void takeScreenShot(WebDriver driver,ITestResult iTestResult) {
/**
* 1.创建指定路径的文件夹
* */
/*创建File对象*/
File screenShotDir = new File(screenShotDirPath);
/*判断路径,如果路径不存在且路径是不是文件夹,才创建该文件夹*/
if (!screenShotDir.exists() && !screenShotDir.isDirectory()) {
screenShotDir.mkdirs();
}
/**
* 2.利用Testng的iTestResult获取类名
* */
/*获取至类名的字符串*/
String className=iTestResult.getInstanceName();
log.info("\n获取的至类名的字符串为"+className);
/*利用.来分割字符串并得到最后的类名*/
String []name=className.split("\\.");
String currentClassName=name[name.length-1];
log.info("\n获取的类名为"+currentClassName);
/**
* 3.利用时间类获取当前时分秒
* */
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH点mm分ss秒");
String time = simpleDateFormat.format(new Date());
/**
* 4.利用TakesScreenshot.getScreenshotAs截图
* */
try {
/*java Selenium截图*/
File sourceFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
/*利用FileUtils拷贝文件*/
FileUtils.copyFile(sourceFile, new File(screenShotDirPath + File.separator + currentClassName + time + ".png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
log.info(System.getProperty("user.dir"));
log.info(File.separator);
}
}
2.3 实际调用位置
在Testng中,创建监听器类,继承Testng定义的监听器类TestListenerAdapter,然后在方法失败时调用截图类即可。具体Testng监听器可以看我前面写文章:
4j
public class TestLogListener extends TestListenerAdapter {
.......
public void onTestFailure(ITestResult iTestResult) {
WebDriver driver = BaseTest.driverBase.getDriver();
System.out.print( "report_driver_fail:" + driver );
super.onTestFailure( iTestResult );
log.error( String.format( "========%s.%s测试失败,失败原因如下:\n%s========", iTestResult.getInstanceName(), iTestResult.getName(), iTestResult.getThrowable() ));
// 失败截图
ScreenShot.takeScreenShot( driver,iTestResult);
}
........
}