testng失败截图,注解方式调用。

今天一整天都在研究testng失败截图的方法,参考网上的前辈们的资料,加上自己的理解,终于搞出来了。

package com.dengnapianhuahai;
/**
 * 自定义注释
 * 
 */
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface MyAnnotation {

}
package com.dengnapianhuahai;
 * 测试类
 */
import org.testng.Assert;
import org.testng.annotations.Test;
//这里继承MyDriver类是因为MyDriver类里面实例化了driver,这里只是拿来用。
//MyDriver的作用就是生成一个全局变量的driver。
//Info 与 MyTestListener只是在用这个在MyDriver中定义好的WebDriver类型的变量driver而已。
public class Info extends MyDriver {
    @Test
    @MyAnnotation
    public void open() {
        driver.manage().window().maximize();
        driver.get("http://www.baidu.com");
        driver.getTitle();
        Assert.assertEquals(driver.getTitle(), "百度一下,..你就知道");

    }
}
package com.dengnapianhuahai;

import java.io.File;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
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 org.testng.ITestResult;
import org.testng.TestListenerAdapter;

public class MyTestListener extends TestListenerAdapter {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
    String mDateTime = formatter.format(new Date());

    @Override
    public void onTestFailure(ITestResult result) {
        super.onTestFailure(result);

        try {
          //用getInstance()方法生产实例然后强制转换为需要的类型(MyDriver),以获得全局变量driver;
            WebDriver driver = ((MyDriver) result.getInstance()).getMyDriver();
          //result.getMethod().getConstructorOrMethod().getMethod();之所以用三个个体getMethod()方法,是因为类型与等号左边的不一致。
            Method method = result.getMethod().getConstructorOrMethod().getMethod();

            if (method.isAnnotationPresent(MyAnnotation.class)) {

                File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

                FileUtils.copyFile(scrFile, new File("e:\\" + mDateTime + ".png"));
            }
        } catch (Exception e) {
            e.printStackTrace();

        }
    }
}
package com.dengnapianhuahai;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
/**
 * 
 * @author 等那片花海
 * 
 *作为一个全局变量driver
 */
public class MyDriver {
    
    WebDriver driver = new FirefoxDriver();

    public WebDriver getMyDriver() {
        return this.driver;
    }
}
<suite name="TestNGSuite">
<listeners>
        <listener class-name="com.dengnapianhuahai.MyTestListener" />
    </listeners>
    <test name="test1">
    <classes>
        <class name="com.dengnapianhuahai.Info" />
        
        </classes>
    </test>
</suite>

 

posted @ 2016-07-23 17:18  等那片花海  阅读(354)  评论(0编辑  收藏  举报