Selenium VBA Webdriver 元素查找失败跳过报错继续循环求助
Selenium VBA 元素不存在时跳过不中断的实现方案
核心通过局部错误捕获实现元素查找失败时不中断运行,同时修正原代码本身存在的语法逻辑问题:
- 原代码混用
Line/Linha作为循环变量,会直接触发变量未定义错误 - 原代码嵌套了多余的Do循环,逻辑冗余
- 查找元素时临时开启错误忽略,查找完成立刻恢复错误捕获,避免其他真实运行错误被屏蔽
- 无论是否找到目标元素,都要切回页面默认上下文,避免后续循环出现iframe定位错误
修正后的可直接运行代码如下:
Dim drive As New Selenium.ChromeDriver Dim ks As Selenium.Keys Dim tempo As Integer Dim telephone As Selenium.WebElement Dim lastRow As Long, currentRow As Long Dim site As String, searchNumber As String Set ks = New Selenium.Keys site = "http://www.google.com" Plan1.Select ' 获取A列最后一行数据行号 lastRow = Range("A" & Rows.Count).End(xlUp).Row drive.Start drive.Get site ' 从第4行开始遍历所有待采集数据 For currentRow = 4 To lastRow searchNumber = Trim(Range("A" & currentRow).Value) If searchNumber = "" Then Exit For ' 清空上一轮循环的元素对象,避免旧值干扰 Set telephone = Nothing ' 临时开启错误忽略:找不到元素时不抛出中断弹窗 On Error Resume Next drive.SwitchToFrame drive.FindElementById("WIDGET_ID_4") Set telephone = drive.FindElementByXPath("/html/body/.........") ' 立刻恢复默认错误捕获,避免浏览器崩溃、页面加载失败等真实错误被吞 On Error GoTo 0 ' 切回页面默认上下文,这一步必须执行,否则后续循环会出现iframe定位异常 drive.SwitchToDefaultContent ' 仅当成功找到目标元素时,才把采集结果写入单元格 If Not telephone Is Nothing Then Range("B" & currentRow).Value = telephone.Attribute("outerText") End If Next currentRow drive.Quit MsgBox "Process Ok" End Sub
关键提醒:不要全程开启
On Error Resume Next,否则会导致所有运行错误都被静默忽略,出现采集结果缺失、程序假死等问题时无法定位原因,仅在元素查找的小段代码前临时开启即可。
内容的提问来源于stack exchange,提问作者Guilherme Maia
相关产品推荐
相关产品推荐

