使用 VBA 自动化 Chrome / Edge

介绍

Internet Explorer classic(下称IE)是基于ActiveX技术的。对于 Webscraping 或从 VBA 等 OLE 感知编程语言进行测试等任务,自动化 IE 非常容易。但微软将在不久的将来终止对 IE 的支持,并希望用户转向 Microsoft Edge 等更新的浏览器。

Microsoft Edge 不再基于 ActiveX 技术。Microsoft 似乎对创建 IE OLE 对象的替代品不感兴趣。有一些库试图使用 Selenium 来填补这个空白,请参阅Seleniumbasic作为示例。但这需要安装 Webdriver,这在某些环境中可能不可行。除了基于 Chrome 的浏览器之外,以下解决方案不需要其他软件。

请记住,在运行代码之前必须终止所有正在运行的 Edge 进程。否则,选项卡将在当前运行的进程中打开,而不是在已启动的进程中打开,并且 VBA 和 Edge 之间的后续通信将失败。

CDP 协议

该代码使用 Chrome Devtools 协议 (CDP) 与浏览器进行通信。可以在此处找到该协议的完整文档。该代码仅实现了一组非常狭窄的功能:

  1. 建立通讯通道的基本功能
  2. 导航到 url
  3. 评估页面上下文中的任意 JavaScript 表达式并返回结果

但是这些功能应该足以进行基本的 Webscraping。主要代码如下:

VB.NET
收缩▲   

该类clsEdge实现 CDP 协议。CDP 协议是基于消息的协议。消息被编码为 JSON。要生成和解析 JSON,代码使用此处的 VBA-JSON 库。

与管道的低级通信

对 CDP 协议的低级访问可通过两种方式获得:Edge 在特定端口或通过管道启动小型 Web 服务器。网络服务器缺乏任何安全功能。计算机上的任何用户都可以访问网络服务器。这可能不会对单用户计算机或专用虚拟容器造成任何风险。但是,如果进程在具有多个用户的终端服务器上运行,则这是不可接受的。这就是代码使用管道与 Edge 通信的原因。

Edge 使用第三个文件描述符 (fd) 读取消息,使用第四个 fd 写入消息。将 fds 从父进程传递给子进程在 Unix 下很常见,但在 Windows 下不常见。用于创建子进程 ( CreateProcess) 的 WinApi 调用允许使用该结构为三个常见的 fds ( stdinstdout, ) 设置管道,请参阅CreateProcessA 函数 (processthreadsapi.h)STARTUPINFOA 结构 (processthreadsapi.h)。其他 fds 不能传递给子进程。stderrSTARTUPINFO

为了设置第四个和第五个 fds,必须使用 Microsoft Visual C Runtime ( MSVCRT) 的一个未记录的特性:如果应用程序是用 Microsoft C 编译的,则可以使用结构的lpReserved2参数传递管道STARTUPINFO。有关详细信息,请参阅“未记录的CreateProcess ”(向下滚动页面)。

可以传入的结构lpReserved2在模块中定义modExec

VB.NET

该结构被定义为传递os_handle数组中的五个 fd。数组的值crt_flags可以从libuv/process-stdio.c at v1.x · libuv/libuv · GitHub获得。必须的字段struct连续位于内存中(打包)。VBA 将struct字段对齐到 4 字节边界(在 32 位系统上)。这就是为什么struct定义第二个原始类型的原因。

VB.NET

填充 后STDIO_BUFFER struct,内容被复制MoveMemorySTDIO_BUFFER2结构中。25 个字节的大小足以容纳crt_flags(5 个字节)和指针(20 个字节)。 

历史

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 当VBA自动化出现错误时,可能是以下几个方面引起的: 1.语法错误:VBA代码的语法错误可能会导致自动化出现问题。请仔细检查代码并查找语法错误。 2.对象引用错误:VBA自动化需要访问其他应用程序的对象。如果对象的引用有误,则可能会导致自动化失败。 3.权限问题:VBA自动化需要访问其他应用程序的对象时,可能会因为权限问题而出现错误。 4.版本兼容性问题:如果VBA代码是用于旧版本的应用程序,而现在运行的应用程序版本不同,那么自动化可能会出现错误。 当VBA自动化出现错误时,可以通过调试代码和查看错误消息来识别问题所在并进行修复。同时,也要确保在使用VBA自动化时遵循最佳实践,如避免硬编码、错误处理和及时释放对象等。 ### 回答2: 在使用VBA自动化过程,经常会遇到一些错误。以下列举几种常见的错误类型和解决方法: 1. 运行时错误:这种错误通常在代码执行时发生,例如访问了不存在的对象、调用了不支持的方法等。解决方法是检查代码语法和逻辑,确认是否正确引用了对象和方法。 2. 编译错误:这种错误通常在代码编辑时发生,例如忘记了添加某个变量或操作符。解决方法是仔细检查代码,确保语法正确、变量声明正确等。 3. 执行效率问题:如果自动化代码执行效率太低,可能会导致程序长时间卡死或崩溃。解决方法是优化程序代码,减少不必要的操作和循环,避免频繁读写文件等。 4. 与第三方程序或组件的兼容性问题:有时候VBA自动化过程需要与其他程序或组件进行交互,可能会出现兼容性问题。解决方法是确认使用的程序或组件版本正确,更新相应的驱动程序和库文件等。 5. 资源占用过高问题:VBA自动化过程会占用系统资源,如果资源占用过高可能会导致程序卡顿或崩溃。解决方法是尽量避免一次性处理大量数据,减少内存占用和磁盘读写次数等。 总之,使用VBA自动化过程需要仔细检查代码,注意程序逻辑和效率,同时保持程序和外部程序的兼容性,避免过度占用系统资源。这样才能保证程序正常运行,提高自动化效率。 ### 回答3: VBA自动化是指使用VBA语言编写代码来自动化执行某一过程的过程。VBA自动化可以帮助我们提高效率,减少工作负担,然而,当我们进行自动化操作时,可能会遇到各种错误。 VBA自动化错误可能由以下几个方面导致: 1. 语法错误。这是最常见的VBA自动化错误,常见于代码拼写错误、语句错误、变量名错误等。 2. 运行时错误。常见于程序在运行时出现的错误,例如超出数组边界、除数为零等。 3. 逻辑错误。这种错误不容易被发现,需要仔细分析代码逻辑。 4. 接口错误。常见于应用程序接口调用时的错误。 在遇到VBA自动化错误时,应该首先仔细检查代码,找出错误所在。如果无法找到错误,可以使用调试工具,在程序运行过程逐步查看变量的取值,找出错误原因。同时,应该学会使用异常处理语句,在程序出错时进行相应的处理,避免程序崩溃。 此外,我们还可以通过以下方法减少自动化错误的发生: 1. 编写规范的代码,注重变量命名、代码格式等。 2. 适当地添加注释,以便其他人能够更容易地理解你的代码。 3. 避免过度使用复杂的自动化操作,尽可能简化代码逻辑。 4. 及时更新程序,避免程序因为版本过旧而出错。 总之,VBA自动化错误的发生在所难免,我们需要不断学习和探索,找出有效的方法来降低错误发生的概率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值