zoukankan      html  css  js  c++  java
  • 【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)

    执行结果

    如果忍耐算是坚强 我选择抵抗 如果妥协算是努力 我选择争取
  • 相关阅读:
    Idea启动多服务时的Dashboard展示
    通过maven动态配置spring boot配置文件
    辅域抢夺五大角色命令
    H3C交换机堆叠技术
    KMS激活专用:所有Windows版本的GVLK密钥对照表
    Windows Server 2012从Evaluation版转成正式版
    u盘装系统无法引导
    [调优]彻底解决RDP连接过程缓慢的问题
    [排错]无法初始化 vGPU“grid_p40-1q”的插件“/usr/lib64/vmware/plugin/libnvidia-vgx.so”
    Virtual Apps and Desktops 7 1912 LTSR集成DB迁移到SQL Server 2016 AlwaysOn生产环境
  • 原文地址:https://www.cnblogs.com/danhuai/p/14866276.html
Copyright © 2011-2022 走看看