selenium 利用testNG对异常进行自动截图
哈哈哈,很久没写博客了,懒了。
因为一些原因最近需要把监听事件重新整理一下,开始没细想,直接copy网上的,其实结果发现报错很多,或者是达不到效果,然后把之前的代码翻出来,仔细看了一下。下面给一些需要的小伙伴整理一下思路:
1、首先我们用到的是testng里面的监听,所以这个毋庸置疑
2、我们需要重新他的监听事件
3、用例中肯定需要加入监听事件
这三点是网上公认的,但是怎么做确没有说明白。
首先看一下我的目录结构:

图片中我有4个类,
1、driverBase是一个基类,里面是driver的初始化,截图的方法也在里面。
2、selectDriver是根据浏览器不同返回不同的driver
3、testngListenerScreen是testng的监听类,他继承了TestListenerAdapter类,把里面的方法进行了重写。主要他会去监听你测试类是否报错,如果报错他就会去调用我们driverbase下面的截图方法。
4、testlogin 不用说,我们的测试类,他需要继承我们的driverBase基类,去拿里面的driver。
这个说完了先看代码,首先从我们基类开始:
package com.mushishi.selenium.base;
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 mushishi
* */
public class driverBase {
public WebDriver driver;
/**
* 获取driver
* */
public WebDriver getDriver() {
return driver;
}
/**
* 自动截图
* */
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";
//因为我们截图是需要用到driver的,所以这里需要获取driver,这个driver是获取的当前对象的driver
takeScreenShot((TakesScreenshot) this.getDriver(), path);
}
/**
* 传入参数截图
* */
public void takeScreenShot(TakesScreenshot drivername, String path) {
String currentPath = System.getProperty("user.dir"); // get current work
File scrFile = drivername.getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(scrFile, new File(currentPath + "\\" + path));
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("截图成功");
}
}
}
上面的代码,可能有那么一两个地方看不懂,都没关系,我写备注了。主要是以类名字和时间组合起来命名,并且把当前运行的对象的driver获取到,用来截图操作。
下面看selectDriver的类:
package com.mushishi.selenium.base;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class SelectDriver {
public WebDriver driverName(String browser){
if(browser.equalsIgnoreCase("fireFox")){
//设置环境变量,并且返回driver
System.setProperty("webdriver.firefox.marionette","D:\\java\\geckodriver\\geckodriver-v0.14.0-win64\\geckodriver.exe");
return new FirefoxDriver();
}else{
System.setProperty("webdriver.chrome.driver", "D:\\java\\chromedriver_win32\\chromedriver.exe");
return new ChromeDriver();
}
}
}
上面的没什么可看的,就是根据传入的对象生成一个driver,这个我用的3.0的selenium,所以需要这么设置。这个根据自己情况。
下面看监听类的: 1 package com.mushishi.selenium.base;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
public class TestNGListenerScreen extends TestListenerAdapter{
@Override
public void onTestSuccess(ITestResult tr) {
super.onTestSuccess(tr);
}
//主要是用到这个方法了,当你报错时他会监听到,然后就会执行截图操作,这里的 ITestresult tr是testng里的,获取到的是当前运行对象,你这样理解,他就是
//我当前运行的类这个对象
@Override
public void onTestFailure(ITestResult tr) {
super.onTestFailure(tr);
System.out.println(tr);
takeScreenShot(tr);
}
//所以这里我执行截图的时候就获取到了我运行过程中实力对象的driver了,懂了吧。所以当我再回去调用我基类的对象时,那么driver就是同一个了
private void takeScreenShot(ITestResult tr) {
driverBase b = (driverBase) tr.getInstance();
// driver = b.driver;
b.takeScreenShot();
}
@Override
public void onTestSkipped(ITestResult tr) {
super.onTestSkipped(tr);
}
@Override
public void onTestStart(ITestResult result) {
super.onTestStart(result);
}
@Override
public void onStart(ITestContext testContext) {
super.onStart(testContext);
}
@Override
public void onFinish(ITestContext testContext) {
super.onFinish(testContext);
}
}
最后一个类,测试类:
package com.mushishi.selenium.testCase;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import com.mushishi.selenium.ProUtil;
import com.mushishi.selenium.base.SelectDriver;
import com.mushishi.selenium.base.TestNGListenerScreen;
import com.mushishi.selenium.base.driverBase;
@Listeners({ TestNGListenerScreen.class })
public class testLogin extends driverBase {
SelectDriver select = new SelectDriver();
public testLogin(){
if(driver == null){
driver = select.driverName("chrome");
}
}
public void loginScript(String username,String userpass) throws Exception{
String url = "http://www.imooc.com";
driver.get(url);
driver.manage().window().maximize();
driver.findElement(By.id("js-signin-btn")).click();
Thread.sleep(2000);
WebElement user = this.element(this.byStr("username"));
user.isDisplayed();
WebElement password = this.element(this.byStr("userpass"));
password.isDisplayed();
WebElement loginButton = this.element(this.byStr("loginbutton"));
loginButton.isDisplayed();
user.sendKeys(username);
password.sendKeys(userpass);
loginButton.click();
Thread.sleep(3000);
WebElement header = this.element(this.byStr("header"));
header.isDisplayed();
Actions actions = new Actions(driver);
actions.moveToElement(header).perform();
String userInfo = this.element(this.byStr("nameInfo")).getText();
System.out.println(userInfo);
if(userInfo.equals("xxxx")){
System.out.println("登陆成功");
}else{
System.out.println("登陆失败");
}
driver.close();
}
/**
* 封装By by
* */
public By byStr(String username){
ProUtil properties = new ProUtil("element.properties");
String locator = properties.getPro(username);
String locatorType = locator.split(">")[0];
String locatorValue = locator.split(">")[1];
if(locatorType.equals("id")){
return By.id(locatorValue);
}else if(locatorType.equals("name")){
return By.name(locatorValue);
}else if(locatorType.equals("className")){
return By.className(locatorValue);
}else{
return By.xpath(locatorValue);
}
}
/**
* 封装Element
* */
public WebElement element(By by){
WebElement ele = driver.findElement(by);
return ele;
}
@Test
public void loginpage() throws Exception{
this.loginScript("xxxx", "xxxx");
}
}
这个是测试类,不知道你懂了么?因为我很多都封装了的,所以看不到,但是不影响大家理解testng自动截图思想。动手操作吧。
selenium 利用testNG对异常进行自动截图的更多相关文章
- Webdriver+Testng实现测试用例失败自动截图功能
testng执行测试用例的时候,如果用例执行失败会自动截图,方便后续排查问题 1.首先定义一个截图类: package com.rrx.utils; import java.io.File;impor ...
- Selenium通过监听事件实现自动截图
需要继承extends TestListenerAdapter这个类 代码如下package com.mushishi.selenium.util; import java.util.ArrayLis ...
- TestNG失败用例自动截图
参考:https://blog.csdn.net/wangxin1982314/article/details/50247245 1. 首先写一个截屏方法 public class ScreenSho ...
- Selenium2+python自动化67-用例失败自动截图【转载】
前言: 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数 上一篇讲到用装饰器解决异常后自动截图,不过并没有与unittest结合,这篇把截图的装饰器改良了下,可以实现用例执行失败自动截图 ...
- selenium遇到异常自动截图
最近要在框架中添加case失败时,要自动截图,主要又两种方式,思想都是在抛异常的时候,捕获到异常,并作页面截图处理.今天坐下总结. 一.第一种方式,重写onException方法 只针对webdriv ...
- testng 失败自动截图
testng执行case failed ,testng Listener会捕获执行失败,如果要实现失败自动截图,需要重写Listener的onTestFailure方法 那么首先新建一个Listene ...
- 使用appium和testng实现Android自动截图
简单介绍 需求场景是:当测试安卓应用的脚本得到失败结果时,对当前手机屏幕截图,便于查找问题. 实现方式是:1)定义一个父类UITest,作为所有测试类的父类.在父类中UITest中定义一个截图的方法, ...
- TestNG监听器实现用例运行失败自动截图、重运行功能
注: 以下内容引自 http://blog.csdn.net/sunnyyou2011/article/details/45894089 (此非原出处,亦为转载,但博主未注明原出处) 使用Testng ...
- IDEA+Java:Selenium+Maven+TestNG基本WebUI自动化测试环境搭建
IDEA+java:Selenium+Maven+TestNG 本文介绍的测试环境,应该是最基本的测试环境了,也是很多文章都有写,这里做一个完整的图文配置整理,方便阅读理解! 使用maven的好处,由 ...
随机推荐
- MVC学习笔记2 - Razor语法
Razor 同时支持 C# (C sharp) 和 VB (Visual Basic). C# 的主要 Razor 语法规则 Razor 代码封装于 @{ ... } 中 行内表达式(变量和函数)以 ...
- block、块级作用域
block:语句块 (或其他语言中的 复合语句) 用来组织零个或多条语句. 包含在{ }里面 通常在流程控制语句 (如 if, for, while)中使用 块级作用域:通过var声明的变量没有块级作 ...
- 腾讯云报告——MySQL成勒索新目标,数据服务基线安全问题迫在眉睫
推荐理由 大数据时代,人类产生的数据越来越多,但数据越多的情况下,也会带来数据的安全性问题,如MySQL数据库上的数据,越来越多的黑客盯上了它,今天推荐的这篇文章来自于腾讯云技术社区,主要是针对MyS ...
- UT源代码123
(3)设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Cellp ...
- Linux批量清理多个文件内容而不删除文件
清理单个文件,可以这样:echo > myLog.log 但是,如果我要清理一堆文件,比如在/logs目录下面的所有以.log结尾的文件的内容,而不删除文件,该如何操作呢? 我一开始的语句是这样 ...
- Vue.use自定义自己的全局组件
通常我们在vue里面使用别人开发的组件,第一步就是install,第二步在main.js里面引入,第三步Vue.use这个组件.今天我简单的也来use一个自己的组件. 这里我用的webpack-sim ...
- Java--JDBC连接数据库
我们知道Java中的jdbc是用来连接应用程序和数据系统的,本篇文章主要就来看看关于JDBC的实现和使用细节.主要包含以下几点内容: JDBC的基本知识(数据驱动程序) JDBC的连接配置 ...
- 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 4
第七步:保存新增加日记 代码3-2-7 增加日记-保存日记 #Step7: Save the note by touch on the "save" menu entry by c ...
- hive metastore Server 出现异常
报错信息: 常见问题分析: 1 hive metastore 数据库中用户名或者密码出现更改,并且重启了hive,导致生效但是CDH下没有及时更改hive metastore设置密码 2 Mysql ...
- EDP转换IC NCS8801S:RGB/LVDS转EDP芯片
RGB/LVDS-to-eDP Converter1 Features Embedded-DisplayPort (eDP) Output 2-lane/4-lane eDP @ 1.62 ...