【Python】【装饰器】【UI自动化】当界面元素迟迟未加载出来时的灵活处理办法

一般异常捕获做法(不够灵活,复用性不强)

if __name__ == '__main__':
    # 一般做法(或者再加个循环触发)
    try:
        driver.switch_to.alert.accept()  # 有可能弹框没出来 会报错
    except:
        time.sleep(5)
        driver_.switch_to.alert.accept()

加了装饰器的做法(及其灵活,复用性强)

一、基础版(被装饰函数不带参数)

def loop_waiting(seconds=1, times=1):
    """
    循环等待触发
    常用场景(UI自动化):当页面未加载完成时driver直接找元素 可能会报错 等待一段时间后 页面加载完成后再去找
    :param seconds: 每次循环等待秒数
    :param times: 循环次数
    :return:
    """

    def wrapper(func):
        def inner_wrapper():
            for i in range(times):
                try:
                    func()
                    break
                except:
                    print(f'循环等待触发{times}次,每次等待{seconds}秒,当前第{i + 1}次')
                    time.sleep(seconds)

        return inner_wrapper

    return wrapper


if __name__ == '__main__':
    # 加了装饰器的做法
    @loop_waiting(5, 3)  # 循环触发3次,每次等待5秒
    def alert_accept():
        driver.switch_to.alert.accept()  # 有可能弹框没出来 会报错

    alert_accept()

 

二、高级版(通用:被装饰函数可带参数)

# 装饰器
import time


def wrapper_loop_waiting(times=1, sleep=1, print_log=True):
    """
    循环等待装饰器(若func()执行报错 则循环等待)
    :param times: 等待次数
    :param sleep: 每次等待时间(秒)
    :param print_log: 是否打印日志
    :return:
    """

    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            for i in range(times):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if print_log:
                        print(
                            f'{func.__name__}: 循环等待触发{times}次,每次等待{sleep}秒,当前第{i + 1}次 循环触发原因:{e}'
                        )
                    time.sleep(sleep)

        return inner_wrapper

    return wrapper


@wrapper_loop_waiting(times=5, print_log=True)
def aa(c, d):
    a = c / d


if __name__ == '__main__':
    aa(2, 0)

 

执行结果

 

posted @ 2021-06-09 11:50  淡怀  阅读(387)  评论(0编辑  收藏  举报