【问题标题】:How to read text that is under #shadow-root (user-agent)如何阅读#shadow-root(用户代理)下的文本
【发布时间】:2021-01-03 14:01:19
【问题描述】:

我正在使用 Selenium (Python) 来自动化网页。我正在尝试从#shadow-root(用户代理)下的输入字段中获取文本。 我使用的 Xpath:

driver.find_element_by_xpath("**//*/p-calendar/span/input**").text

没有返回任何东西。 附上我的 DOM 元素的屏幕截图。 要求:从影子根获取文本:01:01

【问题讨论】:

    标签: python selenium dom polymer shadow-dom


    【解决方案1】:

    根据@hayatoito(Shadow DOM 的创建者)comment

    引入封闭阴影树的最初动机是 "Never allow an access to a node in a closed shadow tree, via any APIs, from outside",AFAIK。像这样,我们无法在 Blink 中访问 <video> 元素中使用的内部隐藏阴影树中的节点。

    其实我就是这样设计了一个封闭的阴影树。如果有一种方法可以访问封闭影子树中的节点,则应将其视为规范的错误。

    我认为拥有一个 API 来允许在 Chrome 应用程序或扩展程序层进行访问是完全可以的。 但是,对于一个普通的网络应用,我认为目前的协议是"Never allow it"

    如果我们允许,这意味着我们不需要封闭的影子树。我认为,只要有一棵开放的影子树就足够了。

    Furhter @Supersharp 在他的评论下方他自己在讨论How to get element in user-agent shadow root with JavaScript? 中的回答中提到:

    #shadow-root (user-agent) 是浏览器供应商的本地实现,因此它们没有文档记录并且永远无法访问。根据规范,只有开放的 Shadow DOM 是


    WebDriver 视角

    最近,@AutomatedTester [David Burns,Mozilla 公司首席培根官] 在WebDriver - Testability of web components 发起了讨论

    目前 Selenium 团队 开放接受相同的拉取请求。


    参考

    您可以在以下位置找到一些相关的详细讨论:


    结尾

    这里可以找到How to automate shadow DOM elements using selenium?的相关讨论

    【讨论】:

    【解决方案2】:

    您可以使用driver.execute_script 注入返回ShadowRoot 的JavaScript 代码,然后使用find_element 获取您正在寻找的影子根的子元素。

    input_shadow = driver.execute_script('''return document.querySelector("$1").shadowRoot''')
    div_text = inputShadow.find_element_by_tag_name("div").text
    

    $1 - Your element's identifier or selector.

    如果你热衷于使用 xpath 查找元素

    input_shadow = driver.execute_script('''return $x(\"//*/p-calendar/span/input\")[0]''')
    div_text = inputShadow.find_element_by_tag_name("div").text
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多