【问题标题】:How to incorporate a while loop within a Python try/except?如何在 Python try/except 中合并 while 循环?
【发布时间】:2024-01-18 16:51:01
【问题描述】:

使用 Python 的 Selenium Webdriver 经常无法启动 Firefox 浏览器,并且经常需要重试。通常一次或第二次重试就足够了,所以我执行以下操作:

try: 
    self.driver = webdriver.Firefox()
except WebDriverException, e:
    print "Unable to load profile, retrying"
    try: 
        self.driver = webdriver.Firefox()
    except WebDriverException, e:
        print "Unable to load profile, retrying"
        self.driver = webdriver.Firefox()

这不再为我服务,因为它现在在浏览器启动之前定期重试 3 次或更多次。合并while 循环以使其不断重试直到浏览器成功加载(此时self.driver 将作为对象存在)的最佳方法是什么?

注意:我知道可能会遇到无限循环,但出于提供建议的目的,您可以忽略这一事实。

【问题讨论】:

  • 好吧,为什么不while self.driver is None

标签: python selenium-webdriver exception-handling while-loop try-catch


【解决方案1】:

你说加载 Firefox 经常会失败,这很有趣,我以前从未遇到过。我已经运行 Selenium 测试有一段时间了。您可能想调查一下为什么您的 Firefox 驱动程序一直失败,是否需要更新?

我建议您对重试的次数进行限制。

numberOfRetry = 5
while (driver==None):
    try:
        driver = webdriver.Firefox()
    except:
        numberOfRetry-=1
        if numberOfRetry <= 0:
            logging.critical("Maximum number of retry reached")
            break

【讨论】:

    【解决方案2】:

    您可以使用 python 的else 子句。检查python's exception handling

    while True:
        try:
            self.driver = webdriver.Firefox()
        except WebDriverException, e:
            print "Unable to load profile, retrying"
        else:
            break
    

    【讨论】:

    • 这是正确的方法来破坏 Python 中的这个成语有点奇怪。
    【解决方案3】:

    如何在 while 循环之前将 self.driver 定义为 None 然后循环直到它不是 None ?示例 -

    self.driver = None
    while not self.driver:
        try: 
            self.driver = webdriver.Firefox()
        except WebDriverException, e:
            print "Unable to load profile, retrying"
    

    【讨论】: