Excel Selenium VBA宏运行约3分45秒自动终止问题求助
Excel Selenium VBA宏超时终止问题修复方案
问题概述
开发的Excel Selenium VBA宏从Sofascore提取赛事数据时,运行约3分45秒后自动终止,Chrome浏览器关闭,剩余赛事未处理;调整等待时间仅改变终止节点,无法解决问题,页面采用滚动加载机制。
核心原因分析
- Selenium默认超时限制触发:驱动会话存在全局超时阈值,超过后自动终止
- 固定等待(
x.Wait)导致的不稳定:等待时间不足或过长,引发操作阻塞 - 错误处理滥用:大量
On Error Resume Next掩盖了真实异常,导致程序无预警崩溃 - Chrome启动参数缺失:未配置稳定性相关参数,导致浏览器内存溢出或崩溃
- 滚动加载处理不当:未完整加载所有元素就开始操作,引发元素定位失败连锁问题
分步修复方案
1. 调整Selenium超时配置
在驱动初始化后添加全局超时设置,避免会话被强制终止:
Sub sofascore() Dim x As New Selenium.ChromeDriver, i, j, sonsat, LastRow As Integer ' 新增超时配置 x.Timeouts.ImplicitWait = 10000 ' 隐式等待10秒,等待元素出现 x.Timeouts.PageLoad = 30000 ' 页面加载超时30秒 x.Timeouts.AsynchronousJavaScript = 60000 ' 异步JS操作超时60秒 x.SetProfile "C:\Users\Oğuzhan\AppData\Local\Google\Chrome\User Data" x.AddArgument ("user-data-dir=C:\Users\Oğuzhan\AppData\Local\Google\Chrome\User Data\System Profile") ' 新增稳定性参数 x.AddArgument "--disable-extensions" x.AddArgument "--disable-gpu" x.AddArgument "--no-sandbox" x.AddArgument "--disable-dev-shm-usage" x.Start "chrome", "https://www.sofascore.com/tr/" x.Window.Maximize ' 后续代码... End Sub
2. 替换固定等待为显式等待
用显式等待替代x.Wait,确保元素可操作后再执行动作,避免阻塞:
' 替换原有的x.Wait 1000和获取clss的代码 x.Get Range("A" & i).Value ' 等待页面核心元素加载完成 x.WaitUntil ElementIsVisible(FindBy.Class("kusmLq")), 10000 Set clss = x.FindElementsByClass("kusmLq")
3. 修复错误处理逻辑
移除滥用的On Error Resume Next,改用针对性的错误捕获,避免掩盖崩溃原因:
' 示例:获取B列数据的错误处理 On Error Resume Next Dim scoreElem As Selenium.WebElement Set scoreElem = x.FindElementByCss("#__next > div > main > div.sc-hLBbgP.dRtNhU.sc-cabffeca-0.QpfGa > div.sc-hLBbgP.sc-eDvSVe.gjJmZQ.fEHohf.sc-cabffeca-1.iITCqu > div.sc-hLBbgP.fOCbiM.sc-cabffeca-2.fbSWpy > div > div:nth-child(1) > div > div.sc-hLBbgP.gRrJCY > div.sc-hLBbgP.eVYvKu > div.sc-hLBbgP.sc-eDvSVe.eISiVT.bbcOkn > div:nth-child(1) > span") If Err.Number = 0 Then Range("B" & j) = scoreElem.Text Else Range("B" & j) = "无数据" Err.Clear End If On Error GoTo 0
4. 优化滚动加载逻辑
循环滚动直到页面不再加载新元素,确保获取全部目标元素:
' 在获取clss前添加滚动加载逻辑 Dim lastScrollHeight As Long, currentScrollHeight As Long lastScrollHeight = x.ExecuteScript("return document.body.scrollHeight") Do x.ExecuteScript "window.scrollTo(0, document.body.scrollHeight);" x.Wait 1000 ' 等待新元素加载 currentScrollHeight = x.ExecuteScript("return document.body.scrollHeight") ' 当滚动高度不再变化时,说明加载完成 If currentScrollHeight = lastScrollHeight Then Exit Do lastScrollHeight = currentScrollHeight Loop Set clss = x.FindElementsByClass("kusmLq")
5. 检查ChromeDriver版本兼容性
确保ChromeDriver的版本与本地安装的Chrome浏览器版本完全一致(主版本号需匹配),版本不匹配是导致浏览器崩溃的常见原因。
内容的提问来源于stack exchange,提问作者hugomare
相关产品推荐
相关产品推荐

