Мне наконец удалось написать код, который нажимает на кнопку принять куки. Спасибо всем, кто откликнулся за ваши ответы. Надеюсь этот пост сэкономит кому-то кучу времени :)
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()