在Python的子过程中重试Selenium异常

问题描述

我有一个带硒脚本的python,应该使用每个人不同的参数来调用它(我称它为 Tester.py ),为了简化起见,我将其放入了一个新的python文件中并使用#subprocess这样运行它:

# Explanation about retry is next
@retry(retry_count=5,delay=5)

def job():    
    try:
        subprocess.Popen("python Tester.py -user Margareth",shell=True)
        return True
    except subprocess.CalledProcessError:
        return False
        print("System Retrying")
        pass

我的重试包装看起来像这样(但是不起作用):

def retry(retry_count=5,delay=5,allowed_exceptions=()):
    def decorator(f):
        @functools.wraps(f)
        def wrapper(*args,**kwargs):
            for _ in range(retry_count):
                try:
                    result = f(*args,**kwargs)
                    if result:
                        pass
                except allowed_exceptions as e:
                    pass
                time.sleep(delay)
        return wrapper
    return decorator

我与 Tester.py 唯一的问题是硒中的TimeoutException,如果在 x 次和 x 中失败,我想重试它。秒延迟,但是以某种方式#try-catch无法正常工作,而我的重试总是导致随机的第二次重试,而且确实很混乱,有任何线索吗?

解决方法

不需要函数装饰器来实现重试行为。可以通过代码中的“简单” for循环来完成:

import subprocess
import time

retry_count = 5
delay = 5

success = False
for _ in range(retry_count):
    try:
        subprocess.Popen("python Tester.py -user Margareth",shell=True)
        success = True
        break
    except subprocess.CalledProcessError:
        print("System Retrying")
        time.sleep(delay)

在这里,如果subprocess.Popen调用返回而没有引发错误,则我们跳出循环,否则我们将重试retry_count次。

此外,请注意,在进行shell=True通话时尝试尝试使用subproces.Popen,因为这可能会给想要被黑客入侵的人打开攻击媒介你的系统。在当前的设置中,由于没有用户输入或通话中没有输入,因此没有立即的风险,但是通常最好的方法是避免输入。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...