Failproof Wait for IE to load

58,190

Solution 1

I have for a very long time been successfully using:

While IE.readyState <> 4 Or IE.Busy: DoEvents: Wend

It has been working perfectly until today, when I changed my PC and switched to Windows 10 and Office 16. Then it started working on some cases, but there were times when the loop was not completed. Neither one of the conditions in the loop was reached, so the loop was ENDLESS.

After a lot of Googling, I have tried many suggestions until I found the solution in this post: Excel VBA Controlling IE local intranet

The solution is to add the URL to the trusted sites list in Internet Explorer Security tab. Finally!

Solution 2

Try this one, it helped me to solve similar problem with IE once:

Set oIE = CreateObject("InternetExplorer.application")
oIE.Visible = True
oIE.navigate ("http://technopedia.com")
Do While oIE.ReadyState = 4: WScript.Sleep 100: Loop
Do While oIE.ReadyState <> 4: WScript.Sleep 100: Loop
' example ref to DOM
MsgBox oIE.Document.GetElementsByTagName("div").Length

UPD: Drilling down IE events I found that IE_DocumentComplete is the last event before the page is actually ready. So there is one more method to detect when a web page is loaded (note that you have to specify the exact destination URL which may differ from the target URL eg in case of redirection):

option explicit
dim ie, targurl, desturl, completed

set ie = wscript.createobject("internetexplorer.application", "ie_")
ie.visible = true

targurl = "http://technopedia.com/"
desturl = "http://technopedia.com/"

' targurl = "http://tumblr.com/"
' desturl = "https://www.tumblr.com/" ' redirection if you are not login
' desturl = "https://www.tumblr.com/dashboard" ' redirection if you are login

completed = false
ie.navigate targurl
do until completed
    wscript.sleep 100
loop
' your code here
msgbox ie.document.getelementsbytagname("*").length
ie.quit

sub ie_documentcomplete(byval pdisp, byval url)
    if url = desturl then completed = true
end sub

Solution 3

A few years later, it also hit me. I looked at the proposed solutions and tested a lot. The following combination of commands has been developed, which I will now use in my application.

Set oIE = CreateObject("InternetExplorer.application")

oIE.Visible = True
oIE.navigate ("http://technopedia.com")

wscript.sleep 100
Do While oIE.Busy or oIE.ReadyState <> 4: WScript.Sleep 100: Loop  

wscript.sleep 100
Do While oIE.Busy or oIE.ReadyState <> 4: WScript.Sleep 100: Loop  

msgbox oIE.ReadyState & " / " & oIE.Busy , vbInformation +  vbMsgBoxForeground , "Information"

oIE.Quit

set oIE = Nothing

The second identical loop I did install after it turned out that oIE.Busy = True was sometimes after the first loop.

Regards, ScriptMan

Solution 4

try to put this script on the top, this may solve Your problem.

{ 
    $myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent();
    $myWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($myWindowsID);
    $adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator;

    if ($myWindowsPrincipal.IsInRole($adminRole)) {
        $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)";
        Clear-Host;
    }
    else {
        $newProcess = New-Object System.Diagnostics.ProcessStartInfo "PowerShell";
        $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"
        $newProcess.Verb = "runas";
        [System.Diagnostics.Process]::Start($newProcess);
        Exit;
    }
}

Explanation:

Powershell is not having some rights when you are running script from the normal mode so it is not reading IE status properly and that is why DOM is not being loaded so, script doesn't found any parameter

Share:
58,190
user3408723
Author by

user3408723

Updated on July 09, 2022

Comments

  • user3408723
    user3408723 almost 2 years

    Is there a foolproof way for the script to wait till the Internet explorer is completely loaded?

    Both oIE.Busy and / or oIE.ReadyState are not working the way they should:

    Set oIE = CreateObject("InternetExplorer.application")
    
        oIE.Visible = True
        oIE.navigate ("http://technopedia.com")
    
        Do While oIE.Busy Or oIE.ReadyState <> 4: WScript.Sleep 100: Loop  
    
        ' <<<<< OR >>>>>>
    
        Do While oIE.ReadyState <> 4: WScript.Sleep 100: Loop
    

    Any other suggestions?

  • omegastripes
    omegastripes about 10 years
    There is the similar question, may be this helps.
  • omegastripes
    omegastripes almost 8 years
    It should be Loop While IE.ReadyState < 4 Or IE.Busy
  • Rich
    Rich almost 8 years
    Updated. Thanks omega.
  • jony
    jony almost 7 years
    You are missing a closing parenthesis at the end of line 2.