Получаете метод для запуска после обновления? - PullRequest
0 голосов
/ 01 декабря 2019

У меня проблемы с запуском моего основного метода (или любого другого метода) после обновления страницы с помощью Selenium Python. Все, включая обновление, работает нормально, но как заставить программу работать при обновлении так же, как при первом запуске программы из командной строки?

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome(executable_path=r'./chromedriver.exe', options=chrome_options)
driver.get('https://www.google.com')
wait = WebDriverWait(driver, 10)

button = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@data-a-target="XXXXX"]')))

def main():
    try:
        button.click()
        (codeblock)

    #refresh upon error detection
    except Exception
        driver.refresh()

#not sure what this does but it doesn't work without it
if __name__ == "__main__":
    main()

Обратите внимание, что этот блок отсутствует или изменил код ex,URL. Но все, включая вызов обновления для исключения, работает нормально.

Я действительно не уверен, как все это совмещается, так как мне нужно, чтобы main () вызывался после обновления, хотя есть переменные, объявленные вне main(), который использует main (). Не уверен, если это вызывает какие-либо проблемы.

Короче говоря, как можно сделать то, что фактически является бесконечным циклом (при условии, что main () повторяется, когда ошибок не возникает), в том случае, когда возникает ошибка, страницаобновляет (проверьте), и после обновления возвращается к main ()?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2019

Оказывается, проблема в том, что переменные объявлены за пределами main(). Я поместил их наружу, потому что они использовались в нескольких методах, не только main(), но проблема с этим заключалась в вызове main() после обновления, по существу, требовании main() выполнить свой обычный код без рабочих переменных. Это вызвало исключение, которое вызвало обновление (обновление после исключения), что в конечном итоге вызвало бесконечный цикл обновления страницы. Решение было простым:

from selenium.webdriver.opera.options import Options

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome(executable_path=r'./chromedriver.exe, options=chrome_options)

driver.get('https://www.google.com')

def main():

    try:

        wait = WebDriverWait(driver, 10)

        button = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@data-a-target="XXXXX"]')))

        button.click()

    except Exception:
        driver.refresh()
        main()

if __name__ == "__main__":
    main()`

Вызов main() после driver.refresh() и объявление переменных внутри main() (как и любого другого метода, который их использует) решает проблему.

0 голосов
/ 01 декабря 2019

Я думаю, что вы хотите запустить большую часть вашей main() функции в бесконечном цикле. Если вы хотите, вы можете break выйти из цикла, как только узнаете, что вам не нужно обновлять снова:

def main():
    while True:
        try:
            button.click()
            (codeblock)
            if success_detected:
                break 

        # refresh upon error detection
        except Exception
            driver.refresh()

В качестве альтернативы, вы можете поместить цикл в блок if:

if __name__ == "__main__":
    # this will run forever, unless you manually terminate it
    while True:
        main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...