VBA的Internet Explorer等待网页加载VBA的Internet Explorer等待

2019-05-12 05:16发布

我知道这样的问题已经被问过,但我是有点不同的,已经相当令人担忧。 我正在处理的是与当输入框某些项目填写的装载更多的页面的几个事件形式的网页。 当这些事件再次触发页面加载,但保持在与同nameprop相同的URL。 我一直在使用以下几种方法都seperately和串在一起来处理等待页面加载,但有时仍VBA管理继续执行并设置HTMLDocument的变量到一个页面上没有它适当的信息导致宏调试。 这里有各种各样的事情,我一直在努力,到目前为止:

While IE.Busy
    DoEvents
Wend

Do Until IE.statusText = "Done"
    DoEvents
Loop

Do Until IE.readyState = 4
    DoEvents
Loop

我甚至尝试这些事件放入类似下面的循环,但它确实不太工作,因为上次更改属性只返回一个值精确到秒和宏在田地里旋转速度不够快,它返回一个新的在相同的第二页:

Do Until IE.statusText = "Done" And IE.Busy = False And IE.ReadyState = 4 _
And IE.document.lastModified > LastModified ----or---- IE.document.nameprop = _
"some known and expected name prop here"
    While IE.Busy
        DoEvents
    Wend
    Do Until IE.statusText = "Done"
        DoEvents
    Loop
    Do Until IE.readyState = 4
        DoEvents
    Loop
Loop

即使是没有等待足够长的时间设置HTMLDocument的对象导致调试。 我已经考虑将下一个输入元素和检查,对于没有进一步的代码,但因为一般输入元素在HTML存在,但被隐藏,直到合适的事件被触发,即使那会不会是时间成功100% ,这不会是一个问题,但他们没有加载其可能的选择,直到事件被触发后。 这可能是一个奇数页。

反正...不知道还有什么要补充。 如果有别的东西,可能是有益的,看看就问。 我猜我寻找的是一种方式来获得VBA等到IE知道另一页上没有它的方式。 看来之前是完全做得到加载几次。

所以...任何人有什么想法?

编辑:发现了一些新的东西去尝试。 尽管如此,没有骰子。 有人建议我加入这些尝试。 下面是代码,出于某种原因,VBE和发射应该填充选择的元素上的选项...想尝试XML事件后,使用这种方法时,Excel实例无响应...这里是代码:

intCounter = 0
Do until intCounter > 2
    Do Until IE.Busy = False: DoEvents: Loop
    Do Until IE.ReadyState = 4: DoEvents: Loop
    Set HTMLDoc = IE.Document
    Do Until HTMLDoc.ReadyState = "complete"
    Set HTMLSelect = HTMLDoc.getElementById("ctl00$ctl00$MainContent$ChildMainContent$ddlEmployeeBranchCodes")
    intCounter = 0
    For each Opt in HTMLSelect
        intCounter = intCounter + 1
    Next Opt
Loop

根据我可以在网页上看到的情况,我知道这是在这个循环中的VBE和Excel无响应的地方。

希望帮助......我知道这对我没有帮助... Drats。

编辑:只是想我要补充这一点。 当涉及到自动化的网页,在大多数情况下,我不再使用IE浏览器。 我发现这是好多了,完全回避的异步的东西这个问题,简单地执行职务,并得到自己。 可能不取决于你想做什么最佳的解决方案,但它工作,如果你在交通仔细观察和参数事情做好相当可靠。

Answer 1:

穷举搜索之后,我确定AJAX请求,在后台运行的异步JavaScript代码是不是我可以以任何方式获得的信号。 它似乎当它与加载页面,这是我想在未来探索的一个选项完成触发一些事件。 然而,我的目的,我只是用我已经使用填写我的网页上的形式相同的代码,我有它遍历每个字段再次检查,看看是否该值仍然点击提交按钮之前正确的。 这不是一个理想的解决方案,但它是出现在这种情况下采取了我的问题的护理解决方法。

我不知道如果我的解决方案将适用于别人处理这个问题,但它是否有帮助。 我认为这个问题的解决方法是将不得不依据有问题的应用程序和网页。



Answer 2:

我有我的网页同样的问题..是什么做的?

拳头选项

While Ie.**document**.readystate="complete"
DoEvents
Wend

有在选项中点击一个按钮/甚至火灾另一个盒子装载后几箱......我JSST放在这样的代码..

Do Until IE.document.getelementbyid("Next box").Lenght>0
DoEvents
Loop
Application.wait Now+Timevalue("00:00:02)


Answer 3:

旧的问题,我知道,但我觉得这是我还没有看到太大的很好的答案...


我有一个类似的问题 ; 等待所有图像上的谷歌图片搜索加载(这是一件棘手的事情,因为是由AJAX和用户滚动页面提示加载图像)。 正如评论已建议; 我的解决办法是等待某一个元素在视口中出现(这是一个面积比显示器屏幕大一点,将被视为您实际能“看到”什么的)。

这是通过取得getBoundingClientRect方法

Dim myDiv As HTMLDivElement: Set myDiv = currPage.getElementById("fbar") 
'myDiv should some element in the page which will only be visible once everything else is loaded
Dim elemRect As IHTMLRect: Set elemRect = myDiv.getBoundingClientRect
Do Until elemRect.bottom > 0 'If the element is not in the viewport, then this returns 0
    DoEvents
    'Now run the code that triggers the Ajax requests
    'For me that was simply scrolling down by a big number
    Set elemRect = myDiv.getBoundingClientRect
Loop
myDiv.ScrollIntoView

我在链接的答案是如何工作的详细解释,但本质上BoundingClientRect.bottom等于0,直到元素在vieport。

的元件是一些东西,被加载直线距离(像帧/模板的页)。 但是你并没有真正看到它,直到所有内容已被加载,因为它是正确的底部。

如果该元素的确被加载(我的谷歌搜索它的显示更多结果按钮)的最后一件事,那么只要你进入它时,它的加载视 ,你应该能够当它出现在检测页。 .bottom然后返回一个非零值(是与元素在页面上的实际位置-我真的不关心,虽然我的目的)。 我玩完了.ScrollIntoView ,但是这不是必需的。



文章来源: VBA Internet Explorer wait for web page to load