解决方案:VBA 等待浏览器

问题描述 投票:0回答:1

stackoverflow 上有很多帖子涉及确保在代码继续之前网页已加载的情况。 我已经尝试了很多(取得了不同的成功),所以想把这个放出来以供将来参考。

此代码与如何编码、访问互联网、链接到页面或在该页面上获取或放置元素无关。这纯粹是代码,(似乎)对我来说总是正确且快速地运行。

Private Function wait4Web() As Boolean
Dim iLoop           As Long, iTries         As Long
    iLoop = 8389: iTries = 0: wait4Web = True
    Call doEventLoop(iLoop)
    Do While iTries < 100 And browser.Busy
        Call doEventLoop(iLoop): iTries = iTries + 1
    Loop
    Call doEventLoop(iLoop / 8)
    If iTries > 99 Then Call closeBrowser: wait4Web = False
End Function

Private Sub doEventLoop(iLoop As Long)
Dim i               As Long
    iLoop = iLoop * 1.25
    If iLoop > 34000# Then iLoop = 8389
    For i = 1 To iLoop: DoEvents: Next
End Sub

Private Sub closeBrowser()
    On Error Resume Next
    browser.Quit
    isOpen = False
    On Error GoTo 0
End Sub

每次向浏览器发出命令时,我都会调用 wait4Web(实际上我使用带有失败代码的 IF)。

If wait4Web then
    <process webpage>
Else
    <process failure>
EndIf

SO:解释一下... 它使用 DoEvents 来强制 PC 等待,而不是使用 WAIT 命令。这样可以实现更精细的颗粒化,从而加快操作速度。 每次调用 doEventsLoop 都会运行 8389 到 32000 次(是的,我就是个书呆子) 在我的笔记本电脑上进行测试时,我发现在未加载的情况下,使用电池时每秒运行约 36000 个 DoEvents,通电时每秒运行 63000 个 DoEvents。每个人都会有所不同,因此您可能会遇到不同的计时结果。 但这意味着,使用电池时,每秒将检查浏览器状态 1 到 5 次,而使用电源时,检查次数会增加一倍。 我循环 DoEvents 的原因是为了减少每次检查状态的开销(这会导致检查过程优先于浏览器加载过程并导致操作速度变慢)。 不同的循环是因为我是一个书呆子。

并且...为什么是 iTries 变量。嗯,这涵盖了互联网中断且在一定时间内没有响应的情况。 再次,使用我的统计数据(你的肯定会有所不同),电池运行 100 次循环大约需要 45 秒,而功率则为一半。我倾向于认为 20 秒的等待就足够了。但同样,如果您的 ISP 速度较慢且服务器超载,则可能需要增加。

最后...为什么要使用例程来关闭浏览器?因为我可以。由于在很多地方我可能想要关闭浏览器并重新启动它,因此单个例程很有用。

vba web wait completion
1个回答
0
投票

如果我标记了这个,那么它就已回答!!

© www.soinside.com 2019 - 2024. All rights reserved.