我被这个卡住了。 我正在创建一个应该获取页面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
我想使其通用。 有任何想法吗?有现成的解决方案吗?
答案 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网络驱动程序中有效,我必须串联结果,但这是基本机制。...