• 【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)

    执行结果

    如果忍耐算是坚强 我选择抵抗 如果妥协算是努力 我选择争取
  • 相关阅读:
    网站测试
    shell102输出数组
    shell101变量
    shell100for无参数形式
    shell99函数中传数组
    shell98函数的参数
    将php中session存入redis中
    windows下安装redis客户端
    window下phpstudy开启redis扩展
    *ginx下开启phpredis扩展
  • 原文地址:https://www.cnblogs.com/danhuai/p/14866276.html
Copyright © 2020-2023  润新知