Возникли проблемы со ссылкой на определенный элемент на странице с помощью Selenium

#python #python-3.x #selenium #selenium-webdriver #selenium-chromedriver

#python #python-3.x #selenium #selenium-webdriver #selenium-chromedriver

Вопрос:

Мне ужасно сложно ссылаться на определенную кнопку «следующая страница» на веб-сайте, с которого я пытаюсь получить ссылки [https://www.sreality.cz/adresar?strana=2 ]. Если вы прокрутите вниз, вы увидите красную кнопку со стрелкой вправо, которую вы можете нажать, чтобы перейти на следующую страницу, и таким образом веб-сайт загрузит новый динамический контент. Кажется, что каждый подход сообщает об одной и той же точной ошибке, и я не знаю, как я должен указывать на элемент, не сталкиваясь с ним.

Это код, который у меня есть в настоящее время :

 from selenium import webdriver
chromedriver_path = "/home/user/Dokumenty/iCloud/RealityScraper/chromedriver"
driver = webdriver.Chrome(chromedriver_path)
print("WebDriver Successfully Initialized")
driver.get("https://www.sreality.cz/adresar?strana=2")
links = driver.find_elements_by_css_selector("h2.title a")
nextPage = driver.find_element_by_css_selector("li.paging-item a.btn-paging-pn.icof.icon-arr-right.paging-next")

for link in links:
    print(link.get_attribute("href"))
    nextPage.click()
  

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

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

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

Из-за этого я попытался использовать XPath, чтобы точно указать на фактический элемент, и поэтому я изменил переменную «nextPage» на :

 nextPage = driver.find_element_by_xpath("""/html/body/div[2]/div[1]/div[2]/div[2]/div[4]/div/div/div/div[2]/div/div[2]/ul[1]/li[12]/a""")
  

Который возвращает точно такую же ошибку, как указано выше. Я уже несколько часов пытаюсь найти решение этой проблемы и не могу понять, в чем проблема. Я был бы признателен, если бы кто-нибудь мог объяснить мне, что я делаю не так. Спасибо всем.

Ответ №1:

Если вы хотите получить все теги ng-href с каждой страницы. Или вы могли бы заглянуть в их api.

 from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
driver.get("https://www.sreality.cz/adresar?strana=2")
wait = WebDriverWait(driver, 10)
while True:
    try:
        links = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "h2.title > a")))
        #print(len(links))
        for link in links:
            print(link.get_attribute("ng-href"))
        nextPage = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.btn-paging-pn.icof.icon-arr-right.paging-next")))
        nextPage.click()
        time.sleep(10)
    except Exception as e:
        print(e)
        break
  

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

1. После некоторых небольших изменений с моей стороны это исправило! Вероятно, моя проблема заключалась в том, что я тупо пытался запустить все в одном цикле! Спасибо, что показали мне это, теперь я понимаю, как это можно сделать лучше.

Ответ №2:

Прежде всего, никогда не используйте абсолютное xpath значение, оно легко разрушится, используйте относительное xpath .

Во-вторых, я думаю, что ошибка, которую вы получаете, заключается в том, что после первого нажатия кнопки «Далее» загружается новая страница. Который имеет другую структуру DOM, и именно поэтому вы не можете найти этот элемент.

Вы можете попробовать выполнить поиск элемента после каждой новой загрузки страницы (после каждого нажатия кнопки «Далее»).)

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

// initialize
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
action = ActionChains(driver)


// Try to use the below code and see if it works.
Next_btn = wait.until(EC.presence_of_element_located((By.XPATH, '(//li[@class="paging-item"])[2]')))
action.move_to_element(Next_btn).click().perform()