【问题标题】:VBA: How to wait for page to loadVBA:如何等待页面加载
【发布时间】:2019-06-11 03:51:31
【问题描述】:

我正在编写用于登录表单的脚本,并填写一堆“注册”信息并点击提交。

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

但是,虽然我通常会使用“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

基本上脚本加载页面>输入用户名>输入密码>点击登录>应该等到最终网址加载>在名字字段中输入名字(在这个工作之后我会写剩下的用于输入详细信息的脚本。

任何和所有的帮助都会很棒! 谢谢大家

【问题讨论】:

    标签: html vba


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      如果IE.ReadyStateIE.Busy 不起作用,您可以在页面加载后测试您知道存在的元素并添加Sleep API,这样您就可以了t 快速测试Fname 直到它不是什么都没有。

      睡眠 API 是

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

      然后将您的While-Wend 更改为

      Do Until Not Fname Is Nothing
          Set Fname = IE.document.getElementByID("firstname")
          Sleep 1000 '<- make this however long you want it to wait in ms
      Loop
      

      【讨论】:

      • 感谢您的帮助-我已将其放入但现在我似乎收到错误消息:“编译错误:End Sub、End Function 或 End Property 之后可能出现只有 cmets”这会出现成为声明子行的问题
      • 您需要在模块顶部的 Sub 或 Function 之外添加 Declare Sub 行,就像添加公共变量一样。
      • 现在执行此操作后,我似乎仍然遇到不同的错误。 "编译错误:常量、定长字符串、数组、用户定义类型和 Declare 语句不允许作为对象模块的公共成员"
      • 这是一张纸——我只是把它放到了一个模块中。这是正确的吗?
      • 是的,你不能在对象模块中声明公共变量。
      猜你喜欢
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 2017-09-13
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多