AW: Eintrag auf Website
19.11.2020 20:21:03
Zwenn
Hallo Rolf und Karl-Heinz,
die Textfelder sind mit HTML-Events versehen. Um sich automatisiert einloggen zu können, muss jeweils das change-Event getriggert werden. Sonst klappt das nicht. Kann man leicht ausprobieren, indem man das Triggern mal auskommentiert.
Der Username wird manchmal nicht genommen, wenn man direkt drauf los geht. Deshalb habe ich eine Sekunde Pause vor dem Setzen der Werte eingebaut. Komisches Verhalten, aber so scheint es stabil zu funktionieren.
Wie Du schon geschrieben hast Karl-Heinz, muss gewartet werden, bis die Seite geladen ist. Die Inhalte werden aber dynamisch nachgeladen, damit ist die Abfrage auf busy oder ReadyState nicht brauchbar. Ich habe eine andere Prüfung eingebaut.
Den Rest der Erklärungen habe ich als Kommentare an den Richtigen Stellen im Code untergebracht:
Private Sub CommandButton3_Click()
Dim nodeUserName As Object
Dim nodePassWord As Object
Dim nodeSelectButton As Object
With CreateObject("InternetExplorer.application")
.Resizable = True
.Visible = True
.navigate "https://de.cgmlife.com/vkb/?module=invoice#/start/"
'Die folgende Zeile müsste der vorherihgen mit navigate folgen
'Sie sorgt für das Warten, bis der IE das Dokument geladen hat
'Do While .Busy: DoEvents: Loop
'Es ist aber eine Seite mit dynamischen Inhalten
'Ob die Seite wirklich vollständig geladen ist,
'kann in einer Schleife durch die Prüfung auf das
'Vorhanden sein eines benötigten HTML Elementes
'festgestellt werden
Do
On Error Resume Next
'Wenn der Submit Button da ist, ist alles da, was benötigt wird
'(Hier kein Timeout, falls der Button nicht auftaucht)
Set nodeSelectButton = .document.QuerySelector("button[type='submit']")
On Error GoTo 0
Loop While nodeSelectButton Is Nothing
'Erst jetzt kann auf die gewünschten Elemente zugegeriffen werden
'Die beiden Textfelder sind mit HTML Events versehen, von denen
'zwei zwingend ausgelöst werden müssen. Sonst werden die Eingaben
'von der Webseite nicht erkannt und deshalb nicht verarbeitet
'Username eingeben
'Dieses Feld zickt manchmal rum, keine Ahnung warum
'Wir geben der Seite eine Sekunde Pause
Application.Wait (Now + TimeSerial(0, 0, 1))
'Als erstes das Textfeld für den Usernamen selektieren
Set nodeUserName = .document.getElementsByName("username")(0)
'Dann den Usernamen setzen
nodeUserName.Value = "Rapunzel"
'Danach das Change-Event triggern
Call TriggerEvent(.document, nodeUserName, "change")
'Passwort eingeben (gleiches Vorgehen)
Set nodePassWord = .document.getElementsByName("password")(0)
nodePassWord.Value = "lass dein Haar herunter"
Call TriggerEvent(.document, nodePassWord, "change")
'Submit Button klicken
nodeSelectButton.Click
End With
End Sub
Diese Prozedur kann verwendet werden, um beliebige HTML-Events zu triggern:
Private Sub TriggerEvent(htmlDocument As Object, _
htmlElementWithEvent As Object, _
eventType As String)
'Procedure based on a code by Anton on
'https://www.herber.de/forum
Dim theEvent As Object
htmlElementWithEvent.Focus
Set theEvent = htmlDocument.createEvent("HTMLEvents")
theEvent.initEvent eventType, True, False
htmlElementWithEvent.dispatchEvent theEvent
End Sub
Bei mir scheint der LogIn Vorgang damit zu funktionieren. Denn nach dem Klicken des Submit Button bekomme ich die Meldung, dass die eingegeben Werte falsch sind. Werden die Werte ignoriert, werden an den Textfeldern rote Hinweise angezeigt, dass die Werte gesetzt werden müssen.
Viele Grüße,
Zwenn