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

Excel Selenium VBA宏运行约3分45秒自动终止问题求助

Excel Selenium VBA宏超时终止问题修复方案

问题概述

开发的Excel Selenium VBA宏从Sofascore提取赛事数据时,运行约3分45秒后自动终止,Chrome浏览器关闭,剩余赛事未处理;调整等待时间仅改变终止节点,无法解决问题,页面采用滚动加载机制。

核心原因分析

  1. Selenium默认超时限制触发:驱动会话存在全局超时阈值,超过后自动终止
  2. 固定等待(x.Wait)导致的不稳定:等待时间不足或过长,引发操作阻塞
  3. 错误处理滥用:大量On Error Resume Next掩盖了真实异常,导致程序无预警崩溃
  4. Chrome启动参数缺失:未配置稳定性相关参数,导致浏览器内存溢出或崩溃
  5. 滚动加载处理不当:未完整加载所有元素就开始操作,引发元素定位失败连锁问题

分步修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:35:33