Сообщение: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы (не относится к событию щелчка)

#python #selenium #web-scraping #web-crawler #linkedin

Вопрос:

Это код обратной связи.

 2021-10-04 18:21:53.294724 : ERROR : Message: stale element reference: element is not attached to the page document
(Session info: chrome=93.0.4577.63)
(Driver info: chromedriver=71.0.3578.80,platform=Linux 4.9.230-76 aarch64)

2021-10-04 18:21:53.319382 : ERROR : Traceback (most recent call last):
File "/home/odroid/Documents/python/crawling-worker/linkedin/crawler.py", line 143, in main_loop
self.main_process()
File "/home/odroid/Documents/python/crawling-worker/linkedin/crawler.py", line 73, in main_process
if self.message_updated():
File "/home/odroid/Documents/python/crawling-worker/linkedin/crawler.py", line 54, in message_updated
now = get_last_messages(self.driver, self.db)
File "/home/odroid/Documents/python/crawling-worker/linkedin/message/parse/conversation.py", line 310, in get_last_messages
i.find_elements_by_class_name("msg-conversation-card__title-row")[0]) for i in members if
File "/home/odroid/Documents/python/crawling-worker/linkedin/message/parse/conversation.py", line 311, in <listcomp>
len(i.find_elements_by_class_name("msg-conversation-card__message-snippet-body"))]
File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webelement.py", line 413, in find_elements_by_class_name
return self.find_elements(by=By.CLASS_NAME, value=name)
File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webelement.py", line 685, in find_elements
{"using": by, "value": value})['value']
File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=93.0.4577.63)
(Driver info: chromedriver=71.0.3578.80,platform=Linux 4.9.230-76 aarch64)


2021-10-04 18:21:53.356802 : INFO : Device shutdown.
 

Это код блока, который получил ошибку

 def get_last_messages(driver: WebDriver, db: Db):
    safe_open(driver, "https://www.linkedin.com/messaging", db)
    members = driver.find_elements_by_class_name("msg-conversation-listitem")
    temp = [(i.find_elements_by_class_name("msg-conversation-card__message-snippet-body")[0],
             i.find_elements_by_class_name("msg-conversation-card__title-row")[0]) for i in members if
            len(i.find_elements_by_class_name("msg-conversation-card__message-snippet-body"))]
    cards = [(i[0].text, none_or_value(i[1].find_elements_by_tag_name("time"))) for i in temp]
    return [(i[0], i[1].text) for i in cards if i[1]]
 

Вы, парень, знаете, что здесь не так, потому что я ожидал, что эта функция «find_elements_by…» вернет пустой массив [], когда нечего получать, но здесь это исключение.
Спасибо тебе, парень, за то, что так сильно помог мне!

Ответ №1:

Исключение StaleElementReferenceException будет возникать только в том случае, если ваш элемент отсутствует(исчез или не был создан до) на вашем веб-сайте. пожалуйста, добавьте условия ожидания, чтобы проверить видимость элемента.

 By optionXpath = By.xpath("your xpath fp goes here !");
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(optionXpath));
wait.until(ExpectedConditions.visibilityOfElementLocated(optionXpath));
driver.findElement(optionXpath).click();
 

В случае не построенного :

вам нужно добавить условия ожидания

В случае исчезновения :

твои действия по элементу неправильны. добавьте скриншот непосредственно перед кодом сбоя и перепроверьте свой код.

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

1. Спасибо за ваш ответ, сэр. Но мне просто интересно, что я не выполняю никаких действий в этом элементе (щелчок или что-то еще). Я просто получаю элементы с функцией «find_elements» = > Я должен быть возвращен [], если их не существует. Но почему я получил это исключение? В случае, если он исчез, он должен был вернуться [] вместо исключения, верно? Извините, если я неправильно понял ваши слова/

2. Но вы упомянули другой индекс в своем методе, find_elements_by_class_name(«msg-разговор-карта__фрагмент сообщения-тело»)[0],

3. Итак, если массив возвращает [], но я обращаюсь к 0-му элементу=>, он должен возвращать исключение «список вне диапазона», не так ли?

4. Здесь дело в том, что элемент там не пустой [], но не прикреплен к главной html-странице. лучше добавьте время ожидания(я надеюсь, что это разрешится) и сделайте снимок экрана для отладки.

5. Извините, я не совсем понимаю вашу точку зрения. Если он не пустой, он должен возвращать что-то вместо этого исключения? Я думаю, что если он не прикреплен к главной html-странице => он должен возвращать []. Можете ли вы объяснить подробно? Извините за это неудобство. И извините, что я могу отладить этот, потому что он просто иногда появляется, я не могу его воспроизвести .