#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()