8

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?

4

6 回答 6

2

试试这个,它帮助我用 IE 解决了一次类似的问题:

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:深入了解 IE 事件,我发现这IE_DocumentComplete是页面实际准备好之前的最后一个事件。因此,还有另一种方法可以检测何时加载网页(请注意,您必须指定可能与目标 URL 不同的确切目标 URL,例如在重定向的情况下):

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
于 2014-04-25T18:58:27.517 回答
2

几年后,它也打击了我。我查看了建议的解决方案并进行了很多测试。已经开发了以下命令组合,我现在将在我的应用程序中使用它们。

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

在发现 oIE.Busy = True 有时在第一个循环之后,我确实安装了第二个相同的循环。

问候, ScriptMan

于 2017-10-02T08:40:05.843 回答
2

我已经成功使用了很长时间:

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

它一直运行良好,直到今天,当我更换我的电脑并切换到 Windows 10 和 Office 16 时。然后它开始在某些情况下工作,但有时循环没有完成。循环中的任何一个条件都没有达到,因此循环是 ENDLESS。

经过大量的谷歌搜索,我尝试了很多建议,直到我在这篇文章中找到了解决方案:Excel VBA Controlling IE local Intranet

解决方案是将 URL 添加到 Internet Explorer 安全选项卡中的受信任站点列表中。最后!

于 2016-02-14T21:51:48.507 回答
1

尝试将此脚本放在顶部,这可能会解决您的问题。

{ 
    $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;
    }
}

解释:

当您从正常模式运行脚本时,Powershell 没有某些权限,因此它无法正确读取 IE 状态,这就是为什么没有加载 DOM,所以脚本找不到任何参数

于 2017-03-23T04:14:52.130 回答
0

如果您使用 IE 处理表单提交,最好将其放在 Sub 中,这样您就可以重复引用同一个 Sub。

Dim IE
Set IE = WScript.CreateObject("InternetExplorer.Application")
    IE.Visible = True
    IE.Navigate "http://www.google.com"
    Wait IE, 500

Sub Wait(IE, SleepInterval)
    Do
        WScript.Sleep SleepInterval
    Loop While IE.ReadyState < 4 Or IE.Busy
End Sub

不同之处在于,您在wscript.sleep. 如果您在加载对象之前首先检查它们。它可能导致脚本失败。

于 2014-04-25T19:04:31.983 回答
0

所以通过查找这个答案,我仍然遇到了 IE 等待页面完全加载的问题。希望这个解决方案能帮助其他人,这就是我所做的:

Dim i As Integer
Dim j As Integer
Dim tagnames As Integer

While ie.Busy
    DoEvents
Wend
While ie.ReadyState <> 4
    DoEvents
Wend

i = 0
j = 0
While (i <> 5)
    i = 0
    tagnames = ie.document.getelementsbytagname("*").Length
    For j = 1 To 5
        Sleep (50)
        If tagnames = ie.document.getelementsbytagname("*").Length Then
            b = b + 1
        End If
    Next j
Wend

基本上,这样做是等待 5 个 50 毫秒的时间间隔,以使加载的标记名数量停止增加。当然,这可以根据您的需要进行调整,但这适用于我的应用程序。

于 2015-10-16T06:12:50.847 回答