使用装饰器实现一种失败重跑的方法

简介: 使用装饰器实现一种失败重跑的方法

一、前置说明


自动化测试时,经常会遇到页面和元素未加载完成,从而造成click点击或swipe滑动失败。selenium提供了隐式等待和显示等待的方式,我们也可以自己实现一个更加灵活的失败重跑的方式。


二、代码实现


# decorators.py
import functools
import logging
import time
logger = logging.getLogger(__name__)
def rerun_if_exception(max_attempts=3, interval=0.5, capture_exception=Exception, exclude_exception=TimeoutError):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            last_exception = None
            for attempt in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except capture_exception as e:
                    if isinstance(e, exclude_exception):
                        raise e
                    time.sleep(interval)
                    last_exception = e
                    logger.debug(
                        f'Retry attempt {attempt} for method "{func.__name__}" failed. Exception: {last_exception}')
            raise TimeoutError(
                f'Rerun method "{func.__name__}" failed after {max_attempts} attempts. ') from last_exception
        return wrapper
    return decorator


三、Demo验证


# demo.py
from libs.decorators import rerun_if_exception
@rerun_if_exception()
def method_index_error():
    raise IndexError('index error')
@rerun_if_exception()
def method_timeout_error():
    raise TimeoutError('timeout error')
if __name__ == '__main__':
    import logging
    logging.basicConfig(level=logging.DEBUG)
    method_index_error()


输出日志:

DEBUG:libs.decorators:Retry attempt 0 for method "method_index_error" failed. Exception: index error
DEBUG:libs.decorators:Retry attempt 1 for method "method_index_error" failed. Exception: index error
DEBUG:libs.decorators:Retry attempt 2 for method "method_index_error" failed. Exception: index error
Traceback (most recent call last):
  File "D:\BaiduSyncdisk\xyouwen-workspace\ddautotest\libs\decorators.py", line 15, in wrapper
    return func(*args, **kwargs)
  File "D:\BaiduSyncdisk\xyouwen-workspace\ddautotest\libs\demo.py", line 6, in method_index_error
    raise IndexError('index error')
IndexError: index error
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "D:\BaiduSyncdisk\xyouwen-workspace\ddautotest\libs\demo.py", line 19, in <module>
    method_index_error()
  File "D:\BaiduSyncdisk\xyouwen-workspace\ddautotest\libs\decorators.py", line 25, in wrapper
    raise TimeoutError(
TimeoutError: Rerun method "method_index_error" failed after 3 attempts. 
目录
相关文章
|
11月前
|
Serverless
函数计算在执行请求的过程中遇到了意外的错误
函数计算在执行请求的过程中遇到了意外的错误
86 1
|
2月前
|
监控 Serverless 开发者
函数计算发布功能问题之查看函数的调用日志的问题如何解决
函数计算发布功能问题之查看函数的调用日志的问题如何解决
|
2月前
|
存储 运维 Java
函数计算产品使用问题之怎么配置定时触发器来调用Java函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
关系型数据库 MySQL Serverless
函数计算产品使用问题之触发器不能正常触发函数执行怎么办
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
文字识别 Java
文本,文字识别12,接口返回值和异常封装,一个好的接口,应该包括,错误码,提示信息,返回的数据,应该知道出错,错在哪里,抛出业务异常应该怎样解决?出现业务异常的时候,抛出业务异常,全局异常处理
文本,文字识别12,接口返回值和异常封装,一个好的接口,应该包括,错误码,提示信息,返回的数据,应该知道出错,错在哪里,抛出业务异常应该怎样解决?出现业务异常的时候,抛出业务异常,全局异常处理
|
5月前
|
Java 测试技术 数据库
你遇到过哪些触发NPE的代码场景?
【5月更文挑战第18天】空指针异常(NPE)是开发过程中常见的障碍,它不仅阻碍了代码的正常运行,还常常成为系统不稳定性的根源。本文讲述关于如何避免NPE的一些看法。
|
5月前
|
JSON 前端开发 算法
2715. 执行可取消的延迟函数
2715. 执行可取消的延迟函数
37 0
|
前端开发
前端学习案例-严格模式2-对象的静默失败
前端学习案例-严格模式2-对象的静默失败
74 0
前端学习案例-严格模式2-对象的静默失败
|
人工智能 JavaScript IDE
自动写代码?别闹了!
这几天,GitHub 上有个很火的插件在抖音刷屏了——Copilot。 这个神器有啥用呢?简单来讲,它就是一款由人工智能打造的编程辅助工具。 我们来看看它有啥用。
347 0
|
测试技术
利用装饰器,帮你自动处理异常并优雅实现重跑case
利用装饰器,帮你自动处理异常并优雅实现重跑case
169 0