如何获取所有Shadow Doom元素已扩展的完整HTML

时间:2019-02-25 14:37:16

标签: javascript python selenium selenium-webdriver

我被这个卡住了。 我正在创建一个应该获取页面html的网络搜寻器。 问题是当我到达由JS渲染的内容时。为此,我需要使用Selenium之类的东西来获取完整的HTML。

这很好,并且对于使用例如angular创建的页面效果很好。 当我们到达用聚合物或任何其他具有Shadow DOM和Web组件的框架编写的页面时,问题就开始了。 在那种情况下,我只能得到内容直到第一个影子根。 我使用的代码:

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 :(得分:0)

一个肮脏的解决方案:

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网络驱动程序中有效,我必须串联结果,但这是基本机制。...