Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Webformular (DHL) ausfüllen

Webformular (DHL) ausfüllen
11.11.2019 10:08:50
UweVBA
Hallo und Guten Tag,
DHL hat mal wieder die Seite geändert und ich komme nicht weiter.
Der Name wird in das Feld eingetragen, die Eingabe verschwindet sobald der Warenkorb angeclickt _
wird.

Sub DHLOnlineFrankierung()
Dim IEApp As Object, oContent As Object
Dim IEDocument As Object
Dim strURL As String
Set IEApp = CreateObject("InternetExplorer.Application")
IEApp.navigate "https://www.dhl.de/de/privatkunden/pakete-versenden/online-frankieren.html?type= _
ShipmentEditorProductSelection"
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Busy = False
With IEApp
.Visible = True
.FullScreen = True
End With
Set IEDocument = IEApp.Document
Do
On Error Resume Next
Set oContent = IEDocument.getElementById("content")
Loop Until Err.Number = 0
On Error GoTo 0
'weiter zur Adresseingabe
Dim Meldung, Stil, Titel, Antwort
Meldung = "Weiter zur Adresseingabe"    ' Meldung definieren.
Stil = vbYesNo + vbCritical + vbDefaultButton2    ' Schaltflächen
' definieren.
Titel = "Zweite Seite DHL-Online-Frankierung"    ' Titel definieren.
Antwort = MsgBox(Meldung, Stil, Titel, Hilfe, Ktxt)    ' Meldung anzeigen.
If Antwort = vbYes Then    ' Benutzer hat "Ja" gewählt.
IEDocument.getElementsByClassName("btn btn-primary").Item(12).Click
End If
Stop
With IEDocument
.getElementById("address.sender.name2").focus
.getElementById("address.sender.name2").Value = "Mustermann"
End With
Set IEDocument = Nothing
Set IEApp = Nothing
End Sub

Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Webformular (DHL) ausfüllen
11.11.2019 12:45:42
Zwenn
Hallo Uwe,
auf der verlinkten Seite gibt es kein Eingabefeld. Erkläre doch mal ausführlicher was Du eigentlich erreichen willst. Das Makro ist jetzt nicht gerade Fließtext ;-) Vor allem nicht, wenn man die richtige Seite dazu nicht sehen und untersuchen kann.
Also bitte den richtigen Link angeben und schreiben was Du auf der Seite anstellen willst.
Viele Grüße,
Zwenn
Anzeige
AW: Webformular (DHL) ausfüllen
11.11.2019 14:45:47
UweVBA
Hallo,
ich möchte mit VBA die Adressen eintragen.
Es ist die zweite Seite, die ich aber nur über die erste Seite erreiche.
AW: Webformular (DHL) ausfüllen
11.11.2019 18:57:11
Zwenn
Hallo Uwe,
die Eingabefelder werden durch Events überwacht. Wenn man ferngesteuert etwas eingibt, muss man die Events auslösen. Früher ging das mal mit fireEvent, danach mit initEvent und dispatchEvent. Heutzutage soll es angeblich über einen zu initialisierenden EventListener gehen, ich habe aber bisher noch kein vollständiges Beispiel gefunden, weil da noch lauter Tüdelüt drumrum dazu gehört. Meine eigenen Versuche der Event-Überwachung sind auch schon in der Vergangenheit alle gescheitert. Falls Du also eine Lösung findest, lass es mich wissen ;-)
Hier mal ein Link, wie es damals ging:
https://microsoft-programmierer.de/Office-365/Access/Controls/webBrowser/Vba,-HTMLSelect_colon_-FireEvent-OnChange-oder-DispatchEvent?2095
Ein weiterer Link zum EventListener:
https://developer.mozilla.org/de/docs/Web/API/EventTarget/addEventListener
Das Ganze ist dabei auch noch abhängig von der eingesetzten IE Version soweit ich weiß.
Viele Grüße,
Zwenn
Anzeige
AW: Webformular (DHL) ausfüllen
11.11.2019 22:47:42
UweVBA
Hallo,
das hatte ich auch schon versucht.
Anton hatte vor einiger Zeit die Eingabefelder überlistet. Ich komme aber auch mit der Anleitung nicht weiter.
Function aktualisieren(oDoc, oFld)
Dim event_onChange As Object
oFld.focus
Set event_onChange = oDoc.createEvent("HTMLEvents")
event_onChange.initEvent "change", True, False
oFld.dispatchEvent event_onChange
End Function

Anzeige
AW: Webformular (DHL) ausfüllen
12.11.2019 13:59:37
Zwenn
Hallo Uwe,
das hilft :-) Die Felder auszufüllen gestaltet sich zwar schwierig, aber die Funktion von Anton hilft. Mir war nicht klar, dass man das Triggern eines Events "einfach" in eine Funktion auslagern kann. Damit funktioniert es. Man muss nur rausfinden, für welches Eingabefeld man was braucht. Ich kann schon sagen, dass für "Vor- und Nachname" und "Adresszusatz" das onKeyDown Event ausreicht. Für die "PLZ" hingegen muss zusätzlich das onChange Event ausgelöst werden.
Ausserdem ist es so, dass das zuletzt gefüllte Feld auch mit Events wieder geleert wird. Das habe ich aber schon gelöst, sofern das an der aktuellen Stelle nicht gerade Zufall ist. Die Seite selbst braucht auch teilweise manuelle Pausen.
Ich probiere mal weiter, wie das Ganze funktioniert. Mit dem Wissen um das Auslagern in eine Funktion bin auch ich einen großen Schritt weiter.
Ich melde mich später wieder.
Zwenn
Anzeige
AW: Webformular (DHL) ausfüllen [Lösung]
13.11.2019 09:48:29
Zwenn
Hallo Uwe,
die Seite ist wie gesagt etwas tricky, aber ich habe viel über das Auslösen von Events auf Internetseiten gelernt. Mit folgendem Makro kannst Du die Adressen eintragen:

Sub DHLOnlineFrankierung()
Dim browser As Object
Dim url As String
Dim urlVorne As String
Dim urlHinten As String
Dim knotenEingabeContainer As Object
Dim knotenAlleEingabeZeilen As Object
Dim knotenEineEingabeZeile As Object
Dim adressenDict As Object
Dim doppelEintrag As Byte
Dim indexEingabeAdressen As Byte
'Adressen Dictionary anlegen
Set adressenDict = CreateObject("Scripting.Dictionary")
'Adressen Dictionary füllen (Kann z.B. auch aus Tabelle erfolgen)
'Als Keys verwenden wir die Indizes der zu füllenden input-Tags
'aus dem Eingabe-Container der Seite. So können alle Elmente
'in einer Schleife durchlaufen werden, wobei fehlende Indizes
'über die Exists-Methode des Dictionaries übergangen werden
'Empfänger
adressenDict(3) = "Waisenmädchen Whisp"     'EmpfaengerVorNachname  (Pflichtfeld)
adressenDict(4) = "2. Etage"                'EmpfaengerAdresszusatz
adressenDict(5) = "13156"                   'EmpfaengerPLZ          (Pflichtfeld)
adressenDict(6) = "Berlin"                  'EmpfaengerWohnort      (Pflichtfeld)
adressenDict(7) = "Grabbeallee"             'EmpfaengerStrasse      (Pflichtfeld)
adressenDict(8) = "36"                      'EmpfaengerHausnummer   (Pflichtfeld)
adressenDict(10) = "whisp@schattenreich.de" 'EmpfaengerMail
'Absender
adressenDict(17) = "Regina Regenbogen"       'AbsenderVorNachname  (Pflichtfeld)
adressenDict(18) = ""                        'AbsenderAdresszusatz
adressenDict(19) = "23552"                   'AbsenderPLZ          (Pflichtfeld)
adressenDict(20) = "Lübeck"                  'AbsenderWohnort      (Pflichtfeld)
adressenDict(21) = "Schüsselbuden"           'AbsenderStrasse      (Pflichtfeld)
adressenDict(22) = "1"                       'AbsenderHausnummer   (Pflichtfeld)
adressenDict(24) = "regina@schattenreich.de" 'AbsenderMail         (Pflichtfeld)
'URL wegen Foren Zeilenumbruch zweigeteilt und zusammengesetzt
urlVorne = "https://www.dhl.de/de/privatkunden/pakete-versenden/"
urlHinten = "online-frankieren.html?type=ShipmentEditorProductSelection"
url = urlVorne & urlHinten
'Internet Explorer initialisieren, Sichtbarkeit festlegen,
'URL aufrufen und warten bis Seite vollständig geladen wurde
Set browser = CreateObject("internetexplorer.application")
browser.Visible = True
'browser.FullScreen = True
browser.navigate url
Do Until browser.ReadyState = 4: DoEvents: Loop
'Manuelle Pause, damit die Seite komplett zur Verfügung steht
Application.Wait (Now + TimeSerial(0, 0, 2))
'Vermutlich die Auswahl treffen, was gekauft werden soll
'Den Button klicken, um auf die Seite zur Eingabe der Adressen zu gelangen
If ButtonClick(browser.document, "Weiter zur Adresseingabe") = False Then
'Button konnte nicht geklickt werden
'Makro abbrechen
Exit Sub
End If
'Adressen eintragen
'Container mit allen Eingabeelementen holen
Set knotenEingabeContainer = browser.document. _
getElementsByClassName("dhl component mm_form-reciver-sender")(0)
If Not knotenEingabeContainer Is Nothing Then
'NodeCollection aus allen einzelnen Eingabeelementen des Containers bilden
Set knotenAlleEingabeZeilen = knotenEingabeContainer.getElementsByClassName("row")
'Daten aus Dictionary müssen 2x eingetragen werden, sonst bleiben Zeilen leer
For doppelEintrag = 0 To 1
'Alle Eingabeelemente durchlaufen
For indexEingabeAdressen = 0 To knotenAlleEingabeZeilen.Length - 1
'Prüfen ob das aktuelle Element im Dictionary vorhanden ist
'Prüfung: Dictionary Key = dem NodeCollection Index
If adressenDict.Exists(indexEingabeAdressen) Then
'Das input-Tag des aktuellen Eingabeelements sondieren
Set knotenEineEingabeZeile = knotenAlleEingabeZeilen(indexEingabeAdressen). _
getElementsByTagName("input")(0)
'Das onKeyDown Event auslösen
Call TriggerEvent(browser.document, knotenEineEingabeZeile, "onKeyDown")
'Dictionary Element in das aktuelle input Feld der Seite eintragen
knotenEineEingabeZeile.Value = adressenDict(indexEingabeAdressen)
End If
Next indexEingabeAdressen
Next doppelEintrag
Else
MsgBox "Es wurde kein Container für die Adresseingabe gefunden."
Exit Sub
End If
'Den Button klicken, um auf den Warenkorb zu gelangen
If ButtonClick(browser.document, "Weiter zum Warenkorb") = False Then
'Button konnte nicht geklickt werden
'Makro abbrechen
Exit Sub
End If
'Aufräumen
Set knotenEingabeContainer = Nothing
Set knotenAlleEingabeZeilen = Nothing
Set knotenEineEingabeZeile = Nothing
Set adressenDict = Nothing
End Sub

Private Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As  _
String)
Dim theEvent As Object
htmlElementWithEvent.Focus
Set theEvent = htmlDocument.createEvent("HTMLEvents")
theEvent.initEvent eventType, True, False
htmlElementWithEvent.dispatchEvent theEvent
End Sub

Private Function ButtonClick(htmlDocument As Object, buttonText As String) As Boolean
Dim knotenWeiterButton As Object
Dim weiter As Boolean
Set knotenWeiterButton = htmlDocument.getElementsByClassName("btn btn-primary btn-next")(0)
If Not knotenWeiterButton Is Nothing Then
knotenWeiterButton.Click
'Warten bis Seite für die nächste geladen wurde
Application.Wait (Now + TimeSerial(0, 0, 2))
weiter = True
Else
MsgBox "Der Button '" & buttonText & "' wurde nicht gefunden"
End If
'Aufräumen
Set knotenWeiterButton = Nothing
'Zurückgeben ob Button geklickt
'wurde oder nicht
ButtonClick = weiter
End Function

Viele Grüße,
Zwenn
Anzeige
AW: Webformular (DHL) ausfüllen [Lösung]
13.11.2019 16:17:40
UweVBA
Hallo Zwenn,
Hut ab! ein gutes Stück Arbeit.
Die Felder werden alle ausgefüllt, aber zum Schluß verschwinden die Einträge wieder, ohne den Button "Weiter zum Warenkorb" zu drücken.
DHL ist ein hartneckiger Verein, selbst im Herstellen von Internetseiten.
Gruß
UweVBA
AW: Webformular (DHL) ausfüllen [Lösung]
13.11.2019 16:49:35
Zwenn
Hallo Uwe,
bei mir läuft das genau so, wie es soll. Ich lande jedesmal auf der Warenkorb Seite, auf der alle Daten richtig ubernommen wurden. Ich kann mir da nun eigentlich nur einen Versionskonflikt vorstellen.
Auf was für einem System läuft das Ganze bei Dir? Ich nutze Windows 10 Pro mit Excel 2016. Der IE hat die Version 11.
Platziere in der Schleife vor und hinter folgender Zeile mal eine Pause:
knotenEineEingabeZeile.Value = adressenDict(indexEingabeAdressen)

So soll es aussehen:

Application.Wait (Now + TimeSerial(0, 0, 1))
knotenEineEingabeZeile.Value = adressenDict(indexEingabeAdressen)
Application.Wait (Now + TimeSerial(0, 0, 1))

So kannst Du die automatische Dateneingabe verfolgen. Wird der Platzhaltertext in den Eingabefeldern vor dem Eintragen der Werte nach oben verschoben und kleiner dargestellt? So, als wenn man die Felder von Hand befüllt? Wenn nicht, wird das Event nicht ausgelöst.
Viele Grüße,
Zwenn
Anzeige
AW: Webformular (DHL) ausfüllen [Lösung]
13.11.2019 17:39:14
UweVBA
Hallo Zwenn,
ich habe Window10 LTSB und IE11.
Der Platzhaltertext wird nach ober verschoben, das Feld ausgefüllt, ein Kreuz erscheint am Ende des Feldes - dann verschwindet der Text.
Das nächste Feld wird angesteuert und der Vorgang beginnt von vorn.
Gruss
UweVba
AW: Webformular (DHL) ausfüllen [Lösung]
14.11.2019 09:02:04
Zwenn
Hallo Uwe,
die ähnlichste mir zur Verfügung stehende Konfiguration ist Windows 10 Pro, IE 11 und Excel 2010. Auch auf dem System läuft das Makro genau so, wie es soll.
Ich habe etwas zu Window10 LTSB recherchiert. Du arbeitest also vermutlich in einem Unternehmen, dass diese abgespeckte Version bevorzugt, denn für Privatpersonen ist das nicht lizensierbar. Ich sehe keinen anderen Unterschied, als das Betriebssystem zwischen unseren Versuchen und sehe daher zwei Möglichkeiten:
1. Es liegt wirklich an Window10 LTSB. Ich habe gelesen, dass die Office Unterstützung nicht optimal ist und das Office 365 (2016) Pro ab Januar 2020 gar nicht mehr supportet wird. Da das Makro aber ausgeführt wird und die Events auch getriggert werden, kann ich mir das schwer als Grund vorstellen. Denn was nicht funktioniert, scheint ja erst im IE stattzufinden, bzw. eben nicht stattzufinden.
2. Der IE ist in einem "Zustand", in dem er rumzickt. Das würde mich nicht überraschen, denn das Teil ist manchmal eine echte Diva ;-) Du kannst versuchen, ob das Makro macht was es soll, wenn Du den Cache, die Coockies, usw. löschst. Dazu klickst Du im IE oben rechts auf das Zahnrad und im dann erscheinenden Menü auf den vorletzten Eintrag "Internetoptionen". Im sich öffnenden Dialog klickst Du im unteren Teil auf den Button "Löschen...". Dann öffnet sich ein weiterer Dialog in dem Du alle Haken setzt und auch dort auf den Button "Löschen" klickst. Den ersten Dialog noch mit "Ok" beenden und den IE schließen.
Zur Kontrolle kannst Du auch prüfen, ob das Makro auf anderen Rechnern läuft. Bei Kollegen, die ebenfalls Window10 LTSB/ LTSC nutzen, aber vor allem auch auf einem Rechner ohne die LTSB/ LTSC Version.
Mehr fällt mir dazu im Moment nicht ein. Bis Sonntag werde ich nun nur noch sporadisch ins Forum gucken. Also nicht wundern, wenn ich eventuelle Rückfragen nicht gleich beantworte.
Viele Grüße,
Zwenn
PS: Es klingt immer als halte ich alle anderen für dämlich, wenn ich solche Sachen wie das Löschen des Caches, usw. als Schritt für Schritt Anleitung erkläre. Ich mache das aber nur, um sicher zu stellen, dass solche Sachen direkt ohne Rückfragen umgesetzt werden können. Die meisten Leute in einem IT Forum wie diesem wissen um diese Dinge, das ist mir klar :-)
Anzeige
AW: Webformular (DHL) ausfüllen [Lösung]
14.11.2019 13:22:25
UweVBA
Hallo Zwenn,
Cache, Cookies gelöscht leider keine Änderung.
Anton hatte diesen Code einmal zur Verfügung gestellt (kann das Beispiel aber nicht mehr im Forum finden. Der Code läuft auch auf meinem Rechner einwandfrei.
Sub GLS()
Dim IEApp As Object, oAbsender As Object
Dim IEDocument As Object, oFeld As Object
Dim oEmpfaenger As Object
Dim VorUndZuName, StrasseMitHausnr, Hausnummer, Strassenname, Postleitzahl, Ort, Adresszusatz,  _
Emailadresse  As String
Dim Vorname As String
Set IEApp = CreateObject("InternetExplorer.Application")
IEApp.Visible = True
IEApp.FullScreen = True
IEApp.navigate "https://www.gls-one.de/parcel/"
Do: Loop Until IEApp.Busy = False
Set IEDocument = IEApp.Document
Do
On Error Resume Next
Set oAbsender = IEDocument.getElementById("consignor")
Set oEmpfaenger = IEDocument.getElementById("consignee")
Loop Until Err.Number = 0
On Error GoTo 0
IEDocument.getElementById("dimension.length").Value = "40"
aktualisieren IEDocument, IEDocument.getElementById("dimension.length")
IEDocument.getElementById("dimension.width").Value = "30"
aktualisieren IEDocument, IEDocument.getElementById("dimension.width")
IEDocument.getElementById("dimension.height").Value = "40"
aktualisieren IEDocument, IEDocument.getElementById("dimension.height")
IEDocument.getElementById("product-selection-homedelivery").Click
'Absenderdaten anpassen
For Each oFeld In oAbsender.getElementsByTagName("input")
Debug.Print oFeld.Name
Select Case LCase(oFeld.Name)
Case "name"
oFeld.Value = "Mustermann"
aktualisieren IEDocument, oFeld
Case "company"
oFeld.Value = "Fa. Mustermann"
aktualisieren IEDocument, oFeld
Case "street"
oFeld.Value = "Muster Weg"
aktualisieren IEDocument, oFeld
Case "housenumber"
oFeld.Value = "9"
aktualisieren IEDocument, oFeld
Case "zipcode"
oFeld.Value = "24847"
aktualisieren IEDocument, oFeld
Case "city"
oFeld.Value = "Musterstadt"
aktualisieren IEDocument, oFeld
Case "email"
oFeld.Value = "Muster.Mustermann@freenet.de"
aktualisieren IEDocument, oFeld
End Select
Next
'Empfaengerdaten anpassen
For Each oFeld In oEmpfaenger.getElementsByTagName("input")
Debug.Print oFeld.Name
Select Case LCase(oFeld.Name)
Case "name"
oFeld.Value = "Musterfrau"
aktualisieren IEDocument, oFeld
'      Case "company"
'        oFeld.Value = "Muster AG"
'        aktualisieren IEDocument, oFeld
Case "street"
oFeld.Value = "Strassenname"
aktualisieren IEDocument, oFeld
Case "housenumber"
oFeld.Value = "8"
aktualisieren IEDocument, oFeld
Case "zipcode"
oFeld.Value = "24587"
aktualisieren IEDocument, oFeld
Case "city"
oFeld.Value = "Ort"
aktualisieren IEDocument, oFeld
End Select
Next
End Sub

Function aktualisieren(oDoc, oFld)
Dim event_onChange As Object
oFld.Focus
Set event_onChange = oDoc.createEvent("HTMLEvents")
event_onChange.initEvent "change", True, False
oFld.dispatchEvent event_onChange
End Function

Anzeige
AW: Webformular (DHL) ausfüllen [Lösung]
17.11.2019 18:08:19
Zwenn
Hallo Uwe,
ich bin bisher nicht dazu gekommen mir das nochmal anzusehen. Hast Du mal versucht die Schleifendurchläufe für das Eintragen der Daten zu ändern? Bei mir müssen die Daten auf den Testrechnern 2x eingetragen werden, damit alles etehen bleiben. Du kannst es natürlich einfach mal mit 1x, 3x oder auch 4x versuchen. Das ist aber schon der Bereich Try & Error und hat nix mit Ursachenforschung zu tun.
Viele Grüße,
Zwenn
Anzeige
absolut nicht
16.11.2019 18:28:53
lupo1
PS: Es klingt immer als halte ich alle anderen für dämlich, wenn ich
Nein, alles wunderbar. Die meisten User hier (wie ich) werden davon keine Ahnung haben oder vor den gleichen Problemen stehen.
Danke für das Feedback :-) owT
17.11.2019 18:03:49
Zwenn
owT
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige