VBA Internet Explorer warten Sie, bis die web-Seite zu laden
Ich weiß, Fragen wie diese wurden vorher gefragt, aber mir ist ein bisschen anders und wurde ziemlich beunruhigend. Was ich zu tun ist eine web-Seite mit einem Formular mit ein paar Ereignissen, die Last mehr von der Seite, wenn bestimmte Elemente in Eingabe-Felder ausgefüllt sind. Wenn diese Ereignisse ausgelöst werden, die Seite lädt wieder, aber bleibt an der gleichen URL mit der gleichen nameprop. Ich habe mit den folgenden Arten von Methoden, die beide separat und aneinander zu behandeln, warten auf die Seite zu laden, aber manchmal sind die VBA immer noch gelingt, weiter ausgeführt, und legen Sie die HTMLDocument-variable auf eine Seite ohne die entsprechenden Informationen auf verursacht das makro Debuggen. Hier sind die Arten von Dinge, die ich versucht habe, so weit:
While IE.Busy
DoEvents
Wend
Do Until IE.statusText = "Done"
DoEvents
Loop
Do Until IE.readyState = 4
DoEvents
Loop
Ich habe sogar versucht, diese Ereignisse in eine Schleife, wie die folgenden, aber es hat nicht ganz funktioniert, weil die lastModified-Eigenschaft nur einen Wert zurückgibt, runter in den zweiten und der makro-spins durch die Felder schnell genug, dass es wieder eine neue Seite in der gleichen Sekunde:
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
Gar nicht warten, lange genug, um das HTMLDocument-Objekt führt zu einem debug. Ich habe erwogen, die Einstellung der nächsten input-element und überprüfen, die für nichts weiter zu dem code, aber selbst das würde nicht erfolgreich sein, 100% der Zeit, weil in der Regel die Input-Elemente gibt es in HTML aber erst dann sichtbar, wenn das entsprechende Ereignis ausgelöst wird, was kein problem wäre, aber Sie wissen nicht, laden Sie Ihre Auswahlmöglichkeiten, bis nach dem Ereignis ausgelöst wird. Könnte es eine ungerade Seite ist.
Sowieso... nicht sicher, was anderes zu fügen. Wenn es etwas anderes gibt, die hilfreich sein könnten, um zu sehen, Fragen Sie einfach. Ich denke, was ich Suche, ist ein Weg, um VBA zu warten, bis der IE kennt eine andere Seite ist nicht auf dem Weg. Es scheint, laden ein paar mal, bevor es vollständig fertig.
Also... Jemand irgendwelche Ideen haben?
EDIT: Gefunden, ein paar neue Dinge zu versuchen. Noch, keine Würfel. Es wurde vorgeschlagen, dass ich diese versuche. Hier ist der code, für einige Grund, der VBE und die excel-Instanz nicht mehr reagiert, wenn Sie diesen Ansatz, nach dem Brand ein event, das sollten füllen Sie die Optionen auf das select-element... das denken über das versuchen, xml... hier ist der code:
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
Basierend auf dem, was ich sehen kann, was auf der web-Seite, ich weiß, dass es irgendwo in dieser Schleife, der VBE und Excel nicht mehr reagiert.
Hoffe, das hilft... ich weiß es nicht helft mir... Drats.
EDIT: dachte Nur, ich würde noch etwas hinzufügen. Wenn es um die Automatisierung einer web-Seite, für die ich in den meisten Fällen nicht mehr den IE nutzen. Ich habe festgestellt, es ist viel besser, und umgeht das Problem der asynchronen Zeug völlig, um einfach die Beiträge und erhält sich selbst. Vielleicht nicht die beste Lösung, je nachdem, was Sie zu tun versuchen, aber es funktioniert Recht zuverlässig, wenn man sich die traffic-eng und parametrieren Sie die Dinge gut.
- Wenn man sich mit einer Seite, die dynamisch Hinzugefügt/entfernt-interface-Komponenten, dann hast du wirklich nur zwei Möglichkeiten: 1.) eine Feste Wartezeit von x Sekunden, um Konto für updates 2) überprüfen Sie die tatsächlichen Elemente, die Sie benötigen, um die Interaktion mit per code, und Schleife, bis Sie gefunden werden. Ich glaube nicht, dass es irgendeinen Weg, um zuverlässig sagen, in einem Allgemeinen Sinn, wenn (z.B.) alle ausstehenden AJAX-requests vollständig sind.
- Ja, ich denke, das ist, was ich will. Ich denke, ich werde ein Blick auf die input-Elemente, sondern Sie tatsächlich existieren, bevor die Ereignisse ausgelöst werden, aber Sie sind Optionen nicht. Also, ich denke, ich bin stecken, zählen Optionen bis Dinge zur Verfügung stehen.
- Naja... wie es sich herausstellt, zählen die Optionen, die auf das input-element bewirkt, dass der code nicht mehr reagiert. Also ich bin ein bisschen ein großes Problem.
- Schlage vor, Sie aktualisieren Sie Ihre Frage mit dem code versucht: jemand könnte haben einen anderen Ansatz.
- Es ist in all seinem scheitern Herrlichkeit. Ich dachte, es sah ziemlich schön, wenn ich im Begriff war, für Sie. Nur nicht ganz geklappt. Darüber nachzudenken, versuchen einige xml-option.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach einer erschöpfenden Suche, habe ich festgestellt, dass die AJAX-request, javascript code, der ausgeführt wird asynchron im hintergrund ist nicht etwas, bekomme ich ein signal in keiner Weise. Es scheint, trigger-Ereignisses, wenn es fertig ist mit laden der Seite, das ist eine option möchte ich erkunden in die Zukunft. Allerdings, für meine Zwecke, ich benutzte einfach den gleichen code, den ich wurde bereits mit ausfüllen des Formulars auf meiner Seite und ich habe es in einer Schleife durch jedes Feld wieder zu überprüfen, um zu sehen, ob die Werte noch Stimmen, bevor Sie auf den Absenden-button. Es ist keine ideale Lösung, aber es ist ein workaround, der angezeigt wird, genommen haben auf meine Frage in diesem Fall.
Ich bin mir nicht sicher, ob meine Lösung anwendbar wäre jemand anderes sich mit diesem Thema beschäftigt, aber es ist so, ob es hilft. Ich denke, workarounds für dieses Problem haben werden, werden basierend auf der Anwendung und web-Seite, in Frage stellen.
Ich hatte das gleiche problem mit Meiner Webseite..
Was ist gemacht habe ist...
die erste option ist
gab es einige Felder, in denen Optionen geladen wurden nach dem klicken auf eine Schaltfläche/noch Feuer in einer anderen box...ich jsst platziert-code wie dieser..
Alte Frage, ich weiß, aber ich denke, das ist eine gute Antwort, die ich nicht gesehen habe, über viel...
Hatte ich eine ähnliches problem; warten für alle Bilder auf einer google-Bilder-Suche zu laden (das ist eine heikle Sache, da Bild lädt dazu aufgefordert werden, die von AJAX und der Benutzer scrollen der Seite). Wie schon vorgeschlagen, in den Kommentaren; meine Lösung war zu warten, bis ein bestimmtes element in der viewport (dies ist ein Bereich, der ein wenig größer als der Bildschirm, und wird als das behandelt, was Sie tatsächlich "sehen").
Erreicht wird dies mit der
getBoundingClientRect
MethodeErkläre ich im detail in der verlinkten Antwort, wie das funktioniert, aber im wesentlichen
BoundingClientRect.bottom
ist gleich 0, bis das element in der vieport.Das element ist etwas, was geladen wird, sofort (wie ein Rahmen/Vorlage für die Seite). Aber Sie nicht wirklich sehen, bis alle Inhalte geladen wurden, weil es direkt an der Unterseite.
Wenn das element ist in der Tat das Letzte, was geladen werden soll (für meine google-Suche war es, die Mehr Zeigen Ergebnisse - Taste), dann so lange, wie Sie es in den Arbeitsbereich, wenn es geladen, Sie sollten in der Lage sein zu erkennen, wenn es auf der Seite angezeigt wird.
.bottom
gibt dann einen nicht-null-Wert (etwas zu tun mit der eigentlichen position des Elements auf der Seite - ich nicht wirklich Pflege, aber für meine Zwecke). Ich schmecke mit einem.ScrollIntoView
, aber das ist nicht wichtig.