使用Selenium+VBA获取WhatsApp已读回执时遇截图元素超出范围错误
解决WhatsApp网页版已读回执回写Excel的问题及截图错误修复
问题原因
出现Element Out Of The ScreenShot错误,是因为目标元素(双蓝勾已读回执)不在浏览器当前可见视口范围内。WhatsApp网页版的消息区需要激活对应聊天窗口或滚动,才能让已读回执元素显示在屏幕内。
修复方案及优化代码
1. 核心修改点
- 先激活目标聊天窗口,确保消息区显示对应对话
- 滚动到目标元素位置,保证元素可见
- 用显式等待替代固定等待,提升稳定性
- 可选:直接判断元素状态(无需截图),更高效回写Excel
2. 修改后的VBA代码
Sub CheckWhatsAppReadReceipt() Dim bot As New WebDriver Dim targetChatName As String Dim readReceiptElement As WebElement ' 设置目标联系人名称,替换成你要检查的联系人 targetChatName = "测试联系人" ' 初始化Chrome并打开WhatsApp网页版 bot.Start "chrome", "https://web.whatsapp.com/" bot.Get "/" bot.Window.Maximize MsgBox "请扫码登录,登录完成后点击确定" ' 显式等待聊天列表加载完成,最多等待10秒 bot.Wait 10000 ' 定位并点击目标聊天,激活对话窗口 bot.FindElementByXPath("//span[@title='" & targetChatName & "']").Click ' 显式等待消息区加载,最多等待5秒 bot.Wait 5000 ' 定位最新发出消息的已读回执元素 On Error Resume Next Set readReceiptElement = bot.FindElementByXPath("//div[contains(@class,'message-out')]//span[@data-testid='status-dblcheck']") On Error GoTo 0 If Not readReceiptElement Is Nothing Then ' 滚动到元素位置,确保在视口内 bot.ExecuteScript "arguments[0].scrollIntoView(true);", readReceiptElement ' 方案1:截图粘贴到Excel readReceiptElement.TakeScreenshot.Copy Sheets(1).Cells(5, 5).Paste ' 方案2:直接判断已读状态(更高效,无需截图) ' 获取SVG路径的填充颜色,WhatsApp已读蓝对应的RGB为(37, 211, 102) Dim fillColor As String fillColor = bot.ExecuteScript("return window.getComputedStyle(arguments[0].querySelector('path')).fill;", readReceiptElement) If fillColor = "rgb(37, 211, 102)" Then Sheets(1).Cells(5, 6).Value = "已读" Else Sheets(1).Cells(5, 6).Value = "已发送/未读" End If Else Sheets(1).Cells(5, 5).Value = "未找到已读回执" End If ' 可选:关闭浏览器 ' bot.Quit End Sub
3. 关键说明
- 激活聊天窗口:必须先点击目标联系人的聊天项,否则消息区不会加载该对话的已读回执元素
- 滚动元素到视口:通过
scrollIntoView强制元素进入屏幕可见范围,彻底解决截图时的元素超出视口错误 - 显式等待:替代固定时长等待,让代码等待页面元素加载完成后再执行,避免因网络或加载慢导致的定位失败
- 状态判断优化:通过获取SVG路径的填充颜色直接判断已读状态,比截图更高效,且能直接将结果回写到Excel单元格中
内容的提问来源于stack exchange,提问作者xlmaster
相关产品推荐
相关产品推荐

