Html VBA:如何等待页面加载 我正在编写一个脚本,用于签署一个表单,填写一堆“注册”信息并点击提交。
到目前为止,我已经设法让脚本导航到登录页面,输入用户名,输入密码,然后单击“登录” 然而,虽然我通常会使用“While IE.readyState 4或IE.Busy:DoEvents:Wend”函数等待下一页加载,但我遇到了问题,因为不幸的是,一旦单击“登录”按钮,URL就会重定向到大约2个临时“加载”页面/URL,然后再到达“输入详细信息”页面/URL 这会导致运行时错误13,因为脚本认为页面已经加载,尽管浏览器随后会转到最终/正确页面 以下是相关代码: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 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语句不允许作为对象模块的公共成员”这是一张表-我刚刚将其放入模块中。这是否正确?是的,您不能在对象模块中声明公共变量。