一般异常捕获做法(不够灵活,复用性不强)
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)
执行结果