VBA:如何等待页面加载

时间:2019-01-17 00:59:07

标签: html vba

我正在编写用于签署表单的脚本,然后填写一堆“注册”信息并单击“提交”。

到目前为止,我已经设法使脚本导航到登录页面,输入用户名,输入密码,然后单击“登录”。

但是,尽管我通常使用“ While IE.readyState <> 4或IE.Busy:DoEvents:Wend”功能等待下一页加载,但我遇到了麻烦,因为不幸的是正在发生的事情是即单击登录按钮后,URL会重定向到大约2个临时“正在加载”的页面/ URL,然后到达“输入详细信息”页面/ URL。

这会导致运行时13错误,因为脚本认为页面已经加载,尽管浏览器随后进入了最终/正确页面。

这是有问题的代码:

While IE.readyState <> 4 Or IE.Busy: DoEvents: Wend

    Set UserN = IE.document.getElementByID("login_username")
    UserN.Value = "exampleUser"

    Set PassW = IE.document.getElementByID("login_entered_password")
    PassW.Value = "ExamplePass"

    Set AllHyperLinks = IE.document.getElementsByClassName("label-content")
     For Each hyper_link In AllHyperLinks
         If hyper_link.innerHTML = "Sign in" Then
             hyper_link.Click
             Exit For
         End If
     Next

    While IE.readyState <> 4 Or IE.Busy: DoEvents: Wend
    Set Fname = IE.document.getElementByID("firstname")
    Fname.Value = "John"

End Sub

基本上,脚本会加载页面>输入用户名>输入密码>点击登录>应该等待直到加载最终URL>在“名字”字段中输入名字(在工作之后,我将写出剩余的用于输入详细信息的脚本。

任何帮助都将是惊人的! 谢谢大家

2 个答案:

答案 0 :(得分:1)

我更喜欢为元素的存在添加定时循环测试,因为它使您可以在找到元素的情况下更早退出,因此比永远完成的硬编码睡眠时间更有效率。

Dim t As Date, ele As Object
Const MAX_WAIT_SEC As Long = 10 '<==Adjust wait time

While ie.Busy Or ie.readyState < 4: DoEvents: Wend
t = timer
Do 
    DoEvents
    On Error Resume Next
    Set ele = IE.document.getElementByID("firstname")
    If Timer - t > MAX_WAIT_SEC Then Exit Do
    On Error GoTo 0
Loop While ele Is Nothing

If Not ele Is Nothing Then
    'do something 
End If

答案 1 :(得分:-1)

如果IE.ReadyStateIE.Busy无法正常工作,您只需测试一下在页面加载后知道存在的元素,然后添加{{1} } API,因此除非没有问题,否则不要进行快速{@ {1}}测试。

睡眠API是

Sleep

然后将您的Fname更改为

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)