Задать вопрос
@DenisProk

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

Приветствую!
Сразу оговорюсь, я только учусь, хотел для работы написать бота, который будет в автоматическом режиме взаимодействовать с сайтом:
https://eaist.mos.ru/login.html?redirect=https://e...

При нажатии на кнопку "Войти в систему" сразу вылетает 2 окна: принять куки и ввести логин и пароль. Код обоих окон скрыт в разных shadow dom и найти их элементы через Selenium у меня не получается, уже 4-й день борюсь с этой проблемой. Помогите пожалуйста с кодом, как нужно обратиться к кнопке "Понятно", чтобы нажать на нее?

Уже перечитал кучу статей, форумов, смотрел ролики, принцип, как это делается, вроде как понятен, но рабочий вариант для своего случая так и не смог написать :(

Заранее спасибо!

67ee8f6c74c91869472782.png

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep


chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--window-size=1000,900")
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
wait = WebDriverWait(driver, 15, poll_frequency=1)

driver.get("https://eaist.mos.ru/login.html?redirect=https://eaist.mos.ru/panel.html")

# Кнопка: "Войти в систему"
LOGIN = ("xpath", "/html/body/div[1]/div/button")
# Нажимаю на кнопку "Войти в систему"
wait.until(EC.element_to_be_clickable(LOGIN)).click()

# Тут пытаюсь обратиться к тегу, в котором находится shadow-root, но уже на данном этапе
# получаю ошибку: NoSuchElementException: Message: no such element
# А кнопка о принятии находится еще глубже...
shadow_root = driver.find_element("css selector", '[version="1"]').shadow_root

sleep(10)
driver.close()
  • Вопрос задан
  • 70 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
How to automate shadow DOM elements using selenium?

Если коротко, то порядок следующий:
1. Сначала нужно найти в основном dom тот элемент, к которому прикреплен shadow root.
2. У п1. нужно получить свойство .shadow_root.
3. И вот уже у п2. нужно вызывать его собственный метод find_element, чтобы найти нужный элемент внутри него.

Или так:
Локатор не находит элемент на сайте, хотя набран верно, пробовал разные варианты, не помогает, в чём проблема?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
Это фича shadow dom

Единственное ее применение, как я понимаю, - это защита от блокировщиков рекламы, ее стали внедрять популярные веб сервисы (например пикабу)

Правда пометка open говорит что элементы внутри должны быть доступны из javascript
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы