WebDriver 之测试失败自动截图

合集下载

自动化测试中的截图处理技巧

自动化测试中的截图处理技巧

自动化测试中的截图处理技巧随着现代软件开发的不断进步,测试自动化已成为保障软件质量的重要手段之一。

其中,截图技术在自动化测试中的应用越来越广泛。

本文将介绍在自动化测试中常用的截图处理技巧以及优化建议。

一、常用截图技术1. WebDriver截图WebDriver是Web应用程序的浏览器自动化测试工具,可以通过WebDriver进行浏览器截图。

WebDriver提供了自动截图的方法,支持截图格式为PNG和JPEG。

示例代码如下:```javaFile screenshotFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(screenshotFile, newFile("path/to/screenshot.png"));```在截图时,需要注意浏览器窗口是否最大化,浏览器窗口大小是否满足需求。

2. ADB截图ADB(Android Debug Bridge)是Android开发工具包中包含的一个工具,提供了与Android设备通信的桥梁。

ADB可以通过命令行进行截图,截图格式为PNG。

示例代码如下:```shelladb shell screencap -p /sdcard/screenshot.pngadb pull /sdcard/screenshot.png path/to/screenshot.pngadb shell rm /sdcard/screenshot.png```在截图时,需要注意Android设备和电脑之间的连接是否顺畅,截图时设备是否正常运行。

3. Sikuli截图Sikuli是一款图像识别工具,可以通过模拟用户操作实现自动化测试。

Sikuli支持截图功能,并提供了OCR识别功能,可以自动识别图像中的文字。

Sikuli截图格式为PNG。

如何处理自动化测试中的异常处理

如何处理自动化测试中的异常处理

如何处理自动化测试中的异常处理自动化测试在软件开发领域中扮演着重要的角色,能够提高测试效率、减少测试成本,并改善软件的质量。

然而,异常处理在自动化测试过程中是一个不可忽视的问题。

如何处理自动化测试中的异常情况,能够直接影响测试结果的可靠性和测试人员的工作效率。

本文将探讨几种常见的自动化测试异常处理方法,并提供一些建议来应对这些异常情况。

一、异常处理方法1. 重试机制重试机制是最常用的异常处理方法之一。

在自动化测试中,由于网络延迟、服务器负载过高等原因,有时会导致测试用例执行失败。

为了提高测试结果的可靠性,可以在遇到异常情况时进行重试。

重试的次数可以根据实际情况进行设置,一般建议重试次数不超过3次。

如果重试次数过多,可能会导致测试时间过长,影响测试效率。

2. 异常捕获和处理在自动化测试中,有些异常情况无法通过重试解决,这时就需要进行异常捕获和处理。

常见的异常包括元素定位失败、页面加载超时、数据输入错误等。

当出现这些异常情况时,可以通过捕获异常并在出现异常时执行特定的处理逻辑,如记录错误日志、发送错误报告等。

异常处理的方式可以根据具体情况来选择,例如忽略异常、抛出自定义异常或回滚操作等。

3. 超时设置自动化测试中,某些操作可能需要较长的时间才能完成,例如页面加载、接口调用等。

为了防止测试用例在这些操作上过多的等待时间,可以设置超时时间。

超过超时时间后,测试用例将自动失败,并进行相应的处理。

超时设置能够提高测试效率,避免测试用例长时间卡在某个操作上。

4. 运行环境检测在自动化测试中,测试用例的执行环境对测试结果有很大影响。

为了减少异常情况的发生,可以在测试用例执行之前进行运行环境的检测。

例如,检查必要的软件和插件是否安装、网络连接是否正常等。

如果检测结果不符合要求,可以提前终止测试用例的执行,并进行相应的处理。

二、异常处理的注意事项1. 错误日志记录在自动化测试中,及时记录错误日志对于排查问题和追踪异常情况非常重要。

自动化测试的失败原因及应对策略

自动化测试的失败原因及应对策略

自动化测试的失败原因及应对策略自动化测试是现代软件开发中不可或缺的一部分,它可以提高测试效率、降低测试成本。

然而,在实际应用中,我们也会遇到自动化测试失败的情况。

本文将探讨自动化测试失败的原因,并提出相应应对策略。

一、自动化测试失败的原因1. 功能变更:软件功能的改动是自动化测试失败的常见原因之一。

当软件的功能发生变动时,测试脚本中的测试点可能无法正常执行,导致自动化测试失败。

2. 界面变化:软件界面的修改也会导致自动化测试的失败。

自动化测试通常是基于界面元素的识别和操作,当界面元素的属性或位置发生变化时,测试脚本无法正确识别元素,从而导致测试失败。

3. 数据变动:测试数据的变动也会导致自动化测试失败。

测试脚本通常会使用特定的测试数据进行验证,如果测试数据发生变化或被删除,脚本就无法正确执行。

4. 并发性问题:自动化测试常常需要模拟多个用户同时访问系统,这就引入了并发性问题。

如果系统在并发访问下出现了异常,自动化测试可能会失败。

5. 网络问题:自动化测试可能涉及到网络请求和响应,网络问题也会导致测试失败。

例如,网络延迟、不稳定的网络连接或服务器故障等。

二、应对策略1. 定期维护测试脚本:针对软件的功能变更和界面变化,测试团队应定期维护测试脚本。

当软件功能或界面发生变化时,及时更新测试脚本,确保脚本能够正确识别和操作界面元素。

2. 灵活处理测试数据:针对测试数据的变动,可以使用参数化或数据驱动的方式进行测试。

将测试数据从测试脚本中分离出来,以便灵活修改和管理测试数据。

3. 考虑并发情况:在自动化测试中,应特别关注并发访问的情况。

确保系统在并发访问下的稳定性,处理好并发性问题,避免出现测试失败的情况。

4. 模拟网络环境:为了应对网络问题导致的测试失败,可以使用工具模拟不同的网络环境,包括网络延迟、不可靠的网络连接等。

通过在不同网络环境下进行测试,提前发现和解决网络问题。

5. 日志和报告分析:在自动化测试过程中,记录详细的日志信息,并定期进行分析和归纳。

自动化测试中的异常处理与错误报告技巧

自动化测试中的异常处理与错误报告技巧

自动化测试中的异常处理与错误报告技巧自动化测试在软件开发过程中扮演着关键的角色,可以提高测试效率、减少人力成本,并且能够在重复执行中保持一致性。

但是,在自动化测试中,难免会出现异常情况和错误,正确的异常处理与错误报告技巧对于保证测试结果的有效性和可靠性至关重要。

本文将介绍几种常见的自动化测试中的异常处理与错误报告技巧,帮助测试人员提高测试质量。

一、异常处理技巧1. 异常捕获与处理在自动化测试过程中,可能会出现各种类型的异常,如断言失败、元素定位失败等。

为了提高测试的稳定性和可靠性,需要对这些异常进行捕获和处理。

首先,需要使用try-catch语句块捕获异常,避免测试过程中因为异常导致整个测试中断。

其次,根据不同的异常类型,采取相应的处理措施。

例如,可以重新尝试定位元素,重启浏览器等。

最后,在异常处理完成后,应该及时记录异常信息,并向测试报告中添加相应的错误信息,方便后续的错误排查。

2. 断言处理在自动化测试中,断言常被用来验证测试结果是否符合预期。

当断言失败时,需要正确处理断言异常。

对于断言异常,可以通过捕获AssertionError异常,并记录错误信息,以便后续分析。

另外,还可以添加截图功能,当断言失败时,自动截取当前页面的截图,并将截图添加至测试报告,以便测试人员更直观地了解出错的原因。

3. 超时处理在自动化测试中,有时会出现页面加载过慢、网络延迟等情况,导致测试执行超时。

为了避免测试过程中无限等待,需要设置合理的超时时间,并对超时进行处理。

可以通过设置隐式等待或显式等待来控制超时时间。

当超时发生时,可以记录错误信息并添加到测试报告中,同时也可以进行相应的重试操作。

超时处理的灵活性和准确性对于自动化测试的稳定性和可靠性非常重要。

二、错误报告技巧1. 简明扼要的错误描述在测试报告中,对于每一个错误,应提供简明扼要的错误描述,包括错误类型、出错位置、错误原因等。

错误描述应该具备足够的准确性和简洁性,使接收者能够快速理解错误的本质。

Python+Selenium操作一:截图详解

Python+Selenium操作一:截图详解

Python+Selenium操作⼀:截图详解在做测试的时候,空⼝⽆凭都是⽩掐,特别是⾃动化测试的时候,更需要图⽚来佐证⾃⼰发现的问题话不多说,直接进⼊主题,技术就是这么直⽩Webdriver⾃带截图功能,get_screenshot_as_file(),save_screenshot(),使⽤起来还是蛮⽅便的get_screenshot_as_file()⽅式该⽅式很简单,通过driver获取该⽅法,将截图要保存的路径写⼊就好,先看⼀张图,没运⾏代码的时候,Picture⽬录下还没有名为baidu.png的图⽚,建个Picture⽬录,是为了⽅便管理截图的图⽚接下来运⾏代码,保存的图⽚如下:可以看到,图⽚是截图成功了的,在对应⽂件夹下也是可以看到图⽚的,代码如下:# coding=utf-8from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("https://")driver.maximize_window()time.sleep(2)try:picture_url=driver.get_screenshot_as_file('G:\\201801-\\python_code\\Demo\\Picture\\baidu.png')print("%s:截图成功" % picture_url)except BaseException as msg:print(msg)driver.quit()这⾥需要注意的是,⽂件存放的路径⼀定要正确,路径中的\\双斜杠,有⼀个是转义符,这个就不多说了这种⽅式写法太过于死板,这样运⾏下去,图⽚名字会重名,达不到什么好效果,可以⽣成代码运⾏的当前时间,来做为图⽚名,这样就不会再出现该问题了,修改代码如下:# coding=utf-8from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("https://")driver.maximize_window()time.sleep(2)picture_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))print(picture_time)try:picture_url=driver.get_screenshot_as_file('G:\\201801-\\python_code\\Demo\\Picture\\'+ picture_time +'.png')print("%s:截图成功" % picture_url)except BaseException as msg:print(msg)driver.quit()代码运⾏后,查看截图的效果,如下:该⽅法使⽤起来更加⽅便,算是⼀个⼩⼩优化save_screenshot()⽅式save_screenshot()与get_screenshot_as_file()⽅式都是⼀样,先看⼀个⼩例⼦,代码如下:# 截图⽅式⼆# coding=utf-8from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("https://")driver.maximize_window()time.sleep(2)try:picture_url=driver.save_screenshot('.\\baidu1.png')print("%s :截图成功" % picture_url)except BaseException as msg:print("%s :截图失败" % msg)driver.quit()运⾏该代码后,在当前⽬录下会保存成功⼀张名为baidu1.png的图⽚,如下:⼀种⽅式学会,另⼀种是不是很简单了,接下来以这种截图⽅式,来做个优化吧,先看代码:# 截图⽅式⼆# coding=utf-8from selenium import webdriverimport osimport time# ⽣成年⽉⽇时分秒时间picture_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))directory_time = time.strftime("%Y-%m-%d", time.localtime(time.time()))print(picture_time)print(directory_time)# 打印⽂件⽬录print(os.getcwd())# 获取到当前⽂件的⽬录,并检查是否有 directory_time ⽂件夹,如果不存在则⾃动新建 directory_time ⽂件try:File_Path = os.getcwd() + '\\' + directory_time + '\\'if not os.path.exists(File_Path):os.makedirs(File_Path)print("⽬录新建成功:%s" % File_Path)else:print("⽬录已存在")except BaseException as msg:print("新建⽬录失败:%s" % msg)driver = webdriver.Chrome()driver.get("https:///")try:url=driver.save_screenshot('.\\' + directory_time + '\\' + picture_time + '.png')print("%s :截图成功" % url)except BaseException as pic_msg:print("截图失败:%s" % pic_msg)time.sleep(2)driver.quit()该代码的优化,是⾃动创建⽇期⽬录,并将截取的图⽚以年⽉⽇时分秒命名保存在当前⽇期⽬录下,这样就能很⽅便的查看图⽚保存路径,也⽅便管理⾃⼰的测试图⽚运⾏代码,我们来查看结果,如下:这样运⾏代码后,就⾃动⽣成了名为2018-09-16的⽂件夹,截取的图⽚命名为2018-09-16-16_14_18.png,并保存在2018-09-16的⽂件夹下,如果明天运⾏该代码,就会⽣成新的⽂件夹,并命名为2018-09-17,这样就很好的区分了图⽚⽇期来源,如果再次运⾏该代码,就会提⽰⽂件夹已存在,图⽚依然截取成功,如下:好了,这就是今天的截图内容了,还有可优化的地⽅,⽐如,截取指定⼤⼩的图⽚,截取元素的图⽚,如果页⾯很长,单单使⽤该两种⽅式是截取不全的,这就需要使⽤JS的配合了。

自动化测试的错误处理机制

自动化测试的错误处理机制

自动化测试的错误处理机制随着信息技术的快速发展和广泛应用,软件产品的需求与日俱增,软件产品的质量和稳定性成为了行业和企业必须重视的问题。

而自动化测试作为一个高效的测试手段,在软件开发和维护中已经得到了广泛的应用。

但是,任何东西都有它的缺陷,自动化测试也不例外。

在测试用例执行的过程中,测试人员需面临多种错误情况,如测试用例执行失败、测试用例异常,甚至是自动化测试工具自身的问题。

而由于测试用例数量的巨大,因此错误处理机制的质量关系到整个自动化测试的准确性和可靠性。

那么自动化测试的错误处理机制应该如何构建呢?一、失败截图测试用例失败的情况时有发生。

在测试执行时,如果出现了失败的情况,测试人员首先要保证及时处理,防止后续测试用例的执行受到影响。

其次,测试人员应该记录下失败的情况,包括错误信息、测试用例的编号、测试用例的描述,以及失败相关的截图等信息,方便开发人员及时进行排查和修复。

失败截图可以提供足够的信息,帮助开发人员精准的找到问题所在,从而有效的解决问题。

同时,对于测试用例失败的情况,测试人员应该记录下失败原因或是一个大概的分析,这些信息能帮助测试人员更加深入地分析测试结果,从而更好地验证软件的质量。

二、详细错误日志测试过程中,错误日志也是重要的信息之一。

测试人员应该记录下执行失败时的错误信息、日志信息等,更好地定位和分析问题。

并且通常情况下,测试人员应该建立一个专门记录日志信息的文件,在文件中详细记录每一个测试用例的测试结果和执行信息,这样可以方便测试人员根据日志信息进行问题定位,尤其是针对持续集成的自动化测试,错误的日志信息也是非常重要的,错误信息越详细,问题的定位和解决也就越快捷。

三、测试用例执行失败后的自动处理针对一些测试用例执行失败后,可以根据事先设定的条件进行自动处理,方便程序的下一步处理。

例如,当测试用例执行失败时,程序自动跟进问题,将问题分配给相应的开发团队进行解决,同时提供了错误的截图和日志信息,增加了处理问题的效率。

如何进行移动端截屏自动化测试

如何进行移动端截屏自动化测试移动应用截屏自动化测试是目前移动应用测试的重要环节之一。

随着移动应用的飞速发展,确保应用的质量成为了开发、测试人员研究的重要课题。

在这个大背景下,移动端截屏自动化测试的重要性更加凸显。

本文将介绍如何进行移动端截屏自动化测试。

一、准备工作(1)安装adbadb是android的调试工具,需要在电脑上安装。

安装方法自行百度或Google。

(2)安装screenshot2库安装方法:pip install screenshot2(3)连接手机首先需要将手机通过USB数据线连接到电脑上。

(4)开启USB调试模式进入手机设置,将USB调试模式打开。

(5)下载测试应用下载需要测试的应用,安装到手机中。

二、进行截屏测试(1)打开screenshot2库,拍摄截屏screenshot2库可以在Python中直接调用,可根据需要制定截屏区域。

import screenshot2img = screenshot2.take_screenshot()with open('screenshot.jpg', 'wb') as fp:fp.write(img)(2)保存截屏文件截屏后的文件是以二进制流的形式存储的,需要将其保存成图片格式(如JPG、PNG等),以便于观察和分析。

(3)分析截屏文件利用图像分析算法对截屏文件进行分析,自动判断应用的业务逻辑是否正确,从而能够发现潜在的问题,优化应用质量。

三、注意事项(1)截屏分辨率设置要保证自动化测试过程中截屏的像素和实际手机分辨率一致,避免截屏图像扭曲,影响测试效果。

(2)应用页面跳转顺序要保证测试的时候跳转页面的顺序和实际用户使用的顺序一致,即测试流程和用户行为相符,避免测试结果失真。

(3)测试用例覆盖面广测试用例覆盖面广,要覆盖到应用的所有功能模块和业务逻辑,避免遗漏问题点。

(4)应用版本管理为了方便追踪测试结果和问题,需要对不同版本的应用进行管理,并记录测试的结果和问题点。

自动化测试脚本中的失败处理机制及实现方法

自动化测试脚本中的失败处理机制及实现方法自动化测试脚本在软件开发过程中扮演着重要的角色,它可以帮助开发人员对软件进行快速的测试和验证,提高开发效率和软件质量。

但是,在实际运行过程中,测试脚本可能会出现各种问题,如失败、特定环境下的错误等,这些问题会给测试工作带来不必要的麻烦,因此设计一个稳定可靠的失败处理机制至关重要。

失败处理机制是指当测试脚本在运行过程中出现错误或异常时,能够自动进行恢复和处理,保证测试流程的正常进行和测试结果的可靠性。

下面将介绍自动化测试脚本中常见的错误和异常以及相应的解决方法。

1.元素定位失败元素定位失败是指测试脚本无法找到测试环境中的特定元素,如按钮、文本框、下拉框等,导致测试步骤无法继续执行。

这可能是由于页面元素被修改或删除造成的,也可能是由于测试脚本中定位元素的方法不正确。

为了避免元素定位失败,我们可以使用多种定位方法,如ID、class、name、xpath、css等。

另外,我们还可以添加等待时间,在元素加载完成之后再进行操作,以提高测试脚本的鲁棒性。

如果出现元素定位失败,我们可以设置重试机制,即在查找元素之前,尝试多次加载页面,等待元素加载完成后再进行查找。

如果多次重试后仍无法找到元素,则需要进行错误处理,可以通过抛出异常或记录日志的方式,通知测试人员对测试环境进行检查或修改测试脚本中的元素定位方法。

2.接口访问失败接口访问失败是指测试脚本无法正确地访问测试环境中的接口或服务,例如网络连接异常、服务异常或接口参数错误等。

这种错误通常提示测试人员进行排查和修复。

为了避免接口访问失败,我们可以进行接口测试,检查接口的稳定性和可靠性。

在测试脚本中,我们可以设置接口超时时间和重试机制,当接口访问超时或失败时,重试多次,直到成功为止。

同时,我们还可以添加日志记录机制,以便在出现问题时进行排查。

如果接口访问失败,我们可以根据具体情况设置错误处理机制。

如提示测试人员检查测试环境或接口参数是否正确,或选择快速失败退出测试流程,以确保测试结果的准确性。

如何进行自动化测试的异常处理

如何进行自动化测试的异常处理自动化测试是软件开发过程中的重要环节,可以提高测试效率和质量。

然而,在进行自动化测试时,异常处理是一个重要的考虑因素。

本文将讨论如何进行自动化测试的异常处理,以确保测试结果的准确性和稳定性。

一、异常处理的重要性在自动化测试过程中,可能会遇到各种异常情况,如网络中断、资源竞争、程序崩溃等。

这些异常可以导致测试失败,甚至影响整个测试过程。

因此,良好的异常处理机制是至关重要的。

二、异常处理的基本原则1. 异常分类:首先,需要对可能出现的异常进行分类和定义,如网络异常、页面加载超时、数据错误等。

这样可以更好地判断和处理异常情况。

2. 异常捕获:在自动化测试代码中,应该使用try-catch语句捕获可能发生的异常,避免异常向上抛出导致测试中断。

捕获异常后,可以进行相应的处理或记录。

3. 异常处理:针对不同的异常类型,可以采取不同的处理方式。

比如,对于网络异常可以进行重试操作,对于页面加载超时可以进行等待操作,对于数据错误可以进行数据修复或报警等。

4. 异常报告:在异常发生后,应该及时生成异常报告,包括异常类型、异常发生的用例、堆栈信息等。

这有助于快速定位和解决异常问题,并对测试系统进行改进和优化。

三、自动化测试的异常处理策略1. 设置超时机制:在执行自动化测试时,可以设置一定的超时时间。

如果操作在规定时间内未完成,就认为是超时异常。

这样可以避免测试过程因为等待时间过长而卡住。

2. 设计恢复机制:当测试执行过程中出现异常时,有时可以通过一定的恢复机制继续执行测试。

比如,遇到网络异常时,可以进行重试操作;遇到页面加载超时时,可以等待一段时间再进行尝试。

3. 测试环境隔离:为了保证测试的独立性和稳定性,可以将自动化测试环境与其他环境进行隔离。

这样可以避免外部因素对测试的影响,减少异常的发生。

4. 异常监控和报警:可以使用监控工具实时监控测试执行过程中的异常情况,并在发生异常时发送报警通知。

自动化测试中的异常处理最佳实践

自动化测试中的异常处理最佳实践在软件测试的过程中,很多人都会遇到测试用例中出现异常的情况。

有时候我们会因为这些异常而无法进行有效的测试,甚至导致测试失败。

此时,我们就需要在自动化测试中添加异常处理来保证测试的有效性,并找出异常的原因并解决。

什么样的异常属于自动化测试中常见的异常呢?如下:1.无法定位元素,也就是不能找到你所要找的元素。

2.元素定位有问题,可能因为缺失属性,属性值发生更改,位置改变等问题。

3.元素不可交互,也就是无法进行点击,输入等操作。

4.因为系统负荷过大等原因,导致页面加载缓慢的问题。

5.服务器错误等。

为了解决这些异常,以下是自动化测试中的异常处理最佳实践:1. 异常截图:在测试用例中添加截图的代码可以将出现异常的页面,截图记录下来。

这样,当出现异常时,可以通过查看截图来快速找到问题并解决。

同时,可以在测试报告中将截图一并呈现,以令测试人员更直观地查看问题。

2. 重试机制:当测试用例出现异常时,需要在代码中设置重试次数,以保证测试的有效性。

例如:当错误信息显示“无法定位元素”的时候,我们可以在代码中加上重新查询元素的语句,尝试重新定位,直到找到目标元素或者重试次数达到上限。

3. 超时设置:我们需要根据真实情况合理设置超时时间。

在代码中加入隐性等待,等待元素出现或可交互,一定程度上减少了因为页面加载缓慢而带来的异常情况,提高测试效率。

4. 日志记录:在测试代码中加入日志记录,记录每个步骤的执行结果及异常信息。

这样,出现异常时可以通过查看日志,快速定位问题所在。

对于一些需要长时间运行的测试用例,可以通过日志记录运行进度,也可以更好的掌握测试进度和效率。

5. 异常处理方法封装:将异常处理的方法进行封装,可以使代码更简洁,而异常代码更加易于维护。

因为在程序执行过程中,异常处理是一个经常需要完成的工作,所以封装和重用异常处理方法能提高代码的可读性和可维护性。

6. 自定义异常:在代码中自定义异常处理,增加异常信息,从而更清楚评估出现不同异常的可能性及原因,加速问题解决时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WebDriver 之测试失败自动截图webDriver 测试的时候最头疼的就是调试。

但也远不及运行的时候出错,再回头调试来的痛苦。

总所周知, web 自动化的代码都非常脆弱,一份代码一会运行失败,一会运行成功也是很正常的事情。

总的来说造成案例运行失败的原因大抵有两点:环境问题:比如网络不稳定啊代码变动:比如某个元素不在遇到 bug :这就是真的发现 bug 了无论哪一种,遇到了都需要花一番时间去debug。

那如果这个时候有一张运行时候出错的截图,那就一目了然了。

(即便不一目了然,也有很多帮助)在运行出错的时候,捕获错误并截图有两种思路:自定义一个WeDdriver 的监听器,在出异常的时候截图。

利用Juint 的TestRule,自定义一个Rule 在运行失败的时候截图。

自定义监听器截图的原理截图需要用到RemoteWebDriver。

在 Selenium 官方我们可以找到:One nice feature of the remotewebdriver is that exceptions oftenhave an attached screen shot, encodedas a Base64 PNG. In order to get thisscreenshot, you need to write codesimilar to:public String extractScreenShot(WebDriverException e) {Throwable cause = e.getCause();if (cause instanceof ScreenshotException) {return ((ScreenshotException) cause).getBase64EncodedScreenshot();}return null;}意思就是说,每个异常都是ScreenshotException 的对象,转码一下就可以用了。

这是截图的本质。

import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import org.openqa.selenium.WebDriver;import org.openqa.selenium.internal.Base64Encoder;import org.openqa.selenium.remote.ScreenshotException;importorg.openqa.selenium.support.events.AbstractWebDriverEventListener;/*** This is an customized webdriver event listener.* Now it implements onException method: webdriver will take a screenshot * when it meets an exception. It's good but not so usable. And when we use * WebDriverWait to wait for an element appearing, the webdriver will throw * exception always and the onException will be excuted again and again, which* generates a lot of screenshots.* Put here for study* Usage:* WebDriver driver = new FirefoxDriver();* WebDriverEventListener listener = new CustomWebDriverEventListener();* return new EventFiringWebDriver(driver).register(listener);** @author qa**/public class CustomWebDriverEventListener extends AbstractWebDriverEventListener {@Overridepublic void onException(Throwable throwable, WebDriver driver) { Throwable cause = throwable.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();}}}}}主要看onException 这个方法的实现,很明显,我们捕获了这个异常,然后通过强制转换将图片提取出来,写入硬盘。

然后就是使用这个监听器,通常会在setup 方法里面将这个监听器注册到WebDriver 中去,看代码:@Testpublic void setup(){String remote_driver_url = "http://localhost:4444/wd/hub";DesiredCapabilities capability = null;capability = DesiredCapabilities.firefox();WebDriverEventListener eventListener = new CustomWebDriverEventListener ();WebDriver driver = new EventFiringWebDriver(new RemoteWebDriver(new URL(remote_driver_url), capability)).register(eventListener);}在这之后,如果运行出错,WebDriver 抛出异常就会在相应的classpath 下面生成png 的截图。

自定义TestRule和自定义WebDriver 监听器不同,自定义TestRule 只有在这个Rule 被执行的时候,才去做一些我们预设的CallBack。

所以这个截图动作,对于WebDriver 而言,是主动的。

那么,我们就需要自定义一个RemoteWebDriver 来实现截图功能。

WebDriver 自身提供了TakesScreenshot 这个接口,我们只要实现它就可以了,看代码:import .URL;import org.openqa.selenium.OutputType;import org.openqa.selenium.TakesScreenshot;import org.openqa.selenium.WebDriverException;import org.openqa.selenium.remote.CapabilityType;import org.openqa.selenium.remote.DesiredCapabilities;import org.openqa.selenium.remote.DriverCommand;import org.openqa.selenium.remote.RemoteWebDriver;public class CustomRemoteWebDriver extends RemoteWebDriver implementsTakesScreenshot {public CustomRemoteWebDriver(URL url, DesiredCapabilities dc) {super(url, dc);}@Overridepublic X getScreenshotAs(OutputType target)throws WebDriverException {if ((Boolean) getCapabilities().getCapability( CapabilityType.TAKES_SCREENSHOT)) {return target.convertFromBase64Png(execute(DriverCommand.SCREENSHOT) .getValue().toString());}return null;}}然后,我们在加一个封装类,将截图方法放进去。

WebDriverWrapper.screenShot :/*** Function to take the screen shot and save it to the classpath dir. * Usually, you will find the png file under the project root.** @param driver* Webdriver instance* @param desc* The description of the png*/public static void screenShot(WebDriver driver, String desc) { Date currentTime = new Date();SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");String dateString = formatter.format(currentTime);File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);try {desc = desc.trim().equals("") ? "" : "-" + desc.trim();File screenshot = new File("screenshot" + File.separator+ dateString + desc + ".png");FileUtils.copyFile(scrFile, screenshot);} catch (IOException e) {e.printStackTrace();}}下面,就是添加Junit 的TestRule:import org.junit.rules.TestRule;import org.junit.runner.Description;import org.junit.runners.model.Statement;import org.openqa.selenium.WebDriver;public class TakeScreenshotOnFailureRule implements TestRule { private final WebDriver driver;public TakeScreenshotOnFailureRule(WebDriver driver) {this.driver = driver;}@Overridepublic Statement apply(final Statement base, Description description) { return new Statement() {@Overridepublic void evaluate() throws Throwable {try {base.evaluate();}catch (Throwable throwable) {WebDriverWrapper.screenShot(driver, "assert-fail");throw throwable;}}};}}代码很简单,在抛出evalate 方法的错误之前,截图。

相关文档
最新文档