Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1740to1744
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Einloggen per VBA bei XING

Einloggen per VBA bei XING
27.02.2020 23:16:30
Torsten
Hallo an Alle,
Ich konnte mich mit VBA bereits auf vielen Internet-Anmelde-Seiten automatisch und erfolgreich anmelden. Das HowTo wurde auch hinreichend in Beiträgen beschrieben. Ich steuere die Input-Elemente z.b. mit getElements... an, fülle diese und klicke dann auf den entsprechenden Login-Button. Ja nach Browser kann im Browser-Dokument über "Element untersuchen" bzw. "Untersuchen" der Weg zum Element gefunden werden.
Das Login bei XING verweigert sich jedoch.
Ich kann die Eingabe-Felder per VBA füllen, allerdings führt der CLICK auf den Login-Button zu einer Fehlermeldung und dem Verschwinden der zuvor eingetragenen Login-Informationen. Wenn ich die Anmelde-Informationen per VBA Keystrokes (Application.SendKeys) an/in die Input-Felder "sende", so funktioniert alles perfekt. Nur gefällt mir dieser "Umweg" nicht, zumal dieser wegen des erforderlichen Timings und des zwingend erforderlichen Focuses (im Eng. gibt es leider keinen Genitiv ;) sehr fehleranfällig ist. Kein einziges Element auf der XING-Login-Seite hört auf eines der vielen unterstützten Key-Event.
Mir ist unklar, warum die Anmelde-Seite einen Unterschied macht, ob die Login-Daten über das Element direkt oder die Tastatur (bzw. simulierte Tatstatur) eingetragen werden.
Der folgende Test zeigt das Problem:
1. Tragen Sie ein Passwort über die Tatstatur ein
2. Überschreiben Sie dieses Passwort per VBA über das Element selbst
3. Klicken Sie mit der Maus auf das kleine Auge, um das Passwort im Klartext sich anzeigen zu lassen
4. Ihnen wird das zuvor unter (1) eingegeben Passwort angezeigt.
Die Login-Mechanik übernimmt folglich die über das Element direkt eingetragenen Werte nicht.
An dieser Stelle muss ich nun mein Excel-Experten- und WebSeiten-Wissen kräftig in Frage stellen und um Hilfe bitten.
Mit den besten Grüßen und der Hoffnung auf eine baldige Lösung,
Torsten

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einloggen per VBA bei XING
28.02.2020 01:17:29
Martin
Hallo Torsten,
sicherlich wird bei der Tastatureingabe in die HTML-Inputs irgendein Ereignis (vermutlich per JavaScript) ausgelöst. Das Stichwort müsste "FireEvent" lauten. Ich kann mich nicht mehr genau daran erinnern wie ein solches Ereignis ausgelöst werden kann, aber wenn du nach "VBA HTML FireEvent" im Archiv und/oder Google suchst, solltest du fündig werden.
Viele Grüße
Martin
AW: Einloggen per VBA bei XING
29.02.2020 20:46:10
Torsten
Hallo Martin,
Dank Dir für den Gedanken bzgl. eventuell anhängiger Events.
Ich habe die Seite im Browser untersucht (über Kontext-Menü des Browsers erreichbar , z.B. "Untersuchen").
An keinem der Elemente hängt ein Event.
Entsprechend habe ich alles Elemente des HTMLDocuments durch-iteriert und mir dessen Events angesehen. Es gibt nur onclick-Events. Allerdings nicht an den Eingabe-Feldern/Elementen.
Selbst wenn ich wüsste, wie ich ein EVENT abfeuer/trigger, so wüsste ich garnicht... welches :/
Hab ein schönes Wochenende,
Torsten
Anzeige
AW: Einloggen per VBA bei XING
28.02.2020 08:40:38
mumpel
Zeig uns Deinen Code, dann können wir schauen was geändert werden muss.
AW: Einloggen per VBA bei XING
28.02.2020 13:56:28
Torsten
Ok | Anbei der relevante Code:

Sub XING_Login(ByRef ie As SHDocVw.InternetExplorer, username As String, password As String)

' Dieser Code ist ein Beispiel, um den Login-Prozess auf der XING Seite auf Nachfrage
' mit VBA SourceCode zu erklären
' Für einen sicheren Ablauf der Routine wären noch Fehlerbehandlungen erforderlich,
' die für das eigentliche Problem jedoch nicht relevant sind und den Code nur schwieriger
' lesbar gestalten würden
Dim document_XING_Login As HTMLDocument              ' das HTMLDocument zum Einloggen
Dim any_Collection As IHTMLElementCollection         ' eine Sammlung von Elementen
Dim any_Element As IHTMLElement                      ' irgendein Element
Dim inputField_Username As IHTMLElement              ' das Input-Element für den Usernamen
Dim inputField_Password As IHTMLElement              ' das Input-ELement für das Passwort
Dim button_Login As IHTMLElement                     ' die Schaltfläche zum Einloggen

' => Login-Seite aufrufen
' ============================================

' Zur Login-Seite navigieren
ie.Navigate "login.xing.com"

' Warten, bis die Seite geladen wurde
waitForReadiness ie

' Document übernehmen
Set document_XING_Login = ie.document

' => Elemente SUCHEN !!!
' ============================================

' Auf der Login-Seite von XING sind ID oder ClassName vieler Element nicht verfügbar,
' nicht statisch bzw. eindeutig.
' Entsprechend muss gesucht werden, weil ein gezielter, eideutiger und immer wieder
' funktionierender Zugriff nicht möglich ist.
' Beispiel:
' Der ClassName vom Input-Element für den Usernamen lautet
' "malt-input-Input-input-eb6b6d2b malt-input-Input-m-5119b60a malt-input-_
' Input-xdl-4238cb54"
' Die Zahlenwerte im Classname ändern sich über die Zeit und der Sub-String "input" findet
' sich auch in anderen Classnames wieder.
' Das Suchen über die zum Glück (noch statischen) Attribute bzw.
' Schaltflächen-Bezeichnungen ist aktuell zielführender.

' => Eingabe-Felder suchen
' ============================================

' Alle InputFields einsammeln
Set any_Collection = document_XING_Login.getElementsByTagName("input")

' Nach den beiden erforderlichen InputFields suchen
For Each any_Element In any_Collection
Select Case any_Element.getAttribute("name")
Case "username": Set inputField_Username = any_Element
Case "password": Set inputField_Password = any_Element
End Select
Next any_Element

' => Schaltfläche suchen
' ============================================

' Alle Schaltflächen einsammeln
Set any_Collection = document_XING_Login.getElementsByTagName("button")

' Nach der erforderlichen Schaltfläche suchen
For Each any_Element In any_Collection
If LCase(any_Element.innerText) Like "einloggen" Then
Set button_Login = any_Element
Exit For
End If
Next any_Element

' => Einloggen
' ============================================
If Not inputField_Username Is Nothing And _
Not inputField_Password Is Nothing And _
Not button_Login Is Nothing Then

' Alle Login-Elemente gefunden
' Username und Passwort setzen
inputField_Username.Value = username
inputField_Password.Value = password

' Den Login-Button clicken
button_Login.Click

' ACHTUNG
' Dieser CLICK führt auch manuell ausgeführt zum selbigen Ergebnis.
' Die eingetragenen Werte in den InputField verschwinden und es
' erscheint eine Fehlermeldung (was bei fehlenden Login-Daten auch
' verständlich ist)
' Entweder müssen "username & password" anders gesetzt oder
' ein Event muss danach bzw. während der Eingabe aktiviert werden.
' Leider kann ich keine Events an den Elemente finden und eine Suche
' im ganzen Dokument zeigt nur definierte onClick-Events ... allerdings
' nicht an den InputFields.
' ... und an dieser STELLE komme ich nun nicht weiter
Else

' ERROR
End If
End Sub

Anzeige
AW: Einloggen per VBA bei XING
29.02.2020 07:07:30
mumpel
Hast Du es schon mal mit "Einloggen" versucht, also Groß. und Kleinschreibung beachten?
Nachtrag
29.02.2020 07:19:23
mumpel
Was bitte ist "waitForReadiness"? Das ist in Deinem Beispielcode nicht dabei, wird aber gebraucht wenn wir testen möchten.
AW: Nachtrag
29.02.2020 12:32:09
Torsten
Hallo "Mumpel",
vielen Dank für Deine Mühe. Allerdings bist Du aktuell auf Nebenschauplätzen unterwegs.
1. ... mit Einloggen versuchen ...
Im Ergebnis einer LCASE-Anweisung auf Großbuchstaben zu testen, wird immer ein FALSE liefern. Hätte ich aber aufgrund eines solchen Fehlers die Schaltfläche nicht gefunden, wäre das aufgefallen.
Ich habe kein Problem damit, die Elemente zur Eingabe der Werte (InputFields) und zum Anklicken (Button) zu finden, sondern damit, dass die Werte von den InputFields nach der EIngabe zwar angezeigt aber beim Klick nicht verarbeitet/verwendet werden.
2. ... waitForRediness ...
Beim Automatisieren eines Browsers muss man darauf achten, dass nach dem NAVIGATE die Seite geladen wurde, bevor in weiteren Schritten auf diese zugegriffen wird. Das nachfolgende Vorgehen führt jedoch nie zu einem sicheren Ergebnis und wurde in vielen Beiträgen schon diskutiert.

While IE.Busy Or _
IE.ReadyState  READYSTATE_COMPLETE Or _
IE.document.ReadyState  READYSTATE_COMPLETE
DoEvents
Wend

Oft ist es zielführender, auf ein spezielles Element im HTMLDocument zu warten. In unserem Beispiel wäre es z.B. eine Schaltfläche mit der Beschriftung "Einloggen".
In meiner Wait-Routine warte ich
a. auf die erwartete URL (welche nicht zwingend die angesteuerte URL wg. Weiterleitung sein muss,
b. auf ein definiertes Element und prüfe dieses gegebenenfalls auf seine Eigenschaften ab und
c. warte nur eine vorgegeben Zeit, sonst Timeout + ErrorEvent.
Der Vorteil dieses Vorgehen ist, dass die Seite wirklich geladen ist und man nicht auf die unsichere Methode des IE's vertrauen muss. Der Nachteil besteht darin, dass für jede Seite eine eigene "waitForSomething"-Definition hinterlegt sein muss. Das Warten auf ETWAS kann in einer allgemeinen Funktion definiert werden, deren Parameter jedoch Seiten-typisch sein müssen. Hier würde ich jedoch ein anderes Thema aufmachen, was ich im Interesse meines Anliegens vorerst gern vermeiden möchte (zumal es dafür viele Beiträge im Netz zu finden gibt, was hingegen auf mein Problem nicht zutrifft).
Diese Routine hat aber auch nicht mit meinem Anliegen zu tun. Im Zweifel kann durch einen simplen Breakpoint im Debug-Mode das WARTEN selbst veranlasst und das erfolgte Laden der richtigen Seite im IE geprüft werden.
Mich beschäftigt aktuell alleinig das Problem, warum nach dem KLICK (den ich auch manuell im IE tätigen kann) die Werte aus den Feldern username und password nicht zur Anwendung kommen.
Um das Code-Beispiel zur Beschreibung meines Anliegens nicht zu kompliziert zu machen, habe ich diese Routine nur erwähnt, nicht aber mitgeliefert.
Ich bin überzeugt, dass derjenige, welcher mir an dieser Stelle weiterhelfen kann, diese Methode und deren Anliegen versteht. Der Hinweis auf diese Wait-Routine soll alleinig nur zeigen, dass auf die Verfügbarkeit des HTMLDocuments gewartet wurde.
Nochmals vielen Dank und mit den besten Wünschen für das Wochenende,
Torsten
Anzeige
AW: Nachtrag
29.02.2020 18:12:03
mumpel
Ich bekomme bei "waitForRediness" eine Fehlermeldung, da "waitForRediness" nicht deklariert ist.

57 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige