微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java selenium截图操作

文章目录


selenium 截图操作是一个比较常见 WebUI 操作,下面详细介绍一下实际项目中该怎么去实现截图操作以及 selenium 项目失败截图全过程

前提条件

项目是 maven 项目并且需要如下依赖包:

  • selenium-java
  • selenium-api
  • commons-io

既然要实现截图,首先你是 selenium 项目,所以基础的 selenium-java 依赖包是要有的,然后下方代码中会用到 TakesScreenshot 类和 OutputType.FILE 这些是在 selenium-api 中,然后 FileUtils 类也会用到,其在 commons-io 包中

核心代码

// 截图操作
File sourcefile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
// 截图存储
FileUtils.copyFile(sourcefile, new File(screenshotPath + File.separator + screenshotName + screenshotFormat));

上述是核心代码,screenshotPath 是截图相对项目存放路径,screenshotName 是截图设定的名字,screenshotFormat 是 String 类型表示截图类型是.png还是.jpg类型图片
当然截图可以在失败时候截图,如果想灵活一点,不只失败才去截图,这段代码就可以灵活放置,达到某项操作就去截图也是可行的

下面我会详细讲解一下 selenium 如何进行失败截图的全过程

第一步:添加依赖

认你是有 selenium-java 依赖的,需要注意的是下面我没有引用 commons-io 依赖包,而是引入了 htmlunit 依赖包,这是因为它当中存在 commons-io 依赖

<dependency>
	<groupId>org.seleniumhq.selenium</groupId>
	<artifactId>selenium-api</artifactId>
	<version>3.141.59</version>
</dependency>
<dependency>
	<groupId>net.sourceforge.htmlunit</groupId>
	<artifactId>htmlunit</artifactId>
	<version>2.30</version>
</dependency>

第二步:编写截图工具类

在项目下 util 工具类包中添加截图工具类 ScreenshotUtil,下方中的驱动通过 ITestResult 转化为 BaseTest 测试基类,然后从基类中取到,这个测试基类是所有测试用例类的父类,含有驱动,有的人不想通过这种方式取到驱动,你可以把驱动弄成静态资源再弄成线程隔离(ThreadLocal),然后直接在截图方法中取用这个驱动也行

public class ScreenshotUtil {
    /**
     * 异常截图存储路径
     */
    private static String screenshotPath = System.getProperty("user.dir") + File.separator + "target" + File.separator + "test-output" + File.separator + "screenshot";

    /**
     * 异常截图
     *
     * @param iTestResult i测试结果
     * @param driver 驱动
     */
    public static void capture(ITestResult iTestResult) {
        // 拿到需要截图的驱动
        WebDriver driver = ((BaseTest)iTestResult.getInstance()).driver;
        // 截图目录
        File screenshotFile = new File(screenshotPath);
        // 若文件夹不存在就创建该文件夹
        if (!screenshotFile.exists() && !screenshotFile.isDirectory()) {
            screenshotFile.mkdirs();
        }
        // 截图格式
        String screenshotFormat = ".png"
        // 哪个类导致的截图
        String className = iTestResult.getInstance().getClass().getSimpleName();
        // 时间格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日H时m分s秒");
        String timeStr = simpleDateFormat.format(new Date());
        // 截图名称
        String screenshotName = className + "-" + timeStr;
        try {
            // 截图操作
            File sourcefile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
            // 截图存储
            FileUtils.copyFile(sourcefile, new File(screenshotPath + File.separator + screenshotName + screenshotFormat));
        } catch (IOException e) {
            e.printstacktrace();
            log.error("截图操作异常!");
        }
    }
}

第三步:添加截图相关监听器

需要写一个监听器类我起名叫做 TestLogListener,他需要继承 TestListenerAdapter,TestListenerAdapter 这个类是 testng 提供的一个类,这个类很方便,里头提供了一些测试流程各个阶段的方法,我们可以将一些需要的操作放在这些阶段当中,来实现当到达某个测试阶段之后来完成某些操作。测试失败就被执行的是 onTestFailure 方法

public class TestLogListener extends TestListenerAdapter {
    /**
     * 开始
     *
     * @param iTestContext ITestContext
     */
    @Override
    public void onStart(ITestContext iTestContext) {
        super.onStart(iTestContext);
    }

    /**
     * 测试开始
     *
     * @param iTestResult ITestResult
     */
    @Override
    public void onTestStart(ITestResult iTestResult) {
        super.onTestStart(iTestResult);
    }

    /**
     * 测试成功
     *
     * @param iTestResult ITestResult
     */
    @Override
    public void onTestSuccess(ITestResult iTestResult) {
        super.onTestSuccess(iTestResult);
    }

    /**
     * 测试失败
     *
     * @param iTestResult ITestResult
     */
    @Override
    public void onTestFailure(ITestResult iTestResult) {
        super.onTestFailure(iTestResult);
        // 失败时候抛出异常进行截图
        ScreenshotUtil.capture(iTestResult);
    }

    /**
     * 测试跳过
     *
     * @param iTestResult ITestResult
     */
    @Override
    public void onTestSkipped(ITestResult iTestResult) {
        super.onTestSkipped(iTestResult);
    }

    /**
     * 结束
     *
     * @param iTestContext ITestContext
     */
    @Override
    public void onFinish(ITestContext iTestContext) {
        super.onFinish(iTestContext);
    }
}

第四步:testng.xml 配置监听器

<listeners>
	<!-- 含有失败截图的监听器 -->
	<listener class-name="com.abcnull.listener.TestLogListener"/>
</listeners>

第五步:查看失败截图

当我们去运行有断言错误的 testng.xml 时候,我们会发现在target/test-output/screenshot中出现了错误新的截图

abcnull 发布了137 篇原创文章 · 获赞 44 · 访问量 6万+ 私信 关注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐