☰
VBA+Excel驱动浏览器:SeleniumBasic自动化实战指南
2026/10/21 23:44:51 网站建设 项目流程

每天都要在网页后台重复录入、查询、导数据,月底再看一眼时间全耗在这上面了。如果你也是天天跟浏览器打交道的人,SeleniumBasic 这个工具基本就是为你准备的。它是一个架设在 VBA 环境里的浏览器自动化框架,可以让 Excel 和 WPS 表格直接驱动 Chrome、Edge 浏览器完成页面操作,省去一整套编程环境的搭建成本。这篇文章从安装到实战会完整走一遍,适合正在用 Office 批量处理数据、又不想碰 Python 和命令行的人。

1. 为什么是 SeleniumBasic:它到底解决什么问题

浏览器自动化的工具并不少,Python 配合 Selenium 包、Puppeteer 这些都是主流方案。但很多人没意识到,办公室里大量数据是躺在 Excel 里的,做表格的人不一定懂编程,更不想为了干一件琐事去装 Python 解释器、配虚拟环境、学 pip 命令。SeleniumBasic 的独特之处就在于它是基于 VBA 的封装,直接寄生在 Excel 和 WPS 里,会用 Excel 的人就能上手。

这个工具本质上是一个 COM 组件,把 WebDriver 的操作封装成了 VBA 对象。编译好的 DLL 文件注册进系统之后,你打开 VBA 编辑器,引用一下类型库,就能在自己的宏里创建浏览器对象。对比 Python 方案,它省掉了环境搭建这一步,保留了一个特别适合表格场景的用法:一边操作网页,一边读写单元格,数据和页面交互完全打通。比如从网页抓取行情数据直接写进 A 列到 E 列,或者反过来,把表格里的客户名单批量填进网页表单,全程不需要复制粘贴,代码短,改动也直观。

适合用 SeleniumBasic 的人群其实很明确。一类是财务、运营、人事这类日常要用网页系统录入数据的员工,另一类是常年用 Excel 做报表却不想转到 Python 生态的技术爱好者。当然,如果你本身就熟悉 Python,那直接用原版 Selenium 也没问题,但对于绝大多数只碰 VBA 的人来说,SeleniumBasic 是学习成本最低的浏览器自动化入口。

2. 环境准备与安装避坑指南

2.1 所需材料清单

安装 SeleniumBasic 之前,先把需要的几样东西列清楚:

  • Office 或 WPS 的完整安装版,VBA 宏功能必须可用(WPS 需要额外安装 VBA 插件)
  • SeleniumBasic 的安装包,官方发布的是一个 exe 安装程序
  • Chrome 浏览器或 Edge 浏览器,两者选其一即可
  • Windows 系统,Win7 到 Win11 都可以,但部分旧系统可能需要手动装.NET环境

2.2 安装步骤详细拆解

第一步,运行安装包。安装过程很简单,一路下一步,安装程序会自动完成 DLL 注册和类型库安装。这一步做完,你打开 Excel,按 Alt+F11 进入 VBA 编辑器,在“工具 - 引用”里如果能找到 Selenium Type Library 这个条目,就说明安装成功了。

第二步,检查浏览器驱动。SeleniumBasic 有一点做得特别贴心:它自带了 Chrome 和 Edge 的驱动管理。VBA 代码里写CreateObject("Selenium.ChromeDriver")时,如果没找到驱动,它会尝试自动下载。但我实际用下来发现这个自动下载经常因为网络问题失败,所以更稳妥的做法是手动确认驱动版本。

手动确认的方法很简单:打开 Chrome,在地址栏输入 chrome://version,查看版本号。然后去对应浏览器的驱动下载页面找同一个大版本号的驱动文件。把下载的 chromedriver.exe 放到 SeleniumBasic 安装目录下的驱动文件夹里,一般是在C:\Users\你的用户名\AppData\Local\SeleniumBasic\下面,或者安装目录的drivers里。

第三步,测试环境是否打通。在 VBA 里写一个最简单的启动代码,如果浏览器能正常打开,环境就算通了。

Sub 测试打开() Dim driver As New Selenium.ChromeDriver driver.Get "https://www.baidu.com" Stop driver.Quit End Sub

2.3 常见安装坑

很多人在安装这里就卡住了,我把遇到过的几个典型问题整理出来。

第一个坑:WPS 用户找不到 VBA 编辑器。WPS 个人版默认不带 VBA 功能,需要单独装 VBA for WPS 插件,装完之后才有 Alt+F11 入口。如果不想装插件,也可以用 WPS 的 JS 宏,但 SeleniumBasic 的示例代码基本都是 VBA 写的,转起来比较麻烦,所以还是建议装插件。

第二个坑:Office 是 64 位版本对应 SeleniumBasic 版本选择问题。SeleniumBasic 的安装程序目前只支持 32 位 COM 注册,64 位的 Office 在引用时可能找不到类型库。解决办法是用 32 位 Office,或者使用注册表命令手动注册 32 位 DLL。我自己就一直用 32 位 Office,对 VBA 项目来说完全够用,64 位带来的内存优势在 Excel 场景里感知不强。

第三个坑:驱动版本和浏览器版本不匹配。这个问题排在所有兼容性问题之首。Chrome 一旦自动更新,版本号变了,原先进程的驱动就会失效,代码跑到启动浏览器的时候直接报错。建议关闭 Chrome 的自动更新,或者每个月定期更新一次驱动。

提示:如果代码运行时报“未找到 WebDriver”或“session not created”,十有八九就是驱动版本不对,优先查这里。

3. SeleniumBasic 核心操作全解:定位、点击、填写、读取

3.1 三大定位方式

浏览器页面自动化最核心的就是元素定位。SeleniumBasic 提供了多种定位策略,但常用的就三种:ID、CSS 选择器、XPath。

找到某个元素的 ID 是最理想的情况,因为页面设计规范的话 ID 是唯一的,定位速度快且不容易出错。代码写法是:

driver.FindElementById("kw").SendKeys "SeleniumBasic"

CSS 选择器是一种灵活的定位方式,可以根据 class、属性、层级组合定位元素:

driver.FindElementByCss("#kw").SendKeys "vue"

XPath 最强大,适合页面里没有 ID 和 class 可用的极端情况,比如深层嵌套的表格元素:

driver.FindElementByXPath("//input[@name='wd']").Click

在实际操作中,怎么快速判断页面上的某个元素用什么方式定位?我建议直接用 Chrome 的开发者工具,在元素面板里右键目标元素,选择“Copy - Copy selector”或“Copy - Copy XPath”,直接把内容粘贴到代码里用。这种方法对新手尤其友好,避免了自己写选择器出错的问题。

3.2 输入与点击

输入文字用的是 SendKeys 方法,点击按钮用的是 Click 方法,两者组合使用可以完成绝大多数表单操作。

' 登录示例 driver.FindElementById("username").SendKeys "你的账号" driver.FindElementById("password").SendKeys "你的密码" driver.FindElementById("loginBtn").Click

这里有个细节,就是网页有时会有隐藏元素,直接调用 Click 会上报“元素不可交互”的错误。遇到这种情况,可以先用 JavaScript 强制点击:

driver.ExecuteScript ("arguments[0].click();", driver.FindElementById("loginBtn"))

3.3 下拉选择与复选框

表单里还经常遇到下拉框和复选框。SeleniumBasic 对下拉框的处理和 Python 版类似,需要通过 Select 对象来操作:

Dim selectObj As Selenium.WebElement Set selectObj = driver.FindElementById("province") selectObj.AsSelect.SelectByValue "440000"

复选框一般就是 Click 一下,如果点击前需要检查状态,可以通过 IsSelected 属性判断:

Dim cb As Selenium.WebElement Set cb = driver.FindElementById("agreement") If Not cb.IsSelected Then cb.Click End If

3.4 读取页面数据

读取数据是抓取类需求的基础。比如抓取一个表格里的数据,可以这样:

Dim rows As Selenium.WebElements Set rows = driver.FindElementsByCss("#table1 tr") Dim i As Integer For i = 0 To rows.Count - 1 Debug.Print rows(i).Text Next i

FindElements 返回的是一个集合,循环遍历时注意索引从 0 开始,这一点容易写错。另外,Text 属性拿到的文本是去掉 HTML 标签之后的纯文本,通常是干净可用的。

如果页面内容是动态加载的数据,读取前一定要等 AJAX 请求完成,这就是下面要说的等待策略问题。

4. 等待策略与动态页面处理

网页自动化的难点从来不是点击和输入,而是时机。特别是在现代网页里,数据都是异步加载的,你人眼看着页面已经显示完整了,但代码在那一瞬间执行下去却拿不到元素,因为 DOM 还没渲染完。理解这一点,是避免大量无效报错的关键。

SeleniumBasic 有两种等待方式比较实用:显式等待和隐式等待。显式等待的意思是代码停下来,专门等某个条件满足再往下执行:

driver.Wait (5000)

这一句是固定等待 5 秒,能解决一部分问题,但不够聪明。更优雅的做法是轮询等待,即反复查询元素是否出现,超时则报错。SeleniumBasic 对这类操作封装不够深入,很多人在 VBA 里写轮询会有坑,这里给一个我自己常用的轮询函数:

Public Function 等待元素(ByVal driver As Selenium.ChromeDriver, ByVal selector As String, Optional ByVal timeout As Long = 10) As Boolean Dim startTime As Double startTime = Timer Do While Timer < startTime + timeout Dim elements As Selenium.WebElements Set elements = driver.FindElementsByCss(selector) If elements.Count > 0 Then 等待元素 = True Exit Function End If Application.Wait (Now + TimeValue("0:00:01")) Loop 等待元素 = False End Function

调用方式这么用:

If 等待元素(driver, "#loginBtn", 15) = False Then MsgBox "登录按钮没出现,超时退出" driver.Quit Exit Sub End If

隐式等待是针对每一次元素查找操作的默认等待时间,设置一次,后面所有 FindElement 都会按这个时长来等:

driver.Timeouts.ImplicitWait = 5000

两种方式可以同时用,但要注意不要设置过长,否则脚本出错时排查问题的等待时间会很煎熬。我个人的习惯是隐式等待设在 3 到 5 秒,显式等待用在关键节点上,比如登录后页面跳转、表格重新渲染这类场景。

5. 从表格到网页的端到端情景实战

5.1 批量登录并采集数据

假设你要登录某个后台系统,用表格里维护的一组账号分别登录,采集每个账号的数据面板里的数值。这类需求在运维和渠道管理岗位相当常见。

第一步,在 Excel 的 A 列放账号,B 列放密码,C 列准备放采集结果。

第二步,写一个循环,逐行读取账号密码,驱动浏览器做登录和采集:

Sub 批量登录采集() Dim driver As New Selenium.ChromeDriver driver.Timeouts.ImplicitWait = 3000 Dim i As Integer Dim lastRow As Integer lastRow = Sheet1.Range("A1").End(xlDown).Row For i = 2 To lastRow ' 打开登录页 driver.Get "https://example-system.com/login" ' 填写账号密码 driver.FindElementById("username").SendKeys Sheet1.Cells(i, 1).Value driver.FindElementById("password").SendKeys Sheet1.Cells(i, 2).Value driver.FindElementById("loginBtn").Click ' 等登录跳转 If 等待元素(driver, "#dashboard", 10) = False Then Sheet1.Cells(i, 3).Value = "登录失败" GoTo 下一个 End If ' 采集核心数据 Sheet1.Cells(i, 3).Value = driver.FindElementById("core-metric").Text ' 退出登录,避免影响下一个账号 driver.FindElementByCss(".logout-btn").Click Application.Wait (Now + TimeValue("0:00:02")) 下一个: Next i driver.Quit MsgBox "采集完成" End Sub

这段代码里有几个操作细节要注意。退出登录之后最好停顿两秒再跑下一个账号,不然 cookie 或 session 残留会导致登录串号。另外,采集失败时不要中断整个循环,用 GoTo 跳转继续处理下一行,这样就算某个账号出问题也不影响整体进度,还能在表格里明确标出哪些账号异常。

5.2 从网页抓取表格写入 Excel

反过来操作也经常遇到:网页上有一个列表的明细数据要保存到 Excel 里做后续加工。这里要处理的是动态列表的分页问题。

典型场景:网页查询结果有 10 页,每页 20 条数据,总共 200 条要抓取。核心逻辑是循环翻页,直到没有下一页为止:

Sub 抓取列表到Excel() Dim driver As New Selenium.ChromeDriver driver.Get "https://example-system.com/list" Dim rowIndex As Integer rowIndex = 2 Do ' 抓取当前页数据行 Dim rows As Selenium.WebElements Set rows = driver.FindElementsByCss("table tbody tr") Dim r As Selenium.WebElement Dim cells As Selenium.WebElements Dim colIndex As Integer For Each r In rows Set cells = r.FindElementsByCss("td") colIndex = 1 For Each c In cells Sheet1.Cells(rowIndex, colIndex).Value = c.Text colIndex = colIndex + 1 Next c rowIndex = rowIndex + 1 Next r ' 判断是否还有下一页 Dim nextBtn As Selenium.WebElement Set nextBtn = driver.FindElementByXPath("//a[@class='next']") If nextBtn.GetAttribute("href") = vbNullString Then Exit Do Else nextBtn.Click 等待元素 driver, "table tbody tr", 10 End If Loop driver.Quit MsgBox "抓取完成,共写入 " & rowIndex - 2 & " 行" End Sub

这段代码有几个点需要解释。用户把下一页按钮的 href 属性作为判断依据,如果已经是最后一页,next 按钮通常是禁用状态,href 为空;如果还有下一页,点击按钮之后页面刷新,用等待函数确保新数据渲染完成再继续循环。这个判断方式在很多管理系统里都适用,但不同系统风格不一样,如果你遇到 next 按钮是 span 而不是 a 标签,判断逻辑就要相应调整。

6. 文件下载与上传自动化

办公自动化的场景里,下载和上传文件占据很大比重。SeleniumBasic 操作文件上传比较简单,因为页面上的 file input 元素本质上就是一个文件路径输入框。

driver.FindElementByCss("input[type=file]").SendKeys "C:\Users\你的用户名\Desktop\待上传名单.xlsx"

SendKeys 方法直接把本地路径填入文件控件,就能触发上传动作,不需要去点击弹出的系统文件选择窗口。这个技巧很实用,因为模拟系统弹窗是浏览器自动化里的难点,能绕过就绕过。

文件下载相对麻烦一点,因为浏览器会弹出下载确认栏,或者直接下载到默认目录,我们有时需要指定目录保存。常用方案是配合浏览器的下载设置:

Dim prefs As Selenium.ChromeOptions Set prefs = driver.Options prefs.SetPreference "download.default_directory", "D:\自动下载"

然后在代码里通过添加下载偏好设置的方式启动浏览器。SeleniumBasic 对 ChromeOptions 的支持没有 Python 版那么细,但基本的目录设置和禁用下载弹窗是可以做到的。下载完成后,可以用一个简单的循环等待文件出现。

7. 常见问题排查与异常处理速查表

浏览器自动化涉及的环节多:环境、驱动、页面结构、网络状态、时序问题,任何一个环节出问题都会让脚本中断。这里把最常见的几类问题整理成一个速查表,方便对照排查。

报错或现象常见原因排查与解决方式
启动浏览器时报 session not created浏览器和驱动版本不匹配对比浏览器版本号和驱动版本,换成相同大版本
找不到 drivers 文件夹未正确安装 SeleniumBasic 或被杀毒软件拦截重装程序,临时关闭安全软件的白名单提示
element not interactable元素被遮挡或不可编辑改用 JavaScript 的 click() 方法,或者先滚动到元素可见位置
元素找不到 NoSuchElement定位方式不对或页面未加载完成检查是否用了动态 class,优先用 ID 或稳定的属性定位;增加显式等待
脚本跑到一半浏览器崩溃内存不足或页面资源加载过多在代码里定期清理浏览器缓存,或者每处理完 N 条数据后重启浏览器
中文输入乱码VBA 字符串编码问题尝试使用 SendKeys 之前先激活页面焦点,或改用 ASCII 输入
打开页面极慢浏览器初次启动初始化驱动耗时首次启动多等几秒,不要直接把隐式等待时间设太高

这几个问题里,最让我花时间排查的是动态 class 导致元素找不到的情况。很多前端框架(比如 Vue、React)渲染的页面,class 名称是带 hash 的,每次构建后可能都变。如果你在代码里硬编码了某个 class 名称,页面一改版脚本就失效。处理方法是尽量用 ID 定位,或者使用相对 XPath,比如定位某个元素附近的文本节点,这样页面结构微调时容错性更高。

8. 性能优化与耗时瓶颈

自动化脚本跑一段时间后,你会发现最耗时间的往往不是操作本身,而是页面加载和等待。大批量任务要跑几十分钟,这里提两点优化经验。

第一个是复用浏览器实例。启动浏览器是个重操作,每次New Selenium.ChromeDriver都要拉起一个新的进程,耗时可能 10 秒甚至更久。如果任务是连续处理同一个站点的多个功能点,尽量在一个浏览器实例里完成所有操作,而不是频繁启停。这样代码也更稳定,因为避免了重复初始化带来的随机问题。

第二个是合理设置等待时间。不要无脑在每个操作后面都加Application.Wait 3秒,这种做法会把任务总耗时拉长好几倍。正确的思路是:隐式等待兜底,关键节点用显式等待,非关键节点直接执行。比如翻页后等待表格某元素出现,比固定等 5 秒要快得多,而且更可靠。

另一个细节是 VBA 本身是单线程的,在等待页面加载时无法并行处理其他任务。如果你有几十个独立的小任务要做,一个浏览器实例串行执行会比开多个实例并行慢,但并行方案的坑在于多浏览器实例会消耗大量内存,而且页面元素互相切换容易出错。我建议的折中方案是:把任务拆成几个批次,每批用一个浏览器进程跑,跑完关闭重启,在稳定性和速度之间取得平衡。

9. 在 Excel 里与 SeleniumBasic 深度结合的进阶玩法

SeleniumBasic 的最大优势是它就在 Excel 里,数据直接读写单元格。如果只是抓完数据写进表格,那还只是基础用法。进阶一点的做法是让脚本根据表格内容自动判断逻辑,实现真正意义上的“一键运行”。

比如用表格里的状态列控制流程:A 列是数据,B 列标记“待处理”或“已完成”,每处理完一条就把 B 列改成“已完成”。这样脚本可以随时中断重启,下次运行时会跳过已经处理过的行,实现断点续跑。

再比如把配置项都放进一个独立的“设置”工作表里,脚本开始时读取所有配置。这样你要修改网站地址、账号密码、等待时间时,不需要打开 VBA 代码去改,直接改单元格就行,对不熟悉代码的人来说非常友好。

还可以配合 Excel 的事件触发机制,在某个单元格输入值的时候自动启动脚本,或者用按钮控件绑定宏,做到点一下按钮就跑完全部流程。到这一步,你就不是在“写脚本”了,而是在搭建一个属于自己的迷你 RPA 平台。

有个权限问题要注意:网页里有些数据是登录后才能看到的,账号密码放在单元格里会有泄露风险。处理这种敏感信息时,建议把密码放到一个单独的工作簿里,或者直接用 VBA 的输入框动态输入,而不是硬编码在代码里。

10. 从浏览器自动化到办公自动化的边界

我发现很多人一开始是被浏览器自动化的需求吸引进来的,但最后撑起整个工作效率的其实是一整套 VBA 技巧。SeleniumBasic 把浏览器这个环节打通之后,你就拥有了一个从 Excel 到任意网页应用的数据通道。

今天我能直接给某位同事解决的问题就是:每天早上打开公司内部系统,把前一天的订单报表导出,用 Excel 处理后生成图表,再发邮件给团队。以前这套流程要 40 分钟人工操作,现在就一键完成,出错率也大幅降低。这种能省下每天固定 40 分钟时间的技能,带来的效率提升很快就能在绩效里看到。

我个人的体会是,SeleniumBasic 的边界并不只是“桌面版 RPA”,它更像一个桥梁,连接了最熟悉的表格工具和千变万化的网页世界。如果你本来就会 VBA,这套东西学起来可以说是一马平川;如果你完全不懂 VBA,从今天这篇开始,边做边学,也会发现浏览器自动化并没有想象中那么神秘,只要能把元素定位和等待时机这两件事吃透,大多数重复性网页操作就都能交给脚本去跑了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询