package org.webdriver.patatiumwebui.utils; import org.testng.TestListenerAdapter; import org.testng.ITestResult; import org.openqa.selenium.WebDriver; import org.webdriver.patatiumwebui.utils.ScreenShot; import org.webdriver.patatiumwebui.utils.TestBaseCase; import org.webdriver.patatiumwebui.utils.Log; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * 监听器类 * @author Administrator 郑树恒 * */ public class TestListener extends TestListenerAdapter{ Log log=new Log(this.getClass()); //输出失败结果详情 public static StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<failed>\n"); String path="test-output\\failed.xml"; File file=new File(path); FileWriter fileWriter=null; //输出成功结果详细信息 public static StringBuffer sb2=new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<passed>\n"); String path2="test-output\\passed.xml"; File file2=new File(path2); FileWriter fileWriter2=null; FileManger fileManger=new FileManger(); @Override public void onTestStart(ITestResult tr) { //tr.getTestContext() //方法开始前初始化报表描述信息 Assertion.errors.clear(); Assertion.errorIndex=0; Assertion.messageList.clear(); ElementAction.noSuchElementExceptions.clear(); log.info("测试用例:"+tr.getMethod().getDescription()+"---start"); } @Override public void onTestFailure( ITestResult tr) { //this.handAssertion(tr); TestBaseCase testBaseCase=(TestBaseCase) tr.getInstance(); WebDriver driver=testBaseCase.driver; ScreenShot screenShot=new ScreenShot(driver); //设置截图名字 screenShot.setscreenName(tr.getMethod().getDescription()+Assertion.errorIndex.toString()); log.error(Assertion.errorIndex.toString()); screenShot.takeScreenshot(); for(int i=0;i<Assertion.messageList.size();i++) { if (tr.getParameters().length>0) { sb.append("<err_assert_info"+" method=\""+tr.getTestClass().getName()+"."+tr.getMethod().getMethodName()+"."+tr.getEndMillis()+"\">\n"); } else { sb.append("<err_assert_info"+" method=\""+tr.getTestClass().getName()+"."+tr.getMethod().getMethodName()+"\">\n"); } if(Assertion.messageList.get(i).contains("pass")) { sb.append("<span class=\"pass_span\">"+Assertion.messageList.get(i)+"</span></br>\n"); } else if(Assertion.messageList.get(i).contains("failed")) { sb.append("<span class=\"err_span\">"+Assertion.messageList.get(i)+"</span></br>\n"); } else if(Assertion.messageList.get(i).contains("点击查看大图")) { sb.append("<span class=\"err_span\">"+Assertion.messageList.get(i)+"</span>\n"); } sb.append("</err_assert_info>\n"); } for (Exception e : ElementAction.noSuchElementExceptions) { StackTraceElement[] errorTraces = e.getStackTrace(); StackTraceElement[] et = this.getKeyStackTrace(tr, errorTraces); if (tr.getParameters().length>0) { sb.append("<err_assert_info_StackTrace"+" method=\""+tr.getTestClass().getName()+"."+tr.getMethod().getMethodName()+"."+tr.getEndMillis()+"\">\n"); } else { sb.append("<err_assert_info_StackTrace"+" method=\""+tr.getTestClass().getName()+"."+tr.getMethod().getMethodName()+"\">\n"); } sb.append("<span class=\"err_span\" >"+e.getMessage()+"</span></br>\n"); for(int i=0;i<et.length;i++) { sb.append("<span class=\"err_span\">"+et[i].toString()+"</span></br>\n"); } sb.append("</err_assert_info_StackTrace>\n"); } for (Error e : Assertion.errors) { StackTraceElement[] errorTraces = e.getStackTrace(); StackTraceElement[] et = this.getKeyStackTrace(tr, errorTraces); if (tr.getParameters().length>0) { sb.append("<err_assert_info_StackTrace"+" method=\""+tr.getTestClass().getName()+"."+tr.getMethod().getMethodName()+"."+tr.getEndMillis()+"\">\n"); } else { sb.append("<err_assert_info_StackTrace"+" method=\""+tr.getTestClass().getName()+"."+tr.getMethod().getMethodName()+"\">\n"); } sb.append("<span class=\"err_span\" >"+e.getMessage()+"</span></br>\n"); for(int i=0;i<et.length;i++) { sb.append("<span class=\"err_span\">"+et[i].toString()+"</span></br>\n"); } sb.append("</err_assert_info_StackTrace>\n"); } /*try { if(file.exists()) { file.delete(); } fileWriter=new FileWriter(file, true); BufferedWriter output = new BufferedWriter(fileWriter); output.write(sb.toString()+"</failed>"); //output.write("</failed>"); output.flush(); output.close(); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); }*/ if(file.exists()) { file.delete();; } fileManger.writeWithEncode(file,"utf-8",true,sb.toString()+"</failed>"); // log.error(sb.toString()); //this.handAssertion(tr); log.error("测试用例: "+tr.getMethod().getDescription()+"--failed"); log.info("测试用例:"+tr.getMethod().getDescription()+"---end"); } @Override public void onTestSkipped(ITestResult tr) { TestBaseCase testBaseCase=(TestBaseCase) tr.getInstance(); WebDriver driver=testBaseCase.driver; ScreenShot screenShot=new ScreenShot(driver); //设置截图名字 screenShot.setscreenName(tr.getMethod().getDescription()); screenShot.takeScreenshot(); log.warn("测试用例: "+tr.getMethod().getDescription()+"--skipped"); log.info("测试用例:"+tr.getMethod().getDescription()+"---end"); } @Override public void onTestSuccess(ITestResult tr) { for(int i=0;i<Assertion.messageList.size();i++) { if (tr.getParameters().length>0) { sb2.append("<pass_assert_info"+" method=\""+tr.getTestClass().getName()+"."+tr.getMethod().getMethodName()+"."+tr.getEndMillis()+"\">\n"); } else { sb2.append("<pass_assert_info"+" method=\""+tr.getTestClass().getName()+"."+tr.getMethod().getMethodName()+"\">\n"); } sb2.append("<span class=\"pass_span\">"+Assertion.messageList.get(i)+"</span></br>\n"); sb2.append("</pass_assert_info>\n"); } /*try { //fileWriter2=new FileWriter(file2, true); if(file2.exists()) { file2.delete();; } //fileWriter2=new FileWriter(file2); //BufferedWriter output = new BufferedWriter(fileWriter2); //output.write(sb2.toString()+"</passed>"); //output.write("</passed>"); //output.flush(); //output.close(); } catch (IOException e2) { // TODO 自动生成的 catch 块 e2.printStackTrace(); }*/ if(file2.exists()) { file2.delete();; } fileManger.writeWithEncode(file2,"utf-8",true,sb2.toString()+"</passed>"); log.info("测试用例: "+tr.getMethod().getDescription()+"--passed"); log.info("测试用例:"+tr.getMethod().getDescription()+"---end"); } private StackTraceElement[] getKeyStackTrace(ITestResult tr, StackTraceElement[] stackTraceElements){ List<StackTraceElement> ets = new ArrayList<StackTraceElement>(); for (StackTraceElement stackTraceElement : stackTraceElements) { if(stackTraceElement.getClassName().equals(tr.getTestClass().getName())){ ets.add(stackTraceElement); } } StackTraceElement[] et = new StackTraceElement[ets.size()]; for (int i = 0; i < et.length; i++) { et[i] = ets.get(i); } return et; } }