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
相关产品推荐
相关产品推荐

