写这篇微博之前,自动化测试代码中有对于失败测试截图的功能,但是却散落在各个catch语句块中。不便于以后的扩展和维护,AOP思想里说明是面向切面编程,把公共的组件提取出来,可以单独修改维护。
但是直到我看了http://www.cnblogs.com/zhangfei/p/4271923.html文章后,觉得应该尝试下了。在此感谢博主张飞的倾情分享!
步骤一,在公共utility包中加入截图方法
几个重点 a. 明确截图文件存放的位置和名字 b. 调用webdriver 下的getScreenshotAs方法截图,并将截图文件copy到指定目录下
直接上张飞的code!
1 public class ScreenShot { 2 public WebDriver driver; 3 4 public ScreenShot(WebDriver driver) { 5 this.driver = driver; 6 } 7 8 private void takeScreenshot(String screenPath) { 9 try { 10 File scrFile = ((TakesScreenshot) driver) 11 .getScreenshotAs(OutputType.FILE); 12 FileUtils.copyFile(scrFile, new File(screenPath)); 13 } catch (IOException e) { 14 System.out.println("Screen shot error: " + screenPath); 15 } 16 } 17 18 public void takeScreenshot() { 19 String screenName = String.valueOf(new Date().getTime()) + ".jpg"; 20 File dir = new File("test-output/snapshot"); 21 if (!dir.exists()) 22 dir.mkdirs(); 23 String screenPath = dir.getAbsolutePath() + "/" + screenName; 24 this.takeScreenshot(screenPath); 25 } 26 }
步骤二,定义一个类,实现TestNG的TestListenerAdapter接口
几个重点: a.得到当前要监听接口的webdriver对象 b.进而去调用utility类的截图方法
public class DotTestListener extends TestListenerAdapter{
@Override
public void onTestFailure(ITestResult tr) {
try {
loginTest tb = (loginTest) tr.getInstance();
WebDriver driver=tb.getDriver();
System.out.println("listener is running");
ScreenShot ssh = new ScreenShot(driver);
ssh.takeScreenshot();
System.out.println("take screenshot ok!");
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
步骤三,使用监听器
TestNG有两种方式使用监听器
方式一 在 testng.xml 中使用 TestNG 监听器
TestNG 通过 testng.xml 配置所有的测试方法。Testng.xml 提供了 listeners 和 listener 标签用来添加自定义的监听器。下面示范的是本文示例代码中包含的 testng.xml 文件。
1 <suite name="TestNGSample"> 2 <listeners> 3 <listener class-name="listeners.OSFilter" /> 4 <listener class-name="listeners.ProgressTracker" /> 5 </listeners> 6 <test name="ProgressTracker Demo"> 7 <classes> 8 <class name="tests.SampleTest" /> 9 </classes> 10 </test> 11 </suite>
方式二 在源代码中使用 TestNG 监听器
通过 @Listeners 注释,可以直接在 Java 源代码中添加 TestNG 监听器。下面示范的是本文示例代码中如何使用 @Listeners 注释。
1 @Listeners({ OSFilter.class, ProgressTracker.class }) 2 public class SampleTest { 3 4 @Test(groups = { OSNames.OS_LINUX }) 5 public void test1() { 6 sleep(5000); 7 System.out.println(">>>test1"); 8 }
我用的是第二种方式。
参考文章:
http://www.cnblogs.com/zhangfei/p/4271923.html