Html VBA:如何等待页面加载 我正在编写一个脚本,用于签署一个表单,填写一堆“注册”信息并点击提交。

Html VBA:如何等待页面加载 我正在编写一个脚本,用于签署一个表单,填写一堆“注册”信息并点击提交。,html,vba,Html,Vba,到目前为止,我已经设法让脚本导航到登录页面,输入用户名,输入密码,然后单击“登录” 然而,虽然我通常会使用“While IE.readyState 4或IE.Busy:DoEvents:Wend”函数等待下一页加载,但我遇到了问题,因为不幸的是,一旦单击“登录”按钮,URL就会重定向到大约2个临时“加载”页面/URL,然后再到达“输入详细信息”页面/URL 这会导致运行时错误13,因为脚本认为页面已经加载,尽管浏览器随后会转到最终/正确页面 以下是相关代码: While IE.readyStat

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

然而,虽然我通常会使用“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
当IE.readyState 4或IE.Busy:DoEvents:Wend时
设置UserN=IE.document.getElementByID(“登录\用户名”)
UserN.Value=“exampleUser”
Set PassW=IE.document.getElementByID(“登录\输入\密码”)
PassW.Value=“ExamplePass”
设置AllHyperLinks=IE.document.getElementsByClassName(“标签内容”)
对于所有超链接中的每个超链接
如果hyper_link.innerHTML=“登录”,则
超链接。点击
退出
如果结束
下一个
当IE.readyState 4或IE.Busy:DoEvents:Wend
Set Fname=IE.document.getElementByID(“名字”)
Fname.Value=“约翰”
端接头
基本上,脚本加载页面>输入用户名>输入密码>单击登录>应该等待,直到加载最终url>在名字字段中输入名字(这项工作完成后,我将编写脚本的其余部分以输入详细信息)

任何和所有的帮助都将是惊人的!
感谢大家

如果
IE.ReadyState
IE.Busy
不起作用,您可以在页面加载后测试您知道将存在的元素,并添加
Sleep
API,这样您就不会进行快速测试
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
直到不知道Fname什么都不是
Set Fname=IE.document.getElementByID(“名字”)

Sleep 1000'我更喜欢添加一个定时循环测试元素的存在,因为这允许您在找到元素之前退出,因此可能比总是完成的硬编码睡眠时间更有效

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
Dim t作为日期,ele作为对象
Const MAX_WAIT_second=10'MAX_WAIT_second然后退出Do
错误转到0
循环,而ele什么都不是
如果不是,那么ele什么都不是
“做点什么
如果结束

谢谢您的帮助-我已经把它放进去了,但是现在我似乎收到了错误:“编译错误:只有注释可以出现在End Sub、End函数或End属性之后。”“这似乎是declare子行的问题。您需要将declare子行添加到模块顶部的子行或函数之外,就像添加公共变量一样。现在执行此操作后,我似乎仍然收到不同的错误。”。“编译错误:常量、定长字符串、数组、用户定义类型和Declare语句不允许作为对象模块的公共成员”这是一张表-我刚刚将其放入模块中。这是否正确?是的,您不能在对象模块中声明公共变量。