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

VBA结合Selenium获取Edge浏览器被双击元素返回值方案咨询

VBA+Selenium实现Edge页面双击元素值捕获方案

可行性结论

该需求完全可实现。你现有代码的核心问题是D.activeElement()仅能获取拥有输入焦点的可交互元素(如输入框、按钮),你需要抓取的湿度、露点等静态文本元素不会触发焦点变更,因此该方法无法匹配目标元素。

核心实现思路

我们通过页面注入JS监听双击事件的方式替代原有的焦点检测逻辑,具体流程如下:

  • 页面加载完成后,通过Selenium向页面注入全局监听脚本,双击事件触发时自动将选中的文本/对应元素属性暂存到页面的全局变量里
  • VBA侧维持轻量轮询,检测到双击事件完成后直接读取页面全局变量即可拿到目标值,无需额外按组合键触发
  • 拿到的值可直接写入Excel单元格或用户窗体,完全省略手动复制粘贴步骤

修正后可运行代码

Option Explicit

Public D As EdgeDriver
' 修正原代码笔误:V10BA7改为VBA7,适配64位/32位Office
#If VBA7 Then
    ' 声明虚拟键监听函数
    Public Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    ' 声明虚拟键监听函数
    Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

' 常量定义
Public Const VK_LBUTTON = &H1 '鼠标左键
Public Const HubURL As String = "https://www.msn.com/en-us/weather/today/weather-today/we-city?el=0ZsYvXxKhYYMTPRM%2BTMX0UAWvqF%2FyQI9YQxk78YCuPFGYXNyxfjTFrNODP%2FkmqHR&ocid=ansmsnweather"

Sub StartEdge()
    Dim captureVal As String
    Set D = New EdgeDriver
    With D
        .Get HubURL
        ' 注入JS监听双击事件,暂存选中值到全局变量
        .ExecuteScript "window._doubleClickCapture = '';document.addEventListener('dblclick', function(e) { const selection = window.getSelection(); if(selection.toString().trim()) { window._doubleClickCapture = selection.toString().trim(); } });"
    End With
    
    ' 轮询监听,按ESC可退出循环
    Do Until GetAsyncKeyState(vbKeyEscape)
        ' 检测到鼠标点击触发
        If GetAsyncKeyState(VK_LBUTTON) < 0 Then
            ' 等待双击动作完成
            Sleep 200
            ' 读取页面暂存的双击选中值
            captureVal = D.ExecuteScript("return window._doubleClickCapture;")
            If captureVal <> "" Then
                ' 此处可替换为写入你需要的单元格/用户窗体控件
                MsgBox "捕获到双击选中值:" & captureVal
                ' 重置全局变量,避免重复触发
                D.ExecuteScript "window._doubleClickCapture = '';"
            End If
        End If
        DoEvents
        Sleep 50 ' 降低CPU占用
    Loop
End Sub

适配现有业务的调整说明

  • 多标签页兼容:每次切换标签页后,重新执行一次注入JS的代码即可,每个标签页的JS上下文独立
  • 实例留存:脚本中不要调用D.Quit,保持D为全局公共变量,Edge实例会一直留存直到Excel关闭或手动调用退出
  • 元素属性扩展:如果需要拿到的是元素的其他属性(如data-id、href等),只需要修改注入的JS逻辑,把对应属性赋值给window._doubleClickCapture即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:15:06