简单一行代码截图记录每次页面错误

来呀~

欢迎关注我的公众号

在进行Web UI的自动化测试的时候,有些错误无法简单的通过文字描述清楚,还是需要进行页面截图。但为了让该优化不需要投入过多的时间,采用装饰器进行装饰。

基本思路:正常执行脚本,当异常或断言报错时,触发截图,正常返回异常

编写装饰器

大概装饰器代码如下

def error_screenshot(func):	
    @wraps(func)	
    def decorator(*args, **kwargs):	
        try:	
            obj = func(*args, **kwargs)	
        except Exception as e:	
            截图操作	
            raise Exception(e)	
        return obj	
    return decorator

使用 tryexcept可以捕获到异常,使用 raiseException(e)完成截图后把异常继续抛出。

因为每次的 driver对象所处的 类名可能不一致,所以进行一定的判断。假设进行界面操作的类名都是以 ui结尾。

for key, value in locals()['kwargs'].items():	
    if key.endswith('ui'):	
        pic_name = f'{str(time.time())}.png'	
        value.driver.save_screenshot(pic_name)	
        allure.attach.file(f'{pic_name}', attachment_type=allure.attachment_type.PNG)

循环当前的 locals()['kwargs']拿到该类名,再使用该类中的 driver对象进行截图操作,并使用 allure将图片显示在报告中。

编写操作类

本次测试将 百度当做测试目标

简单的封装一个操作百度的界面操作类:BaiDuActionUi

包含了:

  • 打开百度 open_web

  • 在输入栏输入指定内容 input_message

  • 在定位错误的输入栏输入指定内容 input_message_bug

  • 点击查找按钮 search

  • 关闭浏览器 close

class BaiDuActionUi():	
    def __init__(self):	
        self.url = 'https://www.baidu.com'	
        self.driver = webdriver.Chrome(executable_path='./chromedriver')	
        self.driver.implicitly_wait(3)	
        self.input = 'kw'  # 搜索栏	
        self.search_btn = 'su'  # 查找按钮	
    def __str__(self):	
        return '百度'	
    @allure.step('打开页面')	
    def open_web(self):	
        self.driver.get(self.url)	
    @allure.step('输入内容')	
    def input_message(self, message):	
        self.driver.find_element_by_id(self.input).clear()	
        self.driver.find_element_by_id(self.input).send_keys(message)	
    @allure.step('有异常的输入内容')	
    def input_message_bug(self, message):	
        self.driver.find_element_by_id(f'{self.input}1').clear()	
        self.driver.find_element_by_id(f'{self.input}1').send_keys(message)	
    @allure.step('点击查找')	
    def search(self):	
        self.driver.find_element_by_id(self.search_btn).click()	
    @allure.step('关闭浏览器')	
    def close(self):	
        try:	
            self.driver.close()	
        except Exception as e:	
            print(f'关闭浏览器失败:{e}')

编写测试代码

使用 fixture编写测试前浏览器的开启,测试后浏览器的关闭

  • 正常测试: test_selenium

  • 抛出断言错误的测试: test_selenium1

  • 定位异常的测试: test_selenium2

@pytest.fixture()	
def baiduactionui():	
    baidu = BaiDuActionUi()	
    baidu.open_web()	
    yield baidu	
    baidu.close()	
@error_screenshot	
def test_selenium(baiduactionui):	
    """	
    正常	
    """	
    with allure.step(f'测试输入python点击查找'):	
        baiduactionui.input_message('python')	
        baiduactionui.search()	
@error_screenshot	
def test_selenium1(baiduactionui):	
    """	
    assert 异常	
    """	
    with allure.step(f'测试输入python点击查找'):	
        baiduactionui.input_message('python')	
        baiduactionui.search()	
        assert 0, '瞎报的异常'	
@error_screenshot	
def test_selenium2(baiduactionui):	
    """	
    driver 查找元素异常	
    """	
    with allure.step(f'测试输入python点击查找'):	
        baiduactionui.input_message_bug('python')	
        baiduactionui.search()	
if __name__ == '__main__':	
    pytest.main([	
        '-v', 'test_selenium.py', '--alluredir', './allure_report'	
    ])	
    os.system("allure generate -c allure_report/ -o report --clean")

测试结果

============================= test session starts ==============================	
platform darwin -- Python 3.7.1, pytest-5.0.1, py-1.8.0, pluggy-0.12.0 -- /usr/local/bin/python3.7	
cachedir: .pytest_cache	
rootdir: /Users/zhongxin/Desktop/py/zx/test	
plugins: allure-pytest-2.8.5	
collecting ... collected 3 items	
test_selenium.py::test_selenium PASSED                                   [ 33%]	
test_selenium.py::test_selenium1 FAILED                                  [ 66%]	
test_selenium.py::test_selenium2 FAILED                                  [100%]	
=================================== FAILURES ===================================

640?wx_fmt=jpeg

点击 测试套找到错误的脚本 test_selenium1

640?wx_fmt=jpeg

找到错误的脚本 test_selenium2

640?wx_fmt=jpeg

test_selenium没有错误,报告中没有截图

test_selenium1在完成输入和查找后断言报错,页面截图停留在搜索完成页面

test_selenium2在输入栏的位置定位元素错误,页面截图停留在搜索开始页面

完整代码

# -*- coding:utf-8 -*-	
"""	
@Describe: selenium_test	
@Author: zhongxin	
@Time: 2019-09-29 22:50	
@File: test_selenium.py	
@Email: 490336534@qq.com	
"""	
import os	
import time	
import allure	
import pytest	
from selenium import webdriver	
from functools import wraps	
def error_screenshot(func):	
    @wraps(func)	
    def decorator(*args, **kwargs):	
        obj = ''	
        try:	
            obj = func(*args, **kwargs)	
        except Exception as e:	
            for key, value in locals()['kwargs'].items():	
                if key.endswith('ui'):	
                    pic_name = f'{str(time.time())}.png'	
                    value.driver.save_screenshot(pic_name)	
                    allure.attach.file(f'{pic_name}', attachment_type=allure.attachment_type.PNG)	
            raise Exception(e)	
        return obj	
    return decorator	
class BaiDuActionUi():	
    def __init__(self):	
        self.url = 'https://www.baidu.com'	
        self.driver = webdriver.Chrome(executable_path='./chromedriver')	
        self.driver.implicitly_wait(3)	
        self.input = 'kw'  # 搜索栏	
        self.search_btn = 'su'  # 查找按钮	
    def __str__(self):	
        return '百度'	
    @allure.step('打开页面')	
    def open_web(self):	
        self.driver.get(self.url)	
    @allure.step('输入内容')	
    def input_message(self, message):	
        self.driver.find_element_by_id(self.input).clear()	
        self.driver.find_element_by_id(self.input).send_keys(message)	
    @allure.step('有异常的输入内容')	
    def input_message_bug(self, message):	
        self.driver.find_element_by_id(f'{self.input}1').clear()	
        self.driver.find_element_by_id(f'{self.input}1').send_keys(message)	
    @allure.step('点击查找')	
    def search(self):	
        self.driver.find_element_by_id(self.search_btn).click()	
    @allure.step('关闭浏览器')	
    def close(self):	
        try:	
            self.driver.close()	
        except Exception as e:	
            print(f'关闭浏览器失败:{e}')	
@pytest.fixture()	
def baiduactionui():	
    baidu = BaiDuActionUi()	
    baidu.open_web()	
    yield baidu	
    baidu.close()	
@error_screenshot	
def test_selenium(baiduactionui):	
    """	
    正常	
    """	
    with allure.step(f'测试输入python点击查找'):	
        baiduactionui.input_message('python')	
        baiduactionui.search()	
@error_screenshot	
def test_selenium1(baiduactionui):	
    """	
    assert 异常	
    """	
    with allure.step(f'测试输入python点击查找'):	
        baiduactionui.input_message('python')	
        baiduactionui.search()	
        assert 0, '瞎报的异常'	
@error_screenshot	
def test_selenium2(baiduactionui):	
    """	
    driver 查找元素异常	
    """	
    with allure.step(f'测试输入python点击查找'):	
        baiduactionui.input_message_bug('python')	
        baiduactionui.search()	
if __name__ == '__main__':	
    pytest.main([	
        '-v', 'test_selenium.py', '--alluredir', './allure_report'	
    ])	
    os.system("allure generate -c allure_report/ -o report --clean")
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
捕获当前页面的屏幕截图完整而可靠,无需任何额外权限! 截取当前浏览器窗口的全屏屏幕截图的最简单方法。 单击扩展程序图标(或按Alt + Shift + P),观看扩展程序捕获页面的每个部分,然后将其传输到屏幕截图的新标签页,您可以在其中将其下载为图像或PDF,甚至只是将其拖动即可到您的桌面。 *没有膨胀,没有广告,没有不必要的权限,只是将整个网页变成图像的一种简单方法。* *新功能:*先进的屏幕捕获技术可以处理复杂的页面,包括内部可滚动元素以及嵌入式iframe,与以往不同任何其他扩展名。 如果您遇到问题,请通过捕获页面上的客户支持标志图标进行报告,以便我们为您和其他使用此扩展程序的用户改进扩展名。 为了截取整个页面的屏幕快照,它必须滚动到每个可见部分,因此请耐心等待,因为它会Swift组装所有部分。 在极少数情况下,如果您的页面太大,以至于Chrome无法存储在一张图片中,它将通知您并将其拆分为单独的标签中的图片。 将结果导出为PNG,JPEG或各种PDF纸张尺寸-所有这些都可以通过扩展程序的选项进行配置。 此扩展由独立开发人员运行。 在github上查看原始的开源项目:https://github.com/mrcoles/full-page-screen-capture-chrome-extension更改日志:5.7 — 2019-09-15 — imgur.com 5.6的错误修复— 2019-09-13 —捕获长页面时由Chrome 77引起的空白屏幕截图的初始错误修复5.5 — 2019-09-04 —修复了影响Behance和BBC新闻网站5.4的问题— 2019-09-03 —添加“另存为”到选项页面和用户报告的错误修正5.3 — 2019-08-02 —次错误修正5.2 — 2019-07-22 —各种错误修正,包括PDF在导出5.1时被截断的问题— 2019-04-22 —视觉刷新,来自的错误修正用户报告的问题,包括具有iframe权限的Chrome退化修复程序4.9-2018-09-15-用户报告的问题中的各种错误修复,包括Salesforce闪电仪表板4.8-2018-08-14-额外处理了与下载相关的Chrome 68错误允许隐身设置(敬请关注更新以处理在Chrome Beta和Canary> = v69中下载的问题)4.7 — 2 018-08-08 —一些视差站点和其他边缘情况的错误修正4.6 — 2018-07-23 —修复了一些页面停止滚动的回归,改进了固定背景图像4.5 — 2018-07-18 —修正了错误白线修复4.4 — 2018-07-16 —新增了对固定标头跳转的支持,新的权限控件,下载修复,视差改进4.3 — 2018-06-29 —针对零星iframe错误错误修复4.2 — 2018-06-14 —错误修复来自用户报告4.1-2018-06-12-错误修复,缩小了白线修复4.0-2018-06-10-对iframe和框架集的新支持,Chrome 67兼容性更新3.17-2018-05-30-滚动问题和改进动画处理3.16-2018-05-21-修复了用户报告的滚动问题3.15-2018-05-08-修复了固定元素的其他问题,更好地捕获了提要3.14-2018-05-02-导出到PDF文件名的改进3.13 — 2018-05-01 —修复了另存为最近下载位置的问题,改进了固定元素3.12 — 2018-04-27 —添加了“导出到PDF”选项,以及错误修正和性能改进3.11 — 2018-04-09 —改进了捕获的屏幕,支持固定背景3.10 — 2018-03-30 —各种页面错误修正,更清洁的选项页面3.9 — 2018-03 -24-修复了问题保存选项,改进了滚动条处理3.8-2018-03-22-增加了指定下载目录的功能,错误修复3.7-2018-03-20-通过选项页下载为PNG或JPG,针对用户报告的问题提供了错误修复3.6 — 2018-03-16 —包括adwords在内的各个页面错误修正,改进的下载功能3.5 — 2018-03-14 —用户报告的错误修正,捕获页面的稳定性得到改进3.4 — 2018-03-09 —滚动条和固定位置的改进通过用户报告3.3的元素-2018-03-07-文件名中的时间戳,批量下载/删除功能,自动下载选项3.2-2018-03-05-通过用户报告3.1的滚动条和固定位置元素的改进03-客户支持功能3.0的更新-2018- 02-27-针对Gmail等困难页面的全新高级滚动算法! 2.12 — 2018-02-23 — svg和用户报告的页面错误修正2.11 — 2018-02-21 —一些用户报告的页面错误修正2.10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值