Selenium webdriver有一个很好用的功能就是对网页截屏,不管是基于Web端还是移动端的UI自动化测试,当用例执行失败时,我们总希望人工回溯失败用例的时候有依有据,这时候除了测试执行的log,还需要有一个更直观的屏幕截图。那么对于UI自动化测试该如何去实现用例失败自动截图呢?
方案思路:
1、截屏API:
对于这样的需求,一般我们选择的测试框架中都会有现成的截屏API,比如WebDriver有提供用于截图的TakesScreenshot类,Android自动化测试的UiAutomator框架也提供了UiDevice.takeScreenshot()截屏方法,所以利用这些已有的API来实现失败截屏并不难。
2、图片管理:
截屏已经实现了,那么问题又来了,图片该怎么命名?新增的图片该放到哪里呢?
第一个问题:你可以按时间戳命名,也可以按用例名称命名;
第二个问题:有条件的可以搞一台服务器作为图片服务器,将图片放到图片服务器上,当然一般都没这么壕,找台主机搞个共享目录存放图片即可,对于移动端测试还可以将图片存放到测试机的SD卡中;
第三个问题,怎么和用例管理,如果你使用了某些有web界面的日志报告框架(比如extentReports、reportNG、以及封装的Log4Reports等),可以直接将图片链接插入到log信息中,那么展示到界面的就是一条图片链接,点击就可以看到截屏的详情。如果是使用的类似于log4j这种纯文本的日志框架,那么只能将图片按用例名称和操作去分类和命名了。
关键代码:
WebDriver截屏代码,截取整个网页窗口
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Screenshot example."""
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 将当前网页窗口保存为screen01.png文件,保存在当前目录
driver.save_screenshot("screen01.png")
browser.quit()
我们运行这段代码之后,会在当前目录创建名为screen01.png的图片文件。
也可以使用get_screenshot_as_file()方法进行截屏
# coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.get_screenshot_as_file('selenium_img.png')
driver.quit()
在上面这个代码运行之后,会自动访问百度,然后搜索selenium,然后截下浏览器的当前状态图片(下图为再电脑目录中的位置和上述代码的截图)

我们要做通用的UI自动化测试框架,通常要将截图的方法封装为一个方法,且将图片保存在一个目录下。

代码如下:
def save_img(self, img_name):
#传入一个img_name, 并存储到默认的文件路径下
self.driver.get_screenshot_as_file('{}/{}.png'.format(os.path.abspath(self.img_path), img_name))
网友评论