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 获取屏幕截图? [复制]