Как можно с помощью Selenium на Python найти HTML-элемент, который находится в открытом теневом корне (#shadow-root)?

Здравствуйте! <br/> Я нахожусь на стадии обучения и хотел бы создать бота, который будет автоматически взаимодействовать с сайтом: <br/> <a href="https://eaist.mos.ru/login.html?redirect=https://eaist.mos.ru/panel.html" rel="nofollow">https://eaist.mos.ru/login.html?redirect=https://e...</a> <br/> <br/> Когда я нажимаю кнопку "Войти в систему", появляется два окна: одно для принятия куки, а другое для ввода логина и пароля. Элементы обоих окон находятся в разных shadow DOM, и я не могу найти их с помощью Selenium. Я уже 4 дня пытаюсь решить эту проблему. Могли бы вы помочь мне с кодом для нажатия на кнопку "Понятно"? <br/> <br/> Я изучил множество статей, форумов и видео, и принцип того, как это делается, мне кажется понятен. Однако найти рабочий вариант для своей ситуации у меня не получается. :( <br/> <br/> Заранее благодарю! <br/> <br/>
  • 3 апреля 2025 г. 13:55
Ответы на вопрос 2
С помощью Selenium можно взаимодействовать с элементами, находящимися в теневом корне (shadow DOM), но для этого потребуется немного больше действий, чем с обычными элементами. Вам нужно будет сначала получить доступ к теневому корню, а затем найти нужные элементы внутри него.

Вот пример того, как это можно сделать на Python с использованием Selenium:

1. Убедитесь, что вы установили необходимые пакеты:
   ```bash
   pip install selenium
   ```

2. Вот пример кода, который открывает указанный вами сайт и нажимает на кнопку "Понятно" для принятия куки, находящуюся в теневом корне:

```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time

# Настройте драйвер Chrome
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--headless")  # Запуск в фоновом режиме, удалите эту строку для графического интерфейса
service = Service('path/to/chromedriver')  # Замените 'path/to/chromedriver' на путь к chromedriver
driver = webdriver.Chrome(service=service, options=chrome_options)

try:
    # Откройте страницу
    driver.get("https://eaist.mos.ru/login.html?redirect=https://eaist.mos.ru/panel.html")

    # Подождите, пока страница загрузится
    time.sleep(5)

    # Найдите элемент теневого корня для куки
    shadow_host = driver.find_element(By.CSS_SELECTOR, "selector-for-shadow-host")  # Замените на корректный селектор
    shadow_root = driver.execute_script("return arguments[0].shadowRoot", shadow_host)

    # Найдите кнопку "Понятно" внутри теневого корня
    accept_cookies_button = shadow_root.find_element(By.CSS_SELECTOR, "selector-for-accept-cookies-button")  # Замените на корректный селектор

    # Нажмите на кнопку "Понятно"
    accept_cookies_button.click()

    # Подождите некоторое время, чтобы убедиться, что взаимодействие произошло
    time.sleep(5)

finally:
    # Закройте драйвер
    driver.quit()
```

### Пояснение к коду:
1. **Это основной код для настройки Selenium**: Мы настроили драйвер для работы с Chrome. Не забудьте заменить `'path/to/chromedriver'` на путь к драйверу Chrome на вашем компьютере.
2. **Получение теневого корня**: Мы находим элемент-хост для теневого корня, а затем используем JavaScript, чтобы получить доступ к его `shadowRoot`.
3. **Нахождение элемента внутри теневого корня**: Мы ищем кнопку "Понятно" в теневом корне и кликаем по ней.

### Обратите внимание:
- Вам нужно будет правильно указать селекторы для `selector-for-shadow-host` и `selector-for-accept-cookies-button`. Как вы сами знаете, это может потребовать изучения HTML-структуры страницы.
- Не забудьте установить правильный путь к вашему `chromedriver` и возможно, настраивать некоторые параметры в зависимости от вашей системы.
- Используйте `WebDriverWait` для более надежного ожидания элементов, вместо `time.sleep()`, особенно в реальных сценариях.

Если будут дополнительные вопросы или потребуется помощь с поиском селекторов, дайте знать!
Дополняю, вот похожий случай, но добиться рабочего решения для моего случая на основе данного ответа у меня не вышло( 

https://stackoverflow.com/questions/77105233/how-d...
Похожие вопросы