testng执行case failed ,testng Listener会捕获执行失败,如果要实现失败自动截图,需要重写Listener的onTestFailure方法

那么首先新建一个Listener 类,继承TestListenerAdapter

package com.dbyl.libarary.utils;

import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter; /**
*
* @author Young
*
*/
public class TestNGListener extends TestListenerAdapter {
Log log = new Log(this.getClass()); @Override
public void onTestSuccess(ITestResult tr) {
log.info("Test Success");
super.onTestSuccess(tr);
} @Override
public void onTestFailure(ITestResult tr) {
log.error("Test Failure");
super.onTestFailure(tr);
takeScreenShot(tr);
} private void takeScreenShot(ITestResult tr) {
UITest b = (UITest) tr.getInstance();
WebDriver currentDirver = b.getDriver();
System.out.println(currentDirver.getTitle());
b.takeScreenShot(); } @Override
public void onTestSkipped(ITestResult tr) {
log.error("Test Skipped");
super.onTestSkipped(tr);
} @Override
public void onTestStart(ITestResult result) {
log.info("Test Finsh");
super.onTestStart(result);
} @Override
public void onStart(ITestContext testContext) {
log.info("Test Start");
super.onStart(testContext);
} @Override
public void onFinish(ITestContext testContext) {
log.info("Test Finish");
super.onFinish(testContext);
} }

我这里主要重写OnTestFailure的方法

添加了一个takeScreenShot的方法

接下来在UITest类中添加截图的具体实现方法

/**
*
*/
package com.dbyl.libarary.utils; import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
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; /**
* @author Young
*
*/
public class UITest {
WebDriver driver;
Log log = new Log(this.getClass()); public WebDriver getDriver() {
return driver;
} /**
* init test case
*
* @param driver
*/
public void setDriver(WebDriver driver) {
this.driver = driver;
} public void init(WebDriver driver) {
log.info("Start WebDriver");
setDriver(driver);
} /**
* stop webdriver
*
* @param driver
*/
public void stop() {
log.info("Stop WebDriver");
driver.quit(); } /**
* @author Young
*/
public void takeScreenShot() {
SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
String dateStr = sf.format(date);
String path = this.getClass().getSimpleName() + "_" + dateStr + ".png";
takeScreenShot((TakesScreenshot) this.getDriver(), path);
} /**
* @author Young
* @param drivername
* @param path
*/
public void takeScreenShot(TakesScreenshot drivername, String path) {
// this method will take screen shot ,require two parameters ,one is
// driver name, another is file name
String currentPath = System.getProperty("user.dir"); // get current work
log.info(currentPath);
File scrFile = drivername.getScreenshotAs(OutputType.FILE);
// Now you can do whatever you need to do with it, for example copy
try {
log.info("save snapshot path is:" + currentPath + path);
FileUtils.copyFile(scrFile, new File(currentPath + "\\" + path));
} catch (Exception e) {
log.error("Can't save screenshot");
e.printStackTrace();
} finally {
log.info("screen shot finished");
}
} }

接下来在case中使用这个Listener,有两种办法, 第一种直接在case类中添加注解@Listeners({ TestNGListener.class })

case代码:

package com.dbyl.tests;

import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test; import com.dbyl.libarary.action.ViewHomePage;
import com.dbyl.libarary.utils.DriverFactory;
import com.dbyl.libarary.utils.TestNGListener;
import com.dbyl.libarary.utils.UITest;
//@Listeners({ TestNGListener.class })
public class loginTest extends UITest { WebDriver driver = DriverFactory.getChromeDriver(); @BeforeMethod(alwaysRun = true)
public void init() { super.init(driver);
ViewHomePage.setDriver(driver);
} @Test(groups = "loginTest")
public void loginByUerName() throws Exception {
ViewHomePage.viewMyProfile();
} @AfterMethod(alwaysRun = true)
public void stop() {
super.stop();
} }

第二种方法是在eclipse run config 添加如下参数-listener com.dbyl.libarary.utils.TestNGListener

这样就能实现case失败自动截图

这样,这个框架能够实现一些基本操作,下一步还需要实现失败重试 ,配合虚拟机

下载地址:https://github.com/tobecrazy/Demo

testng 失败自动截图的更多相关文章

  1. TestNG失败自动截图

    转自:https://www.cnblogs.com/tobecrazy/p/4814813.html

  2. TestNG监听器实现用例运行失败自动截图、重运行功能

    注: 以下内容引自 http://blog.csdn.net/sunnyyou2011/article/details/45894089 (此非原出处,亦为转载,但博主未注明原出处) 使用Testng ...

  3. Selenium2+python自动化67-用例失败自动截图【转载】

    前言: 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数 上一篇讲到用装饰器解决异常后自动截图,不过并没有与unittest结合,这篇把截图的装饰器改良了下,可以实现用例执行失败自动截图 ...

  4. Webdriver+Testng实现测试用例失败自动截图功能

    testng执行测试用例的时候,如果用例执行失败会自动截图,方便后续排查问题 1.首先定义一个截图类: package com.rrx.utils; import java.io.File;impor ...

  5. QTP场景恢复之用例失败自动截图

    以下代码是在QC里运行QTP来执行脚本过程,当执行过程中发现用例失败后就会自动截图,然后把用例返回到最初始的状态,模拟了场景恢复的机制 Class QCImageErrorCapture Dim qt ...

  6. TestNG实现用例运行失败自动截图(转载)

    转载自:https://blog.csdn.net/galen2016/article/details/70193684 重写Listener的onTestFailure方法 package com. ...

  7. appium自动化,失败自动截图

    1.创建监听器类TestNGListener,重写onTestFailure方法,里面定义了 监听的driver ,截图文件路径和名称 package utils; import cases.Appi ...

  8. testng失败自动重试

    使用的监听类有:IRetryAnalyzer.TestListenerAdapter.IAnnotationTransformer public class Retry implements IRet ...

  9. selenium2入门 断言失败自动截图 (四)

    一般web应用程序出错过后,会抛出异常.这个时候能截个图下来,当然是极好的. selenium自带了截图功能. //获取截图file File scrFile= ((TakesScreenshot)d ...

随机推荐

  1. vs2017 rc 离线安装包制作

    vs2017 rc 离线安装包制作 1.下载在线安装包:https://aka.ms/vs/15/release/vs_Enterprise.exe 2.制作离线安装包: vs_Enterprise. ...

  2. tensorflow 一些好的blog链接和tensorflow gpu版本安装

    pading :SAME,VALID 区别  http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...

  3. C# Winform防止一个程序重复运行

    1: //在写一些服务型的软件的时候,你可能不希望一个操作系统里有两个副本在运行,这样也许会扰乱你的操作.这时,你就需要限制程序的副本.下面的这个方法,很简单的就可以实现上述功能. using Sys ...

  4. UVa 524 Prime Ring Problem(回溯法)

    传送门 Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbe ...

  5. RBAC权限管理

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联. 简单地说,一个用户拥有若干角色,每一个角色拥有若干权限. 这样,就构造成“用户-角 ...

  6. boostrap 模态框

    <div class="modal fade" id="myModal" tabindex="-1" role="dialo ...

  7. 2016总结-->生活不只有技术和代码,还有诗和远方的田野。

    生活不只有技术和代码,还有诗和远方的田野. //---------------------------技术 1.应用框架的架构----->收银系统 一般情况开发中常用activity+fragm ...

  8. node.js

    学习网址:http://www.jdon.com/idea/nodejs/

  9. Oracle to_date()函数的用法

    Oracle to_date()函数的用法 to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明,供您参考学习. 在Orac ...

  10. linux文件及文件夹权限

    以前上学的时候简单了解了下linux,现在对它的认识也只停留在一些小白命令上.以为我只要不是做服务器端开发的应该不会去碰吧,工作了才知道做开发的多少还是要熟悉一些linux的,至少你的项目会部署在li ...