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

    @Delta-Strike
    from selenium import webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service
    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

    # 1. Настройки и запуск браузера
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--window-size=1000,900")
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=chrome_options)
    wait = WebDriverWait(driver, 15)

    # 2. Открываем сайт
    driver.get("https://eaist.mos.ru/login.html?redirect=https://e...")

    # 3. Кнопка "Войти в систему"
    login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/button")))
    login_button.click()

    # 4. Функция для доступа к элементу внутри вложенных Shadow DOM
    def get_shadow_element(driver, selectors):
    script = '''
    let el = document;
    for (let sel of arguments[0]) {
    el = el.querySelector(sel);
    if (el && el.shadowRoot) {
    el = el.shadowRoot;
    }
    }
    return el;
    '''
    return driver.execute_script(script, selectors)

    # 5. Ждём загрузки Shadow DOM
    sleep(2)

    # 6. Путь до нужного элемента внутри Shadow DOM
    selectors = [
    'eaist-app', # Первый Shadow Host
    'eaist-panel-view', # Вложенный Shadow Host
    'cookie-notification' # Ещё один Shadow Host
    ]

    # 7. Получаем нужный элемент и кликаем по кнопке
    shadow = get_shadow_element(driver, selectors)
    button = shadow.find_element(By.CSS_SELECTOR, 'button') # Возможно, нужно уточнить селектор!
    button.click()

    # 8. Закрываем браузер
    sleep(3)
    driver.quit()
    Ответ написан
    2 комментария