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

    @DenisProk Автор вопроса
    Мне наконец удалось написать код, который нажимает на кнопку принять куки. Спасибо всем, кто откликнулся за ваши ответы. Надеюсь этот пост сэкономит кому-то кучу времени :)

    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
    
    def get_shadow_root(element):
        return driver.execute_script(
            'return arguments[0].shadowRoot',
            element
        )
    
    chrome_options = webdriver.ChromeOptions()
    # Разрешение не трогать, т.к. есть завязка на pyautogui
    chrome_options.add_argument("--window-size=1920,1040")
    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()
    
    # Получаю дерево 1-го хоста
    shadow_host_1 = driver.find_element(
        "css selector",
        '[version="1"]'
    )
    # Получаю дерево 2-го хоста, который внутри 1-го
    shadow_host_2 = get_shadow_root(shadow_host_1).find_element(
        'css selector',
        '[data-test-id="Модальное окно согласия на обработку ПД"]'
    )
    
    # Так как кнопка ссылается на тег span, то находим его
    button = shadow_host_2.find_element(
        'tag name',
        'span'
    )
    
    # Дожидаюсь кликабельности кнопки и нажимаю на нее
    wait.until(EC.element_to_be_clickable(button)).click()
    
    sleep(10)
    driver.close()
    Ответ написан
    Комментировать