#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-странице => он должен возвращать []. Можете ли вы объяснить подробно? Извините за это неудобство. И извините, что я могу отладить этот, потому что он просто иногда появляется, я не могу его воспроизвести .