我正在编写用于签署表单的脚本,然后填写一堆“注册”信息并单击“提交”。
到目前为止,我已经设法使脚本导航到登录页面,输入用户名,输入密码,然后单击“登录”。
但是,尽管我通常使用“ 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>在“名字”字段中输入名字(在工作之后,我将写出剩余的用于输入详细信息的脚本。
任何帮助都将是惊人的! 谢谢大家
答案 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.ReadyState
和IE.Busy
无法正常工作,您只需测试一下在页面加载后知道将存在的元素,然后添加{{1} } API,因此除非没有问题,否则不要进行快速{@ {1}}测试。
睡眠API是
Sleep
然后将您的Fname
更改为
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)