1
votes

I'm in the middle of writing a script for signing into a form, and filling in a bunch of "sign up" information and clicking submit.

Thus far, i have managed to get the script to navigate to the sign in page, enter username, enter password and click "sign in".

However, whilst I would normally use the "While IE.readyState <> 4 Or IE.Busy: DoEvents: Wend" function to wait for the next page to load, i am having trouble because unfortunately what appears to be happening is that once the sign in button is clicked, the URL is redirected to about 2 interim "loading" pages/URLs before arriving at the "enter details" page/URL.

This results in a run-time 13 error, as the script thinks the page has already loaded, despite the browser then moving on to the final/correct page.

Here is the code in question:

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

Essentially the script loads the page>enters username>enters password>clicks sign in>is supposed to wait until the final url is loaded>enters first name in the first name field (after this is working i will write the remainder of the script for entering details.

Any and all help would be amazing! thanks all

2

2 Answers

1
votes

I much prefer adding a timed loop testing for presence of an element as this allows you to Exit earlier is element found and is thus potentially more efficient than a hard coded sleep time which will always be completed.

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
0
votes

If IE.ReadyState and IE.Busy aren't working, you could just test for an element you know will exist after the page has loaded and add the Sleep API so you aren't rapid-fire testing Fname until it's not nothing.

Sleep API is

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

Then change your While-Wend to

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