章节十七章、2- 给执行失败的case截图

一、案例演示

1、首先我们把截图的方法单独进行封装方便以后调用。

 1 package utilities;
 2
 3 import java.io.File;
 4 import java.io.IOException;
 5
 6 import org.apache.commons.io.FileUtils;
 7 import org.openqa.selenium.OutputType;
 8 import org.openqa.selenium.TakesScreenshot;
 9 import org.openqa.selenium.WebDriver;
10
11 public class Screenshots {
12
13 //    为了方便调用,我们写成静态的方法
14 //    首先,我们设置在调用该方法时需要传入两个参数:浏览器类型、文件名
15     public static void  takeScreenshots(WebDriver driver,String filename) throws IOException {
16 //        截图文件名
17         filename = filename + ".png";
18 //        截图存放路径
19         String directory = "C:\\Users\\acer\\Desktop\\dd\\Screenshots\\";
20 //        截图
21 //        强制转换driver为TackScreenShot类型,然后调用getScreenshotAs("截完图后的输出类型")方法进行截图
22         File sourceFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
23 //        将文件复制到指定目录
24         FileUtils.copyFile(sourceFile, new File(directory+filename));
25     }
26 }

2、以qq邮箱登录为例,我们故意输入错误的密码让case执行失败然后进行截图。

 1 package extenreports;
 2
 3 import org.testng.annotations.Test;
 4
 5 import com.aventstack.extentreports.ExtentReports;
 6 import com.aventstack.extentreports.ExtentTest;
 7 import com.aventstack.extentreports.Status;
 8
 9 import utilities.Screenshots;
10
11 import org.testng.annotations.BeforeMethod;
12 import org.testng.annotations.AfterMethod;
13 import org.testng.annotations.BeforeClass;
14
15 import java.io.IOException;
16 import java.util.concurrent.TimeUnit;
17
18 import org.openqa.selenium.By;
19 import org.openqa.selenium.NoSuchElementException;
20 import org.openqa.selenium.WebDriver;
21 import org.openqa.selenium.WebElement;
22 import org.openqa.selenium.chrome.ChromeDriver;
23 import org.testng.Assert;
24 import org.testng.ITestResult;
25
26 public class TestNG_Screenshots {
27
28     private WebDriver driver;
29     private String baseUrl;
30
31
32 //  每个方法执行前执行一次
33   @BeforeMethod
34   public void tearUp() {
35       baseUrl = "https://mail.qq.com";
36             driver = new ChromeDriver();
37             driver.manage().window().maximize();
38             driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
39             driver.get(baseUrl);
40   }
41
42   @Test
43   public void test1_invalidCredentials() {
44       driver.switchTo().frame("login_frame");
45
46         WebElement dl = driver.findElement(By.className("switch_btn"));
47         dl.click();
48
49         WebElement emailField = driver.findElement(By.id("u"));
50         emailField.sendKeys("12345678");
51
52         WebElement passwordField = driver.findElement(By.id("p"));
53         passwordField.sendKeys("***************");
54
55
56         WebElement goButton = driver.findElement(By.id("login_button"));
57         goButton.click();
58
59         WebElement welcomeText = null;
60         try {
61             welcomeText = driver.findElement(By.xpath("//b[text()=‘********‘]"));
62         }
63         catch (NoSuchElementException e) {
64             System.out.println(e.getMessage());
65         }
66         Assert.assertTrue(welcomeText != null);
67   }
68
69 //  每个方法执行结束后执行一次
70   @AfterMethod
71 //  使用testng中的ITestResult接口来捕获testcase的运行结果
72   public void tearDown(ITestResult testResult) throws IOException {
73 //      如果获取到的testcase的状态等于failure(失败)
74       if(testResult.getStatus() == ITestResult.FAILURE) {
75 //          就调用自己封装好的截图方法,以testcase方法的名字给文件命名
76           Screenshots.takeScreenshots(driver, testResult.getName());
77       }
78       driver.quit();
79   }
80 }

运行结果:在指定目录成功生成了错误截图文件

如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。

内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。

欢迎关注,转载请注明来源。

原文地址:https://www.cnblogs.com/luohuasheng/p/11699714.html

时间: 2024-12-14 10:23:25

章节十七章、2- 给执行失败的case截图的相关文章

Gradle 1.12 翻译——第十七章. 从 Gradle 中调用 Ant

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41204073 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

Gradle 1.12用户指南翻译——第四十七章. Build Init 插件

文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/usergu

读《构建之法》第四章 、第十七章

第四章    两人合作 通过对于<构建之法>第四章的阅读使我对代码规范 . 代码复审 . 以及结对编程有了更加深刻的认识,所谓代码规范可以分为两个部分,代码风格规范和代码设计规范,代码风格规范的原则是:简明 . 易读 . 无二义性,代码书写的形式,变量命名的方法,注释程序如何工作都有详细的介绍,令我受益颇多.代码设计规范不光是程序书写的格式问题,而且牵涉到咸亨需设计 . 模块之间的联系 . 设计模式等方方面面,函数的设计,语句的使用,错误的处理,这些都是我们在进行程序设计的时候需要注意的地方.

个人:构建之法第十七章读后感

第十七章在开始讲一个项目中的三个角色: 猪:项目的所有者,成功了是最大收益者,失败了最大损失者 鸡:项目的参与者,成功了得到应得的酬劳,失败了也没什么损失 鹦鹉:项目的外援 这一节应该是给“猪”说的,猪需要弄清团队成员投入/承诺/责任,这很重要,也是猪的责任. 分配好角色后,完成项目的过程也会有各种各样的问题: 在做事上会分为:做事的,不做事的,不让别人做事的,做假事的,假装做事的 项目完成后,如何分配利益又是一个问题:比资历?平均?比效率?团队互评?比犯得过错? 书中提出的解决办法: 20%给

第十四——十七章作业

                                                                                                     第十四章 15.3.1 有些成功人士或公司认为不需要独立的测试角色(Test),你怎么看? 在一些软件公司中,QA的工作中包含了Test的角色,负责验证程序是否符合预先设计的功能和特性.但是QA的工作量是很多的,一个好的QA不仅需要对程序架构有着很好的理解,对程序功能和性能都有着较深的理解,并且要

2017.2.16 开涛shiro教程-第十七章-OAuth2集成

原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第十七章-OAuth2集成 1.OAuth2介绍 (1)应用场景 很多开放平台,比如新浪微博开放平台,都在使用开发API接口供开发者使用.即带来了,第三方应用要到开放平台授权的问题.OAuth就是做这个的. 1 OAuth2官网:http://oauth.net/2/ 2 OAuth2协议:http://tools.ietf.org/html/

Gradle 1.12用户指南翻译——第三十七章. OSGi 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个

Gradle 1.12用户指南翻译——第二十七章. Ear 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十七章 内存管理和自动计数

本书第十六章讲解的时关于文件和目录的操作,内容相对简单,再次略过. 第十七章的学习笔记经本人归纳整理呈献给大家. 内存管理: - 为了被占用的内存能够再次利用,通过内存管理清理不用的内存.如果一个对象不再使用,就需要释放对象占用的内存 Part 1. 基本内存管理模型 Part 1.1 自动垃圾收集: 系统能够自动贾策对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对象会被自动释放 Part 1.2 手工管理内存计数: 每当创建引用到对象的时候需要为引用数+1.[myFractio