Python: код не выполняется во время исключения в цикле - PullRequest
0 голосов
/ 25 марта 2019

Я выполняю код Python с итерацией цикла for в цикле for, однако код работает, если выброшено исключение, код для выполнения под исключением не выполняется, и код циклически повторяется в пределах исключений, не перемещаясь в основной цикл

Сообщение об ошибке ниже:

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 / документация ничего не дали ... и мне кажется странным, что селен хорош, но не может его поймать.

1 Ответ

1 голос
/ 25 марта 2019

Это break ниже делает следующую строку недоступной :

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

Вот небольшой пример того, к чему вы можете стремиться, note thisброски кода:

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 s этот код будет перехватывать оба исключения на первой итерации.Здесь у вас также есть блок 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 минут как минимум ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...