想要抓取的元素,搜索不到
Shadow DOM API 的 ShadowRoot 接口是一个 DOM 子树的根节点, 它与文档的主 DOM 树分开渲染。 了解shadow-root
- 定义函数
def expand_shadow_element(element):
shadowRoot = chrome.execute_script('return arguments[0].shadowRoot', element)
return shadowRoot
- 上面是执行js代码返回shadow-root的函数
# 在打开的HTML页面中shadow-root父子级关系:
# extensions-manager -> extensions-item-list#items-list -> extensions-item 最后才是我想要的元素
# 进入第一层shadow-root
manager = expand_shadow_element(chrome.find_element_by_tag_name("extensions-manager"))
# 获取第一层中在id:items-list下有一个shadow-root
shadowRoot = expand_shadow_element(manager.find_element_by_id("items-list"))
# 返回的shadow-root中已经有我想要的元素了
extensions_id = shadowRoot.find_element_by_tag_name("extensions-item").get_attribute("id")
print(extensions_id)
- 如果你的要得元素子级还有shadow-root,需要在执行一次js代码并返回DOM下的标签元素
- 例如:extensions-manager -> extensions-item-list#items-list -> extensions-item -> div#extension-id
extensions_manager = expand_shadow_element(chrome.find_element_by_tag_name("extensions-manager"))
# 获取第一层中在id:items-list下有一个shadow-root
extensions_item_list = expand_shadow_element(extensions_manager.find_element_by_id("items-list"))
# 返回的shadow-root中已经有我想要的元素了
extensions_item = expand_shadow_element(extensions_item_list.find_element_by_tag_name("extensions-item"))
print(extensions_item.find_element_by_xpath("//div[@id='extension-id']").text)
expand_shadow_element函数提交的参数中,选择器不固定,按照自己方便使用的即可
评论区