WebDriver - 添加失败截图

Posted 悟空救我呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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异常关联不大

以上是关于WebDriver - 添加失败截图的主要内容,如果未能解决你的问题,请参考以下文章

selenium - 用例失败后截图 - 常见问题(打开了多个浏览器页面)

Selenium webdriver截图

如何使用 Selenium Webdriver 获取屏幕截图? [复制]

使用selenium webdriver使用java [重复]查看页面源代码的屏幕截图

请教高人:关于WebDriver截图报错

Selenium webdriver python元素屏幕截图无法正常工作