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

Forumthread: Formularfelder auf Webseite ausfüllen

Formularfelder auf Webseite ausfüllen
29.08.2018 14:32:31
UweVBA
Ein höfliches Hallo,
und ein Problem.
Ich möchte auf einer Webseite Formularfelder ausfüllen. Die ersten Felder haben ID und das Ausfüllen ist kein Problem.
Dann folgt der Vor- und Nachname und weitere Felder ohne ID, die ich nicht ansprechen kann.
Kann jemand helfen?
Sub GLS()
Dim IEApp As Object
Dim IEDocument As Object
Dim strURL 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
Loop Until IEDocument.readyState  4
IEApp.Document.readyState = "complete"
IEDocument.getElementById("dimension.length").Value = "40"
IEDocument.getElementById("dimension.width").Value = "30"
IEDocument.getElementById("dimension.height").Value = "40"
IEDocument.getElementById("product-selection-homedelivery").Click
End Sub

Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Formularfelder auf Webseite ausfüllen
29.08.2018 14:42:22
ChrisL
Hi
Wenn es keine ID gibt, warum nicht den Namen verwenden...
getElementsByName
cu
Chris
AW: Formularfelder auf Webseite ausfüllen
29.08.2018 15:12:04
UweVBA
Hallo,
also bei mir läuft das nicht.
das Feld heißt zwar - name - es kommt aber die Fehlermeldung - Objekt unterstützt diese Eigenschaft usw. -
Und das funktioniert bei dir?
IEDocument.getElementsByName("name").Value = "Mustermann"
Anzeige
getElementsByName - offen
29.08.2018 16:33:59
ChrisL
Hi
Nein, wäre irgendwie logisch gewesen, aber geht bei mir auch nicht ;)
Weil es mehrere identische Namen je Sektion gibt, würde ich erst den Abschnitt identifizieren.
      Set varArticle = IEDocument.getElementById("consignor")
varArticle.getElementsByName("name").Value = "Mustermann"
Zeile 2 funktioniert aber trotzdem nicht und mir läuft gerade die Zeit davon. (ich frage mich, ob JS mit isDisabled('name') Probleme macht)
Ich lasse die Frage offen.
cu
Chris
Anzeige
mit TagName gehts
30.08.2018 08:47:51
ChrisL
Hi
Keine Ahnung warum der Name nicht direkt angesprochen werden kann. Aber so scheint es zu funktionieren...
Set objArticle = IEDocument.getElementById("consignor")
objArticle.getElementsByTagName("Input")(0).Value = "blabla"
cu
Chris
AW: mit TagName gehts
30.08.2018 13:29:10
UweVBA
Hallo ChrisL,
Dank und Anerkennung für den Hinweis. Passt!
Jetzt kann ich auch die nächsten Felder ansprechen und komme langsam hinter die Geheimnisse des Programmierers.
Nochmals Dank und
Gruss
UweVBA
Anzeige
AW: mit TagName gehts
30.08.2018 16:05:33
UweVBA
Hallo,
die Eintragung funktioniert einwandfrei.
Aber! wenn ich den Button -Warenkorb- drücke kommt auf der seite die Meldung -es ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Angaben-
Die Angaben sind zwar in den Feldern, werden aber nicht erkannt.
Was nun?
Gruss
UweVBA
Anzeige
wieder offen
30.08.2018 17:14:29
ChrisL
Hi Uwe
Vielleicht irre ich mich komplett, darum lasse ich die Frage mal vorsorglich offen.
Ich hatte schon beim ersten Problem den Verdacht, dass die automatisierte Eingabe bewusst behindert wird. Vielleicht deswegen...
https://gls-group.eu/DE/de/warensendung/versandsysteme
Man könnte den Code mal unterbrechen, manuell in die Textbox klicken, dann weiter per Makro. Falls es funktioniert, versuchen den Klick zu simulieren. Es ginge darum die Differenz zwischen manueller und maschineller Eingabe zu finden.
Oder im Browser-Inspektor/Webkonsole mal ganz genau die Schritte verfolgen.
cu
Chris
Anzeige
Formularfelder auf Webseite ausfüllen
02.09.2018 14:48:03
Anton
Hallo UweVBA,
probier's hiermit:
Code in Zwischenablage:

Option Explicit
Sub GLS()
  Dim IEApp As Object, oAbsender As Object  
  Dim IEDocument As Object, oFeld As Object    
  Dim oEmpfaenger As Object  
  Set IEApp = CreateObject("InternetExplorer.Application")  
  IEApp.Visible = 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 = "Max Mustermann"
        aktualisieren IEDocument, oFeld
      Case "company"
        oFeld.Value = "anpassen"
        aktualisieren IEDocument, oFeld
      Case "street"
        oFeld.Value = "anpassen"
        aktualisieren IEDocument, oFeld
      Case "housenumber"
        oFeld.Value = "1"
        aktualisieren IEDocument, oFeld
      Case "zipcode"
        oFeld.Value = "12345"
        aktualisieren IEDocument, oFeld
      Case "city"
        oFeld.Value = "Berlin"
        aktualisieren IEDocument, oFeld
      Case "email"
        oFeld.Value = "MaxMustermann@web.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 = "Max Mustermann"
        aktualisieren IEDocument, oFeld
      Case "company"
        oFeld.Value = "anpassen"
        aktualisieren IEDocument, oFeld
      Case "street"
        oFeld.Value = "anpassen"
        aktualisieren IEDocument, oFeld
      Case "housenumber"
        oFeld.Value = "1"
        aktualisieren IEDocument, oFeld
      Case "zipcode"
        oFeld.Value = "12345"
        aktualisieren IEDocument, oFeld
      Case "city"
        oFeld.Value = "Berlin"
        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  

mfg Anton
Anzeige
AW: Formularfelder auf Webseite ausfüllen
02.09.2018 17:15:42
UweVBA
Und auch hier....
Ehre wem Ehre gebührt! Volltreffer.
Das hätte ich nicht hinbekommen.
Einen wirklich großen Dank an Anton.
Gruss
Uwe VBA
AW: Formularfelder auf Webseite ausfüllen
02.09.2018 18:44:06
ChrisL
Hi Anton
Respekt, auch von mir.
Woran lags? Sehe ich richtig, dass du je Feld ein Change-Event triggerst? Weisst du zufällig wofür es da ist?
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 

cu
Chris
Anzeige
AW: Formularfelder auf Webseite ausfüllen
03.09.2018 15:35:55
Anton
Hallo Chris,
Woran lags?...
ich vermute, dass Javascript auf der Seite die Tastatureingaben überwacht (keydown,keypress was auch immer).
Da wir aber die Values der Felder per VBA geändert haben, hat das Script die Änderung nicht mitbekommen, dachte ich mir.
Deswegen habe ich probiert die Änderung der Felder mit change vorzugaukeln, was auch zum Erfolg geführt hat.
mfg Anton
Anzeige
AW: Formularfelder auf Webseite ausfüllen
03.09.2018 15:45:23
ChrisL
Hi Anton
Danke für die Erklärung.
cu
Chris
AW: Formularfelder auf Webseite ausfüllen
06.09.2018 14:31:06
UweVBA
Hallo,
und nach nächtelangen probieren hab ich den Button "Warenkorb" betätigt.
Set IEDocument = IEApp.Document
Set htmlColl = IEDocument.getElementsByTagName("button")
For Each htmlInput In htmlColl
If Trim(htmlInput.Type) = "submit" Then
htmlInput.Click
Exit For
End If
Next htmlInput
Nicht das das große Programmieren aber immerhin!
Gruss
Uwe VBA
PS: habe eine neue Frage mit der DHL-Seite eingestellt.
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Formularfelder auf Webseiten automatisch ausfüllen


Schritt-für-Schritt-Anleitung

  1. Internet Explorer öffnen: Verwende den folgenden VBA-Code, um eine Instanz des Internet Explorers zu erstellen und die gewünschte Webseite zu laden:

    Sub GLS()
       Dim IEApp As Object
       Set IEApp = CreateObject("InternetExplorer.Application")
       IEApp.Visible = True
       IEApp.navigate "https://www.gls-one.de/parcel/"
       Do: Loop Until IEApp.Busy = False
    End Sub
  2. Warten auf die Seite: Stelle sicher, dass die Seite vollständig geladen ist:

    Do: Loop Until IEApp.Document.readyState = "complete"
  3. Formularfelder ausfüllen: Wenn die Felder IDs haben, kannst du sie direkt ansprechen:

    IEApp.Document.getElementById("dimension.length").Value = "40"
  4. Felder ohne ID ansprechen: Verwende die Methode getElementsByName oder getElementsByTagName, um die Felder zu finden:

    Dim oFeld As Object
    For Each oFeld In IEApp.Document.getElementsByName("name")
       oFeld.Value = "Max Mustermann"
    Next oFeld
  5. Button klicken: Um einen Button zu klicken, kannst du die Methode Click verwenden:

    Dim htmlColl As Object
    Set htmlColl = IEApp.Document.getElementsByTagName("button")
    For Each htmlInput In htmlColl
       If Trim(htmlInput.Type) = "submit" Then
           htmlInput.Click
           Exit For
       End If
    Next htmlInput

Häufige Fehler und Lösungen

  • Fehler: "Objekt unterstützt diese Eigenschaft nicht": Dies kann passieren, wenn du versuchst, ein Element mit getElementsByName zu identifizieren, das möglicherweise nicht existiert. Stelle sicher, dass der Name korrekt ist und dass es nicht mehrere Elemente mit demselben Namen gibt.

  • Lösung: Nutze getElementsByTagName, um das gewünschte Feld zu finden und sicherzustellen, dass du das richtige Element bearbeitest:

    Set objArticle = IEDocument.getElementById("consignor")
    objArticle.getElementsByTagName("Input")(0).Value = "blabla"

Alternative Methoden

  • JavaScript verwenden: Du kannst auch JavaScript direkt auf der Webseite ausführen, um Formularfelder auszufüllen:

    IEApp.Document.parentWindow.execScript "document.getElementById('name').value='Max Mustermann';"
  • Selenium verwenden: Eine weitere Möglichkeit ist die Verwendung von Selenium für VBA, um mehr Kontrolle über die Webseite zu erhalten.


Praktische Beispiele

Hier ist ein Beispiel, wie du mehrere Felder ausfüllen kannst:

For Each oFeld In IEDocument.getElementsByTagName("input")
    Select Case LCase(oFeld.Name)
        Case "name"
            oFeld.Value = "Max Mustermann"
        Case "email"
            oFeld.Value = "MaxMustermann@web.de"
    End Select
Next oFeld

Tipps für Profis

  • Event-Trigger: Wenn die Webseite auf Änderungen in den Feldern reagiert, kann es hilfreich sein, ein Change-Event zu triggern:

    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
  • Debugging: Verwende Debug.Print, um den Namen jedes Feldes zu überprüfen, während du durch die Felder iterierst. So kannst du sicherstellen, dass du die richtigen Felder bearbeitest.


FAQ: Häufige Fragen

1. Warum kann ich bestimmte Felder nicht ansprechen?
Das kann daran liegen, dass die Elemente keine IDs haben oder dass JavaScript auf der Webseite die Eingaben überwacht. Versuche, die Elemente über getElementsByTagName oder getElementsByName zu finden.

2. Wie kann ich sicherstellen, dass die Eingaben erkannt werden?
Manchmal muss ein Change-Event ausgelöst werden, nachdem du die Werte in die Felder eingegeben hast. Verwende dafür die aktualisieren Funktion.

3. Funktioniert dieser Code auch in anderen Browsern?
Der hier gezeigte Code funktioniert speziell mit Internet Explorer. Für andere Browser wie Chrome oder Firefox musst du möglicherweise Selenium verwenden oder den Code anpassen.

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