繁体   English   中英

重试 Python 子过程中的 Selenium 异常

[英]Retry for Selenium Exception in Subproces for 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 的唯一问题是来自 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调用返回而没有引发错误,我们就会跳出循环,否则我们会重试retry_count次。

另外,作为旁注,请考虑在执行subproces.Popen调用时尽量不要使用shell=True ,因为这可能会为想要入侵您的系统的人打开攻击向量。 在当前设置中,没有直接风险,因为没有用户输入或在呼叫中,但通常仍然是尽量避免它的最佳实践。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM