Как получить полный html со всеми элементами Shadow Doom - PullRequest
0 голосов
/ 25 февраля 2019

Я застрял с этим.Я создаю веб-сканер, который должен получить HTML-страницу.Проблема в том, что я достигаю контента, представленного JS.Для этого мне нужно использовать что-то вроде Selenium для получения полного HTML.

Это прекрасно и работает очень хорошо для страниц, созданных, например, с использованием угловых.Проблема начинается, когда мы достигаем страниц, написанных на полимерном или любом другом каркасе с Shadow DOM и веб-компонентамиВ этом случае я получаю контент только до первого теневого корня.Код, который я использую:

driver.execute_script("return document.body.innerHTML")

Да ... Так что я хотел бы построить строку со всеми встроенными пользовательскими элементами.все, что я получаю, это:

<some-app page="homepage"></some-app><iron-a11y-announcer></iron-a11y-announcer>

Вы можете себе представить, что этого недостаточно.Так что я знаю, что могу рекурсивно получить доступ ко всем теневым корневым элементам.

document.querySelector("some-app").shadowRoot

Я хочу сделать его общим.Есть идеи?Есть готовые решения?

1 Ответ

0 голосов
/ 26 февраля 2019

одно грязное решение сделано:

def expand_element(element):
    subelements  = element.find_elements_by_xpath("./*")
    tag = element.get_attribute('tagName')
    tags_to_skip= ["TEMPLATE" , "svg" , "g" ,"path" , "STYLE" , "img" , "video" , ]
    if tag in tags_to_skip:
        return
    print(tag)
    self.counter+=1
    if self.counter %100 == 0: 
        print("==================="  ,  self.counter , "==================")

    shadowroot = expand_shadow_element(element)
    if shadowroot:

        subelements  = driver.execute_script('return arguments[0].querySelectorAll("*")', shadowroot)

    for obj in subelements:
        expand_element(obj)    

def expand_shadow_element(element):
    shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root

Работает только в веб-драйвере Chrome, и мне приходится объединять результаты, но это основной механизм ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...