WebDriver - 添加失败截图

WebDriver失败截图可以通过两种方式实现:

1. Use WebdriverEventListener

第一步:创建自己的WebDriverEventListener

创建自己的WebDriverEventListener 重写Onexception 方法, 当webdriver 遇到异常的时候执行截图动作。

import java.io.File;
import java.io.IOException;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.LogManager;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.internal.Base64Encoder;
import org.openqa.selenium.remote.ScreenshotException;
//import org.openqa.selenium.support.events.AbstractWebDriverEventListener;
import org.openqa.selenium.support.events.WebDriverEventListener;

public class CustomWebDriverEventListener implements WebDriverEventListener  {

    @Override
    public void onException(Throwable paramThrowable, WebDriver paramWebDriver) {
        // TODO Auto-generated method stub
        Throwable cause = paramThrowable.getCause();
        if (cause instanceof ScreenshotException) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
            String dateString = formatter.format(new Date());
            File of = new File(dateString + "-exception.png");
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(of);
                out.write(new Base64Encoder().decode(((ScreenshotException) cause)
                        .getBase64EncodedScreenshot()));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
第二步:通过EventFiringWebDriver给webdriver注册自己的listener
WebDriver driver = new RemoteWebDriver(new URL(remoteUrl), capabilities);

WebDriverEventListener eventListener = new CustomWebDriverEventListener();

driver = new EventFiringWebDriver(driver).register(eventListener);

注册完就OK了,driver遇到异常的时候就执行异常监控中的截图操作,当然其他事件中的操作也会执行。

2. Use TestNG/JUnit listener

第一步:创建自己的TestListenerAdapter 或者custom rule

TestNG就是创建TestListenerAdapter,重写Onfailure方法, 如果用的是Junit就创建对应的test rule,此处只举例TestNG,Junit的可参照(http://www.ltesting.net/ceshi/open/kygncsgj/selenium/2012/0824/205449_2.html)

Onfailure方法添加截图功能

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.LogManager;
import org.openqa.selenium.WebDriver;
import org.testng.IAnnotationTransformer;
import org.testng.IResultMap;
import org.testng.IRetryAnalyzer;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.TestListenerAdapter;
import org.testng.annotations.ITestAnnotation;

public class MyListener extends TestListenerAdapter {

    @Override
    public synchronized void onTestFailure(ITestResult result) {
        LogManager.getLogger(this.getClass()).info("In failed method");
        Object currentClass = result.getInstance();
        ((TestBase) currentClass).takeScreenShot(true);
        LogManager.getLogger(this.getClass()).info("Out failed method");
    }

}

两者比较:

WebdriverEventListener:

1.  可以截图所有webdriver异常的图片,但是不能截取Assert.fail 失败的图片

2. 如果使用while等待某种条件是的报错也会截图,可能造成截图过多

3. 只能用于Webdriver,如果使用remote driver可能不行

4. 坚挺的事件很多,方便很多操作

测试框架TestNG,Junit

1. 用例失败就截图,和Webdriver异常关联不大

时间: 2025-01-17 01:24:49

WebDriver - 添加失败截图的相关文章

WebDriver - 失败截图

WebDriver - 添加失败截图 WebDriver - 添加失败截图 作者: Max.Bai 时间: 2015/01 WebDriver失败截图可以通过两种方式实现: 1. Use WebdriverEventListener 第一步:创建自己的WebDriverEventListener 创建自己的WebDriverEventListener 重写Onexception 方法, 当webdriver 遇到异常的时候执行截图动作. import java.io.File; import j

reportNG定制化之失败截图及日志

先从github上拉下 reportNg的源代码 reportng  拉下源码后我们使用IDEA进行导入 1.reportng.properties 增加部分类表项 这里我们直接在末尾添加 log=Log Info screenshot=Screen Shot duration=Duration 2.results.html.vm 修改结果的html,我们目前只修改fail的情况下. #if ($failedTests.size() > 0) <table class="result

(二十二)异常捕获与用例断言失败截图

1.认识异常 2.捕获异常 3.断言 4.用例失败截图 ===================================================== (一) 什么是异常? exception:程序一旦遇到错误后,就会引发异常,如果异常没有被处理或者被捕捉,程序就会回溯来终止运行 异常的分类 常见的异常有哪些? BaseException:所有异常类的基类 Exception:所有异常类的基类,继承于BaseException AssertionError:assert语句失败 Fi

绑定网关IP和MAC地址时显示“ARP项添加失败:拒绝访问”的处理方法

绑定网关IP和MAC地址时显示"ARP项添加失败:拒绝访问" Win7系统,用arp -s命令在绑定网关IP和MAC地址时,总是提示 ARP 项添加失败: 拒绝访问.( 用管理员身份运行cmd也无效.)未找到原因. 后来google找到了另一个命令,搞定! 具体操作如下: 1.CMD中输入: netsh i i show in 然后找到本地连接对应 我的是Win7系统,今天用arp -s命令在绑定网关IP和MAC地址时,总是提示"ARP 项添加失败: 拒绝访问."(

arp -s 添加失败:拒绝访问

为了防止局域网的arp 要绑定网关MAC地址 在vista/win中 用 arp -s 绑定网关会出现错误 ARP 项添加失败 C:\Users\sink>arp -a 接口: 10.200.52.186 --- 0xaInternet 地址         物理地址              类型10.200.53.254         00-04-38-87-f2-0c     动态10.200.53.255         ff-ff-ff-ff-ff-ff     静态 C:\User

webdriver打开失败方法---chrome与chromedrvier版本对应关系

在运行selenium脚本时,有时突然会碰到提示webdriver打开失败,这个时候极大可能是 Chrome浏览器更新了,与你之前的chromedriver版本出现不兼容,导致selenium调用不了 谷歌浏览器,这个时候就需要升级chromedriver,升级完即可. 查看一下自己的chrome版本和对应的chromedriver版本是否对应; 学习更多可以加QQ群:610845268

android 数据库添加字符串 添加失败 解决方案

这两天遇到一个棘手的问题,在往sqlite数据库中添加数据时,总是添加失败,但是添加数字却可以.原来是添加时,忘记添加''号修饰. 修改前: 修改后: 这样就完美解决.

Appium失败截图及重试机制封装(二)

一.失败截图封装 1.主要封装了失败之后的文件名.重写了失败之后消息.失败了以后做个截图,最后置为失败,并且存放到相对路径下.截图操作,未把失败用例至为Fail,主要代码如下: 1 package cn.hysh.appium.testng; 2 3 import org.testng.Assert; 4 import org.testng.Reporter; 5 6 import cn.hysh.appium.base.AndroidDriverBase; 7 import cn.hysh.a

python unittest addCleanup中也加失败截图功能

在python web自动化测试中失败截图方法汇总一文中提到了失败截图的方法 但在实际测试中,如果我们的测试用例中加了addCleanups动作,如果addCleanups中动作失败了,就不会截图.那么该怎么做呢,解铃还得系铃人,还是得从addCleanups下手 思路: 我将在 addCleanup中再加一个截图的函数,但怎么判断用例是用例内失败还是addCleanup中失败呢,方法如下 我们在执行完用例后,看看self的属性,包括如下: (Pdb) print dir(self) ['__c