You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决获取ShadowRoot Web元素时出现的类型不匹配错误

类型不匹配错误:Selenium VBA中获取ShadowRoot的问题

我的最终目标是编写一个自动化清理部分浏览器数据的程序,但目前刚起步就遇到了问题。我此前从未接触过ShadowRoot,请问有人能看出以下代码中导致类型不匹配错误的原因吗?

Public Sub TestShadowRoot()

  Dim aCD As Selenium.ChromeDriver
  Dim aShadowHost As Selenium.WebElement
  Dim aShadowRoot As Selenium.WebElement

  On Error GoTo ErrorHandler

  Set aCD = New Selenium.ChromeDriver
  Call aCD.Get("chrome://settings/clearBrowserData")

  Set aShadowHost = aCD.FindElementByTag("settings-ui")
  Set aShadowRoot = aCD.ExecuteScript( _
    Script:="return arguments[0].shadowRoot", _
    arguments:=aShadowHost)

  Exit Sub

ErrorHandler:
  Debug.Print (Err.Description)
End Sub

我原本期望测试代码能返回ShadowRoot Web元素,结果却出现了类型不匹配错误。


错误原因

Selenium.WebElement类型仅能映射常规DOM中的元素节点,而shadowRoot是Shadow DOM的根容器,它不属于WebElement类型范畴,因此将ExecuteScript返回的shadowRoot赋值给WebElement类型变量时,会触发类型不匹配错误。

修正方案

  1. 改用Object类型声明变量
    VBA的Object类型可以接收任意对象实例,适合用来存储shadowRoot:

    Public Sub TestShadowRoot()
    
      Dim aCD As Selenium.ChromeDriver
      Dim aShadowHost As Selenium.WebElement
      Dim aShadowRoot As Object ' 修改为Object类型
    
      On Error GoTo ErrorHandler
    
      Set aCD = New Selenium.ChromeDriver
      Call aCD.Get("chrome://settings/clearBrowserData")
    
      Set aShadowHost = aCD.FindElementByTag("settings-ui")
      Set aShadowRoot = aCD.ExecuteScript( _
        Script:="return arguments[0].shadowRoot", _
        arguments:=aShadowHost)
    
      ' 后续可通过aShadowRoot继续操作Shadow DOM内的元素
      Dim innerElement As Selenium.WebElement
      Set innerElement = aCD.ExecuteScript( _
        "return arguments[0].querySelector('settings-main')", _
        arguments:=aShadowRoot)
    
      Exit Sub
    
    ErrorHandler:
      Debug.Print (Err.Description)
    End Sub
    
  2. 直接链式获取Shadow DOM内元素
    无需单独存储shadowRoot,直接在ExecuteScript中完成Shadow DOM的穿透和元素查找:

    Public Sub TestShadowRoot()
    
      Dim aCD As Selenium.ChromeDriver
      Dim targetElement As Selenium.WebElement
    
      On Error GoTo ErrorHandler
    
      Set aCD = New Selenium.ChromeDriver
      Call aCD.Get("chrome://settings/clearBrowserData")
    
      ' 直接获取Shadow DOM内的目标元素
      Set targetElement = aCD.ExecuteScript( _
        "return document.querySelector('settings-ui').shadowRoot.querySelector('settings-main')")
    
      Exit Sub
    
    ErrorHandler:
      Debug.Print (Err.Description)
    End Sub
    

内容的提问来源于stack exchange,提问作者KC2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:51:03