Internet explorer 防故障等待IE加载

Internet explorer 防故障等待IE加载,internet-explorer,web-scraping,vbscript,wsh,readystate,Internet Explorer,Web Scraping,Vbscript,Wsh,Readystate,是否有一种万无一失的方法让脚本等待Internet explorer完全加载 oIE.Busy和/或oIE.ReadyState都没有按照它们应该的方式工作: Set oIE = CreateObject("InternetExplorer.application") oIE.Visible = True oIE.navigate ("http://technopedia.com") Do While oIE.Busy Or oIE.ReadyState <&g

是否有一种万无一失的方法让脚本等待Internet explorer完全加载

oIE.Busy
和/或
oIE.ReadyState
都没有按照它们应该的方式工作:

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
Set oIE=CreateObject(“InternetExplorer.application”)
可见=真实
导航(“http://technopedia.com")
在oIE.Busy或oIE.ReadyState 4:WScript.Sleep 100:Loop时执行
' >>
Do While oIE.ReadyState 4:WScript.Sleep 100:Loop

还有其他建议吗?

试试这个,它曾经帮助我解决了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

如果您与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
dime
设置IE=WScript.CreateObject(“InternetExplorer.Application”)
可见=真实
即“导航”http://www.google.com"
等等,500
子等待(即睡眠间隔)
做
睡眠时间间隔
当IE.ReadyState<4或IE.Busy时循环
端接头

区别在于,在
wscript.sleep
之后引用IE对象。如果在加载对象之前首先检查它们。这可能会导致脚本失败

因此,通过查找这个答案,我仍然无法在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
Dim i作为整数
作为整数的Dim j
将标记名设置为整数
趁我忙
多芬特
温德
而ie.ReadyState 4
多芬特
温德
i=0
j=0
而(i)(5)
i=0
标记名=ie.document.getelementsbytagname(“*”).Length
对于j=1到5
睡眠(50)
如果标记名=ie.document.getelementsbytagname(“*”).Length,则
b=b+1
如果结束
下一个j
温德
基本上,这样做是等待5 50毫秒的间隔,以便加载的标记名数量停止增加。
当然,这可以根据您的需要进行调整,但这对我的应用程序有效。

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

While IE.readyState <> 4 Or IE.Busy: DoEvents: Wend
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
当IE.readyState 4或IE.Busy:DoEvents:Wend时
直到今天,我换了电脑,切换到Windows10和Office16,它一直工作得很好。然后它开始处理一些案例,但有时循环没有完成。循环中的任何一个条件都没有达到,因此循环是无止境的

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


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

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

{ 
    $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
所以,脚本在几年后没有找到任何参数,我也被它击中了。我查看了提议的解决方案并进行了大量测试。下面的命令组合已经开发出来,我现在将在我的应用程序中使用

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
Set oIE=CreateObject(“InternetExplorer.application”)
可见=真实
导航(“http://technopedia.com")
wscript.sleep 100
在oIE.Busy或oIE.ReadyState 4:WScript.Sleep 100:Loop时执行
wscript.sleep 100
在oIE.Busy或oIE.ReadyState 4:WScript.Sleep 100:Loop时执行
msgbox oIE.ReadyState&“/”oIE.Busy,vbInformation+vbMsgBoxForeground,Information
好的,退出
设置oIE=无
我在发现oIE.Busy=True之后安装的第二个相同的循环有时在第一个循环之后

问候,,
ScriptMan

请描述一下传统的
方法有什么问题。。。您显示的循环
?看起来在继续执行其他操作之前,页面加载的等待时间不够,因此给出了“元素必需错误”。当我显式增加等待时间时,效果很好。我曾经发现类似的行为,解决方案只是在之前添加额外的循环,比如
Do While oIE.ReadyState=4:WScript.Sleep 100:loop
。所以,第一步是等到“导航开始”,第二步——直到它完成。我不知道你的建议是什么。。你能详细解释一下吗?@user3408723真不敢相信我在评论2014年的事情。。。但我遇到了同样的问题,欧米茄的答案实际上是有道理的。主循环之前的代码行是在IE实际处理请求之前,即在它变得
繁忙之前,代码命中您的循环。代码运行得太快,在IE有机会变忙之前就命中了循环,因此它绕过了循环,因为它在技术上并不忙。非常聪明地研究答案,这是我从未考虑过的答案。可能有,这会有帮助。当IE.ReadyState<4或IE.Busy
更新时,它应该是
循环。谢谢omega。第2行末尾缺少一个右括号。