Исключение StaleElementReferenceException в python selenium

#python #python-3.x #selenium #web-scraping #beautifulsoup

#python #python-3.x #селен #очистка веб-страниц #beautifulsoup

Вопрос:

Я пытаюсь подсчитать, сколько раз с этого сайта нажимается опция «Загрузить больше отзывов». Но я получаю следующую ошибку:

selenium.common.исключения.Исключение StaleElementReferenceException: Сообщение: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы

Вот мой код на Python:

 from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--disable-notifications")
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options)
url = "https://www.justdial.com/Delhi/S-K-Premium-Par-Hari-Nagar/011PXX11-XX11-131128122154-B8G6_BZDET"
driver.get(url)
pop_up = WebDriverWait(driver, 30).until(
EC.element_to_be_clickable((By.XPATH, '//*[@id="best_deal_detail_div"]/section/span')))
pop_up.click() # For disable pop-up
count = 0
while True:
  element = WebDriverWait(driver, 20).until(
  EC.element_to_be_clickable((By.XPATH, "//span[text()='Load More Reviews..']")))
  element.click()
  count = count   1
  print(count)
  

Ответ №1:

Попробуйте приведенный ниже код:

   count = 0
while True:
    try:
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Load More Reviews..']"))).click()
        count = count   1
    except StaleElementReferenceException:
        pass
    except TimeoutException:
        break
print(count)
  

Проблема: в соответствии с вашим кодом вы ожидаете, что кнопка Загрузить больше отзывов станет интерактивной, теперь, как только она нажата, и даже до завершения загрузки страницы ее обнаружение, если кнопка есть и доступна для просмотра, но когда она пытается щелкнуть, к тому времени страница все еще находится в процессе обновления / загрузки дополнительных обзоров. В результате HTML DOM прерывается / обновляется и stale element exception приходит.

Также, поскольку в вашем коде нет break условия, я добавил его. Если на странице нет кнопки Загрузить дополнительные обзоры. Это приведет к выходу из цикла.

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

1. Также в вашем коде нет условия прерывания, поэтому он будет продолжать выполняться. Как вы указали, while равно True. Пожалуйста, проверьте обновленный на разрыв.