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

在Python的子例程中重试Selenium异常,python,selenium,subprocess,Python,Selenium,Subprocess,我有一个python with selenium脚本,应该使用每个人都不同的参数调用它(我称之为Tester.py),为了更容易,我将它放在一个新的python文件中,并使用如下#子流程运行它: #下一步是关于重试的解释 @重试(重试次数=5,延迟=5) 定义作业(): 尝试: Popen(“python Tester.py-user Margareth”,shell=True) 返回真值 除了subprocess.CalledProcessError之外: 返回错误 打印(“系统重试”) 通过

我有一个python with selenium脚本,应该使用每个人都不同的参数调用它(我称之为Tester.py),为了更容易,我将它放在一个新的python文件中,并使用如下#子流程运行它:

#下一步是关于重试的解释
@重试(重试次数=5,延迟=5)
定义作业():
尝试:
Popen(“python Tester.py-user Margareth”,shell=True)
返回真值
除了subprocess.CalledProcessError之外:
返回错误
打印(“系统重试”)
通过
我的重试包装器如下所示(但不起作用):

def retry(retry_count=5,delay=5,允许的_异常=()):
def装饰器(f):
@functools.wrapps(f)
def包装(*args,**kwargs):
对于范围内的(重试计数):
尝试:
结果=f(*args,**kwargs)
如果结果为:
通过
除允许的例外情况外,例如:
通过
时间。睡眠(延迟)
返回包装器
返回装饰器

我对Tester.py的唯一问题是来自selenium的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
调用返回而不引发错误,我们将中断循环,否则我们将重试多达
重试次数


也请注意,当做<代码>子进程.Popen //Cux>调用时,尽量不要使用<代码> shell > true>代码>,因为这可能会为想要破解系统的人打开一个攻击向量。在当前设置中,没有即时风险,因为呼叫或呼叫中没有用户输入,但通常最好还是尽量避免。

您直接在
中返回,除了:
子句。这是输入错误还是错误?如果存在selenium#TimeOutException,则它将返回false,并应在x秒后重试调用Tester.py。我不知道这是否正确。我没有查看详细信息,但是
return
语句(
print
pass
)后面的代码永远不会执行。可能没关系,但放在那里看起来很奇怪。是的,它从来没有出来过。我想知道sistem是否在重试,但它从未显示,我想我应该把它放在一边以避免失速,但可能我错了,我明白了。为什么要为重试功能定义装饰器?它有一些有效的用例,但它是一个稍微复杂一些的概念。如果我必须运行多个子进程呢?因为在这种情况下,我应该将代码重写到每个子进程。好吧,您可以将代码生成一个函数,该函数使用子进程命令,以及
retry\u count
delay
作为输入参数。Popen并行运行,但不能并行运行,Popen还执行下一个命令,不要等到脚本在Popen中运行完成,因为如果脚本完成,我需要更新数据库,如果出现错误,则重试。是的,
subprocess.Popen()
会话始终并行运行。如果需要同步它们,则需要等待其中一个进程完成后再开始下一个进程,方法是调用
Popen.poll()
,或者可以使用
subprocess.run()
而不是
subprocess.Popen()
。我已经使用subprocess.Popen()和communicate完成了这项工作。谢谢