Вопрос или проблема
Я пытаюсь подписаться на эту страницу reddit с помощью кнопки.
Я открыл страницу в режиме инспекции, нашел кнопку и скопировал её XPATH в код ниже.
Но код говорит, что он не может найти элемент.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
URL = "https://www.reddit.com/r/learnjavascript"
driver = webdriver.Chrome()
driver.get(URL)
time.sleep(5)
driver.find_element(By.XPATH, "/div/faceplate-tracker").click()
driver.find_element(By.XPATH, “/div/faceplate-tracker”).click()
Проблемы:
-
Выражение XPath некорректное. Ниже несколько ссылок для чтения и понимания о XPaths.
-
Целевой элемент (“Кнопка присоединиться”) находится внутри вложенного элемента shadow root. Вам нужно сначала разобраться с shadow roots, прежде чем пытаться взаимодействовать с целевым элементом. Ниже несколько ссылок для вашей информации:
Проверьте код ниже, чтобы щелкнуть на кнопку “Присоединиться”:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
URL = "https://www.reddit.com/r/learnjavascript"
driver = webdriver.Chrome()
driver.get(URL)
time.sleep(5)
root1=driver.find_element(By.CSS_SELECTOR, "shreddit-subreddit-header-buttons").shadow_root
root2=root1.find_element(By.CSS_SELECTOR, "shreddit-join-button").shadow_root
join_Btn=root2.find_element(By.CSS_SELECTOR, "[class=" button-primary button-medium button join-btn leading-none px-sm py-xs "]")
join_Btn.click()
time.sleep(10)
.
Ответ или решение
Решение проблемы с нахождением элемента кнопки на Reddit с помощью Selenium и Python 3.14
Введение
При работе с Selenium для автоматизации веб-действий разработчики часто сталкиваются с проблемами нахождения элементов на веб-странице. В этом посте мы рассмотрим конкретный случай, когда пользователю нужно было нажать на кнопку "Присоединиться" на странице Reddit с использованием Python и библиотеки Selenium. Рассмотрим, как исправить ошибки в исходном коде и успешно взаимодействовать с элементом.
Анализ проблемы
В приведенном коде была использована следующая строка для нахождения и нажатия на кнопку:
driver.find_element(By.XPATH, "/div/faceplate-tracker").click()
Однако, существует несколько причин, по которым данный код не сработал:
-
Некорректный XPath: Указанный XPath выражение не является валидным. XPath должен начинаться с одного из элементов DOM, а не с
/div/faceplate-tracker
. -
Элемент находится внутри Shadow DOM: Кнопка "Присоединиться" находится внутри вложенного shadow root элемента. Это значит, что необходимо сначала получить доступ к shadow root, прежде чем взаимодействовать с элементами внутри него.
Решение проблемы
Используя информацию из сообщения и проверяя структуру веб-страницы Reddit, можно модифицировать код для корректного нахождения кнопки. Вот исправленный код:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# Устанавливаем URL для перехода на страницу.
URL = "https://www.reddit.com/r/learnjavascript"
# Инициализируем драйвер Chrome.
driver = webdriver.Chrome()
driver.get(URL)
time.sleep(5) # Даем время на загрузку страницы.
# Получаем верхний уровень shadow root.
root1 = driver.find_element(By.CSS_SELECTOR, "shreddit-subreddit-header-buttons").shadow_root
# Получаем второй уровень shadow root, где расположена кнопка.
root2 = root1.find_element(By.CSS_SELECTOR, "shreddit-join-button").shadow_root
# Находим кнопку "Присоединиться" по классу и кликаем на нее.
join_btn = root2.find_element(By.CSS_SELECTOR, ".button-primary.button-medium.join-btn.leading-none.px-sm.py-xs")
join_btn.click()
# Ожидание после нажатия на кнопку.
time.sleep(10)
# Закрыть драйвер после завершения работы.
driver.quit()
Комментарии к коду
-
Использование
CSS_SELECTOR
: Мы изменили метод нахождения элемента сBy.XPATH
наBy.CSS_SELECTOR
, что позволяет использовать более простые и лаконичные селекторы. -
Работа с Shadow DOM: Мы аккуратно извлекаем элементы из разных уровней shadow root. Это необходимо, поскольку стандартные методы Selenium не позволяют взаимодействовать с элементами, находящимися внутри shadow DOM без предварительного доступа.
-
Управление временем ожидания: Использование
time.sleep(5)
для обеспечения времени загрузки страницы перед поиском элементов. В реальном проекте лучше использоватьWebDriverWait
для более устойчивых и гибких ожиданий.
Заключение
В случае, если вы хотите автоматизировать взаимодействие с веб-страницей Reddit с использованием Selenium, важно учитывать структуру DOM и наличие shadow root. При создании скриптов для автоматизации всегда проверяйте селекторы и их корректность. Подобный подход поможет избежать распространенных ошибок и значительно упростит автоматизацию веб-действий.
Если у вас возникли дополнительные вопросы или потребность в другой информации, не стесняйтесь обращаться — всегда рады помочь!