Обработка ошибок Python и повторный запуск цикла while

#python

#python

Вопрос:

Я пытаюсь прокомментировать свой пост в Instagram с помощью python, чтобы попрактиковаться в себе. Итак, я пытаюсь написать 20 комментариев независимо от того, что, но через некоторое время возникает исключение, и я хотел бы обновить страницу, чтобы снова запустить цикл. Я могу написать несколько сообщений, но когда возникает исключение, моя страница обновляется бесконечно. Можете ли вы знать, как я могу обновить страницу 1 раз и снова запустить цикл?

 comments=0

while comments < 20:

    while True:
        try:

            commentbutton = driver.find_element_by_xpath('my xpath').click()                                
            sleep(4)

            writepost = driver.find_element_by_xpath('my xpath').send_keys('my text')
            sleep(5)

            submitpost = driver.find_element_by_xpath('my xpath').click()                                          
            sleep(5)

            writesecondpost = driver.find_element_by_xpath('my xpath').send_keys('my text')
            sleep(5)

            submitpost = driver.find_element_by_xpath('my xpath').click()                                          
            sleep(5)
            comments =1
            sleep(4)
        except Exception as e:
            driver.refresh()
            sleep(4)
            pass
 

Комментарии:

1. driver.refresh(); sleep(4) выйдите из исключения. только break при выполнении.

2. Спасибо за ваш ответ, например, что-то подобное? исключение, за исключением e: break driver.refresh()

3. <20 В ‘while comments <20:’ не имеет никакого эффекта, потому что вы поместили в него бесконечный цикл (while True)

4. Я вставил коммнеты =1

5. Он по-прежнему обновляет веб-сайт в бесконечные времена

Ответ №1:

Вы делаете это немного сложнее, чем нужно.

Как указал Джеффук, вы должны стараться избегать этих вложенных циклов.

Кроме того, вы не хотели бы делать слишком много сложных вещей при обработке исключений. Помните, что они должны останавливать ваш код из-за ошибки, это не просто «препятствия», которые нужно преодолеть и преодолеть.

При обработке исключений вы должны стараться избегать большего количества исключений путем дальнейшего добавления инструкций, потому что вы находитесь в другой области программы. Python может справиться с этим, но это может сделать отладку намного сложнее, чем предполагалось.

Обратите внимание, что в except предложении вы не изменяете предварительное условие ни для одного из циклов (вы не увеличиваете комментарии и не меняете True in while True .

При работе с пакетами веб-очистки достаточно сложно справиться с асинхронностью (ожидание рендеринга материала). Так что попробуйте KISS (пусть это будет очень просто).

Итак, давайте переделаем ваш код:

 def post_comment(driver):

    try:
        commentbutton = driver.find_element_by_xpath('my xpath').click()                                
        sleep(4)
        writepost = driver.find_element_by_xpath('my xpath').send_keys('my text')
        sleep(5)
        submitpost = driver.find_element_by_xpath('my xpath').click()                                          
        sleep(5)
        writesecondpost = driver.find_element_by_xpath('my xpath').send_keys('my text')
        sleep(5)
        submitpost = driver.find_element_by_xpath('my xpath').click()                                          
        sleep(5)
        return True
    except Exception as e:
        print(e) # It's good practice to try and print exceptions
        return False # Just fail the subroutine if it wasn't succesful!

comments = 0

# We assume 'driver' is well defined

while comments < 20:
    
    new_comment_posted = post_comment(driver)
    
    if new_comment_posted:   # This condition was missing, you were using the try block in its place, but handling boolean values is easier than handling exceptions.
        comments  = 1
    else: 
        driver.refresh()
        sleep(4)
        # Still, this will go on forever until there are 20 comments, but this is what you want, right?
 

Комментарии:

1. Привет, большое спасибо за ваши усилия. На самом деле, ваша программа совершает ту же ошибку, что и моя. Он продолжает обновлять страницу, когда достигает оператора else. Я бы хотел, чтобы, когда программа достигает оператора else, она снова запускала оператор try

2. Затем вы должны увидеть, зависает ли выполнение driver.refresh() или нет. Попробуйте добавить отпечатки до и после этой строки и посмотрите, в чем проблема. Если это не проходит driver.refresh() , проблема заключается в вашей платформе или браузере. В противном случае ошибка должна быть достаточно ясной.