Python:循环中的异常期间代码未运行

时间:2019-03-25 06:00:30

标签: python selenium selenium-webdriver

我正在for循环内运行带有for循环迭代的python代码,但是该代码正在运行,但是,如果引发异常,则要在异常下执行的代码没有执行,并且代码会在except中无限循环,而不会移动到主循环

以下错误消息:

selenium.common.exceptions.NoSuchWindowException: Message: no such window: target window already closed
from unknown error: web view not found
  (Session info: chrome=73.0.3683.86)
  (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17763 x86_64)

我尝试过的代码:

for _ in range(100):
    print("main loop pass")
    for button in fb_buttons:
        driver.switch_to.window(driver.window_handles[1])

        try:
            while like_right:
                for right in like_right:
                    right.click()
                break
                driver.switch_to.window(driver.window_handles[0])


        except (NoSuchWindowException, ElementNotVisibleException, StaleElementReferenceException) as e:

            driver.switch_to.window(driver.window_handles[0])
            continue
        except StaleElementReferenceException as e:
            time.sleep(10)
            refresh.click()
    else:
        time.sleep(5)
        refresh.click()
        print("refreshed")

Google搜索/文档没有任何内容...让我感到奇怪的是,Selenium可以很好地抛出异常但无法捕获它。

1 个答案:

答案 0 :(得分:1)

下面的break导致以下行无法访问

break
driver.switch_to.window(driver.window_handles[0]) # <--- unreachable

这是您可能要用的一个小例子,请注意,此代码将引发:

sequence = ['first', 'second', 'third']

def run_after_type_error_exception():
    print("runs after type error")

def run_after_index_error_exception():
    print("runs after index error")

在没有break的情况下,此代码将在第一次迭代中捕获这两个异常。在这里,您还有一个for-else块。请注意,在第三次迭代之后,此代码将Do something else

for iteration in range(5):
    for element in sequence:
        try:
            while sequence:
                for character in element:
                    sequence.pop()
                    sequence[1].split() + 1
        except (NameError, TypeError, ValueError) as e:
            print(f"Caught first exception: {e}")
            run_after_type_error_exception()
            # break
        except IndexError as e:
            print(f"Caught exception {e}")
            run_after_index_error_exception()
            # break
    else:
        print("Do something else")
    print(f"Current iteration: {iteration}")

另外,请注意time.sleep(is_in_seconds),因此,如果您的代码与上述代码的行为类似(在一半时间的else部分中,则您将sleep至少持续约4分钟 ...