如何通过UI Automation获取网页中的全部文本内容?
用UI Automation遍历Chrome网页元素的实现方案
你需要先定位Chrome的网页内容容器,再递归遍历其所有子元素来收集控件类型和文本内容,以下是完整的VB.NET实现代码:
Imports System.Text Imports System.Windows.Automation Imports System.Diagnostics Module ChromeElementScanner Sub Main() Dim sb As New StringBuilder() ' 动态获取第一个Chrome窗口的句柄(替代固定句柄更实用) Dim chromeProcesses = Process.GetProcessesByName("chrome") If chromeProcesses.Length = 0 Then sb.Append("未找到Chrome进程") Clipboard.SetText(sb.ToString()) Return End If Dim hwnd As IntPtr = chromeProcesses(0).MainWindowHandle ' 获取Chrome主窗口的Automation元素 Dim mainWindow = AutomationElement.FromHandle(hwnd) If mainWindow Is Nothing Then sb.Append("无法获取Chrome窗口元素") Clipboard.SetText(sb.ToString()) Return End If ' 定位Chrome的网页内容容器(核心:Chrome网页内容在这个Pane元素内) Dim contentCondition = New AndCondition( New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Pane), New PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_RenderWidgetHostHWND") ) Dim webContent = mainWindow.FindFirst(TreeScope.Descendants, contentCondition) If webContent Is Nothing Then sb.Append("无法定位网页内容区域") Clipboard.SetText(sb.ToString()) Return End If ' 递归遍历所有网页元素 sb.AppendLine("网页元素信息:") TraverseElements(webContent, sb, 0) ' 将结果复制到剪贴板 Clipboard.SetText(sb.ToString()) End Sub ' 递归遍历元素的核心函数 Private Sub TraverseElements(element As AutomationElement, sb As StringBuilder, indent As Integer) ' 获取当前元素的控件类型和文本内容 Dim controlType = element.Current.ControlType.LocalizedControlType Dim elementText = If(String.IsNullOrEmpty(element.Current.Name), "[无文本内容]", element.Current.Name) ' 格式化输出(缩进区分层级) sb.AppendLine($"{New String("-"c, indent * 2)} 控件类型:{controlType} | 内容:{elementText}") ' 遍历当前元素的所有子元素 Dim childCondition = New PropertyCondition(AutomationElement.IsControlElementProperty, True) Dim children = element.FindAll(TreeScope.Children, childCondition) For Each child As AutomationElement In children TraverseElements(child, sb, indent + 1) Next End Sub End Module
关键说明:
- 动态获取Chrome句柄:替代固定句柄,避免Chrome重启后句柄失效的问题
- 定位网页内容容器:通过
Chrome_RenderWidgetHostHWND类名精准定位Chrome的网页渲染区域,确保只遍历网页内的元素而非浏览器工具栏、菜单等 - 递归遍历:通过
TraverseElements函数逐层遍历所有子元素,用缩进区分元素层级,方便后续筛选 - 内容收集:获取每个元素的
LocalizedControlType(本地化控件类型,比如“按钮”“文本框”)和Name属性(通常对应元素的文本内容)
补充优化:
如果需要获取输入框等元素的编辑内容,可以在TraverseElements函数中添加对ValuePattern的判断:
Dim pattern As Object = Nothing If element.TryGetCurrentPattern(ValuePattern.Pattern, pattern) Then Dim valuePattern = DirectCast(pattern, ValuePattern) elementText = valuePattern.Current.Value End If
内容的提问来源于stack exchange,提问作者Trickie
相关产品推荐
相关产品推荐

