Selenium高级 | 借助TestNG的Listener对失败用例截图

在上一篇中给大家介绍了在单个线性java脚本中执行失败时截图的做法,见Selenium高级|单条用例执行失败截图 主要目的是让大家先熟悉下Selenium截图时用到的相关的类。

但是在现实中,很多时候我们并不清楚哪个用例会失败,今天失败的是这个用例,明天失败的可能又是另外的一个用例了,那在这种情况下如何实现用例运行失败后自动截图呢?

这个就要用到TestNG的Listener:ITestListener,这个其实是一个接口,里面定义了很多空的方法,比如onTestFailure()方法就可以控制当TestNG框架中的脚本运行失败时做什么事,你可以做任何你想做的,现在我们需要做的就是截图,因为接口中的方法体都是空的,所以就需要在脚本中具体来实现即implements。

稍微有点复杂,让我们慢慢来。。。

整体思路:

1. 首先要定义一个基础类比如叫TestBase

在这个类中我们要做的事情是提炼和定义一些基本操作,好在其它所有用例中都可以调用,比如启动浏览器的操作,比如像上一篇中一样实现截图的操作等。

2. 创建一个类比如叫Listeners,用来实现onTestFailure()方法

3. 在TestNG的xml配置文件中加入步骤2中的Listeners信息,例:

  <listeners>
       <listener class-name="com.yoyotesting.selenium3maven.Listeners"/>
  </listeners>

现在我们就来具体实现一下如下场景:

1. 打开火狐浏览器

2. 打开百度首页

3. 在搜索框输入selenium关键字

4. 点击“百度一下”按钮(为了制造失败的场景把按钮的id属性写成了错误的)

按上面的整体思路具体实现如下:

1. 基础类TestBase.java代码如下

截图部分加了result参数,目的是截图后使用@Test下的方法名称来为图片进行命名。

package com.yoyotesting.selenium3maven;

import java.io.File;
import java.io.IOException;

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.io.FileHandler;

public class TestBase {
	
	public static WebDriver driver;
	
	public void startBrowser() {
		
		System.setProperty("webdriver.gecko.driver", "D:\\BrowserDriver\\geckodriver.exe");
		driver = new FirefoxDriver();
			
	}
	
	public static WebDriver getDriver() {
		return driver;
	}
	
	public void takeScreenShot(String result) throws IOException {
						
		TakesScreenshot srcShot = (TakesScreenshot) driver;
		File srcFile = srcShot.getScreenshotAs(OutputType.FILE);
		File desFile = new File("D:\\ScreenShots\\" +result +".png");
					
		FileHandler.copy(srcFile, desFile);
		System.out.println("***Placed screen shot in D: "+ result +" ***");
	
		
	}

}

2. 创建一个类比如叫Listeners,用来Implements即实现onTestFailure()方法

具体代码如下,result.getName()获取到的是执行用例@Test下的方法名称

package com.yoyotesting.selenium3maven;

import java.io.IOException;

import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class Listeners implements ITestListener{ 
	
	public WebDriver driver;
	//实例化基础类的对象,以调用里面的截图方法
	TestBase base = new TestBase();
	

	@Override
	public void onFinish(ITestContext arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onStart(ITestContext arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTestFailure(ITestResult result) {
		// TODO Auto-generated method stub
		
		
		try {
			base.takeScreenShot(result.getName());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void onTestSkipped(ITestResult arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTestStart(ITestResult arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTestSuccess(ITestResult arg0) {
		// TODO Auto-generated method stub
		
	}

}

具体实现百度搜索的测试用例脚本如下:

package com.yoyotesting.selenium3maven;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;

public class SearchBaidu {
	
	public WebDriver driver;
	
	//实例化TestBase的对象,以方便调用其中的方法
	TestBase base = new TestBase();	
	
	  @BeforeClass
	  public void startBrowser() {
	
		  base.startBrowser(); 		 
	  }
	  
	  
	  @Test
	  public void searchBaidu() throws InterruptedException {
		  
		  //driver传递
		  driver = TestBase.getDriver();
		   
	       driver.get("https://www.baidu.com/");
	       
	       //最大化浏览器窗口
	       driver.manage().window().maximize();
	       
	       //输入查询关键字
	       driver.findElement(By.id("kw")).sendKeys("selenium");
	       //点击查询按钮
	       driver.findElement(By.id("su111")).click();
	       Thread.sleep(3000);
	
		  
	  }

	  @AfterClass
	  public void closeBrowser() {
		  //退出浏览器
	      driver.quit();
	      
	  }

}

3. 在TestNG的xml配置文件中加入具体的Listeners信息

  下面是一个完整的TestNG的配置文件信息

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">


  <listeners>
       <listener class-name="com.yoyotesting.selenium3maven.Listeners"/>
  </listeners>
  
  <test thread-count="5" name="Test">
    <classes>    
      <class name="com.yoyotesting.selenium3maven.SearchBaidu"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

执行上面的TestNG.xml文件,run as TestNG suite,会看到脚本运行失败了。

此时去到指定的路径下(本例中为D:\ScreenShots)去看截图文件,会发现有一个命名为searchBaidu.png的截图文件。

截图打开如下:

【完成】

 

********************************************************************************************************

近期我会在博客中系统的更新一些关于Selenium的文章,也请大家多多关注下我的视频课程:

入门:基于Java的Selenium3自动化测试完整教程

高级:Selenium Java高级架构课程

*********************************************************************************************************

阅读更多精彩文章,请大家关注我的测试公众号:火烈鸟测试

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YOYO测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值