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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:53:01