如何解决获取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类型变量时,会触发类型不匹配错误。
修正方案
改用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直接链式获取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
相关产品推荐
相关产品推荐

