Исключение ссылки на устаревший элемент при перемещении назад через браузер, даже после обновления - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь сделать скребок, который будет go через кучу ссылок, экспортировать руководство в PDF и l oop через все направляющие в родительской папке. Он работает нормально, но когда я пытаюсь go в обратном направлении, он генерирует устаревшие исключения, даже когда я проверяю sh элементы в коде или sh страницу.

from selenium import webdriver
import time, bs4

browser = webdriver.Firefox()
browser.get('MYURL')
loginElem = browser.find_element_by_id('email')
loginElem.send_keys('LOGIN')
pwdElem = browser.find_element_by_id('password')
pwdElem.send_keys('PASSWORD')
pwdElem.submit()
time.sleep(3)
category = browser.find_elements_by_class_name('title')
for i in category:
    i.click()
    time.sleep(3)
    guide = browser.find_elements_by_class_name('cell')
    for j in guide:
        j.click()
        time.sleep(3)
        soup = bs4.BeautifulSoup(browser.page_source, features="html.parser")
        guidetitle = soup.find_all(id='guide-intro-title')
        print(guidetitle)
        browser.find_element_by_link_text('Options').click()
        time.sleep(0.5)
        browser.find_element_by_partial_link_text('Download PDF').click()
        browser.find_element_by_id('download').click()
        browser.execute_script("window.history.go(-2)")
        print("went back")
        time.sleep(5)
        print("waited")
        guide = browser.find_elements_by_class_name('thumb')
        print("refreshed elements")
    print("made it to outer loop")

Это происходит, если я одновременно использую скрипт для перемещения браузера назад или метод driver.back (). Я вижу, что он возвращается в дочерний каталог, затем ждет и обновляет элементы. Но тогда не получается загрузить новый элемент в go в следующем руководстве. Я нашел похожие вопросы здесь, на SO, но кто-то просто предоставил код, приспособленный к проблеме, вместо того, чтобы объяснять, поэтому я все еще в замешательстве.

Я также знаю об использовании waitdriver, но сейчас я просто использую sleep, так как не знаю полностью понять условия ожидания E C. В любом случае, увеличение времени сна не решает эту проблему.

1 Ответ

0 голосов
/ 21 марта 2020

Исключение ссылки на устаревший элемент возникает при обновлении страницы sh из-за изменения UUID элемента в DOM. Как этого избежать: Всегда старайтесь искать элемент прямо перед взаимодействием.

В вашем коде вы искали ячейки, нашли их и сохранили в guide. Так что теперь у guide есть список UUID селена. Но затем вы выполняете все oop до go по списку, и при каждом рефресе sh (что происходит, когда вы возвращаетесь, я считаю), UUID ячейки меняется, поэтому старые, которые вы сохранили, больше не являются прилагается к DOM. При попытке взаимодействия с ними Selenium не может найти их в DOM и выдает это исключение.

Вместо того, чтобы перебирать guide ваш путь, попробуйте каждый раз заново находить элемент, например:

guide = browser.find_elements_by_class_name('cell')
for j in range(len(guide)):
    browser.find_elements_by_class_name('cell')[j].click()

Обратите внимание, похоже, что category может иметь аналогичную проблему, поэтому попробуйте применить это решение и к category.

Надеюсь, это поможет. Здесь - похожая проблема и решение.

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