Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1804to1808
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

Href ... auf IE Seite klicken

Href ... auf IE Seite klicken
11.01.2021 11:34:16
Jürgen
Hallo Zusammen,
ich brühte hier schon einiege Zeit an folgendem Problem. Ich möchte gerne ein paar Eingaben in einer Webanwednung vornehmen.
Mein erster Gedanke war es, das Ganze so zu steuern, als sitze ich selbst davor. Das funktioniert zwar, aber nun brauche ich doch a) eine Rückmeldung der Webanwendung und b) muss ich die eine oder andere Schaltfläche klicken.
HTML und JavaScript Wissen habe ich leider so gut wie gar keins!
Ich habe hier im Forum schon einiges durchgeforstet, komme aber leider nicht wirklich weiter.
Leider ist die Webanwendung "nicht öffentlich" aber vielleicht könnt Ihr mir trotzdem helfen.
Im Wesentlichen sind es nur 6 oder 7 Schritte, die sich fast immer gleichen.
Diese Infos habe ich über den Debugger von IE bekommen.
Das ist eine Schaltfläche, die geklickt werden soll.
&lta href="javascript:void(javaSubmit('a6ex5y1rxy2mr', 'null'));" onFocus="onFieldFocus(this);"  _
onBlur="onFieldBlur(this);"&gtBeispiel&lt/a&gt
Dann nochmal eine Schaltfläche
&lta class="icon-text-btn" onfocus="onFieldFocus(this);" onblur="onFieldBlur(this);" href=" _
javascript:void(javaSubmit('a6ex6uegz9esq', 'null'));"&gt&ltspan class="icon-add"&gt&lt/span&gt
Hinzufügen ...
&lt/a&gt
Dann in ein Feld Daten aus einer Excel-Tabelle eintragen und dann die Eingaben bestätigen.
Hier noch ein paar weitere Infos aus dem Debugger:
&ltselect name="a6ex6uyhteql2" id="aBeispiel_gruppeTypQuelle" onfocus="onFieldFocus(this);"  _
onblur="onFieldBlur(this);" size="0"&gt
&ltscript type="text/javascript"&gt&lt!--
initAsyncHandler('aBeispiel_gruppeTypQuelle', 'change', 'a6ex6uyhtm0ed', true, null, true);
// --&gt&lt/script&gt
&ltoption value="-9192939" selected=""&gtBitte auswählen...&lt/option&gt&ltoption value="1"& _
gtGruppe1&lt/option&gt&ltoption value="2"&gtGruppe2&lt/option&gt&ltoption value="4"&gtGruppe3&lt/option&gt&lt/select&gt
&ltselect name="a6ex6uyhtxe48" id="aBeispiel_artQuelle" onfocus="onFieldFocus(this);" onblur=" _
onFieldBlur(this);" size="0"&gt
&ltoption value="-9192939" selected=""&gtBitte auswählen...&lt/option&gt&ltoption value="8"& _
gtArt1&lt/option&gt&ltoption value="16"&gtArt2&lt/option&gt&ltoption value="1024"&gtArt3&lt/option&gt&ltoption value="2048"&gtArt4&lt/option&gt&ltoption value="8192"&gtArt5&lt/option&lt/select&gt
&lta class="icon-btn form-input" onfocus="onFieldFocus(this);" onblur="onFieldBlur(this);" href= _
"javascript:void(javaSubmit('a6ex6uyhv3s23', 'null'));"&gt
&ltspan class="icon-search-small"&gt&lt/span&gt
&lt/a&gt
Vermutlich reicht mir ein kleiner Schubs in die richtige Richtung.
Ziel soll es sein.
Die Klicks automatisiert durchzuführen.
Die Daten einzutragen
Die Daten zu bestägigen
Und dann wieder von vorn.
Wie immer, schon vorab besten Dank für Ideen Beipiele und Vorschläge.
Viele Grüße
Jürgen

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Href ... auf IE Seite klicken
11.01.2021 13:23:12
ChrisL
Hi Jürgen
...das Ganze so zu steuern, als sitze ich selbst davor. Das funktioniert zwar...
Wie?
Ein Schubs könnte sein, nach Beiträgen von "Zwenn" im Forumsarchiv zu suchen. Er hat in der Vergangenheit öfters umfangreiche Beiträge zum Thema geschrieben.
Ich möchte dich nicht entmutigen, aber das Thema (insbesondere in Kombi mit JS) ist ziemlich komplex. Ohne Zugriff auf die Webseite wird dich kaum jemand unterstützen können. Deine gezeigten Codeschnipsel bringen nicht viel. Eine detaillierte Analyse (Rückverfolgung von Events etc.) der Webseite wäre sehr zeitintensiv.
Selbst mit viel Know-How und Zeit ist es ungewiss, ob eine "Fernsteuerung" gelingen würde. Sieht mir so aus als ob die Namen (z.B. 'a6ex5y1rxy2mr') dynamisch vergeben werden, was evtl. dazu dient eine "Fernsteuerung" bewusst zu verhindern/erschweren.
Vielleicht bietet deine Webseite eine Schnittstelle (API - Application Programming Interface), was eine einfache "Fernsteuerung" erlaubt.
Ansonsten könnte man eine professionelle RPA-Software (Robotic Process Automation) einsetzen, was jedoch mit hohen Initialaufwänden und wiederkehrenden Lizenzkosten verbunden ist.
cu
Chris
Anzeige
AW: Href ... auf IE Seite klicken
11.01.2021 16:00:23
Zwenn
Hallo Jürgen,
dann schreibe ich mal direkt unter Chris' Antwort. Er hat schon die richtigen Punkte der Einstiegshürde von Außen genannt. Ich greife den Faden mal auf.
Eine Seite steuern, als sitze man davor
Unter Umständen ist das nicht notwendig. Schau Dir mal die URL an, nachdem Du manuell Daten eingetragen und abgesendet hast. Tauchen da "Deine Daten" auf, abgetrennt durch ein Fragezeichen (?) und anschließend durch Kaufmanns-Und (&)?
Beispiel:
Du suchst etwas auf Amazon. Ferngesteuert könntest Du die Seite aufrufen, dann etwas in das Suchfeld eintragen und den Suchen-Button anklicken. So als sitzt Du selbst vor der Seite. Das kannst Du Dir aber komplett sparen, weil sich die Seite mit den Suchergebnissen auch direkt aufrufen lässt, indem die richtigen Parameter an die URL gehängt werden. Dabei wird die Parameterliste mit einem Fragezeichen (?) eingeleitet und weitere Parameter werden durch das Kaufmanns-Und (&) unterteilt.
Angenommen Du suchst nach Staubsauger, dann sieht die URL der ersten Suchergbnisseite so aus:
https://www.amazon.de/s?k=Staubsauger&__mk_de_DE=ÅMŎÕÑ&ref=nb_sb_noss_2
Sieht sehr kryptisch aus, ist aber eher harmlos. Spalten wir das Ganze mal auf:
https://www.amazon.de/s
?k=Staubsauger
&__mk_de_DE=ÅMŎÕÑ
&ref=nb_sb_noss_2
Offensichtlich ist k der Parameter, der den Suchterm beinhaltet. An dieser Stelle sei schon verraten, die anderen beiden Parameter werden zur Anzeige der Suchergebnisse gar nicht benötigt. Wenn man also https://www.amazon.de/s?k=Staubsauger aufruft, wird das gleiche angezeigt. Wofür die anderen beiden Parameter sind weiß ich im Moment auch nicht. Aber das Prinzip sollte klar sein. Achja, die Reihenfolge der Parameter ist egal. Hauptsache die Liste wird mit dem Fragezeichen eingeleitet.
Diese Methode, Daten an den Server über die URL zu übergeben, nennt sich Get. Neben Get gibt es noch Post. Bei Post sind die übergebenen Daten für den Anwender unsichtbar. Sie werden im Header des http-Aufrufs übergeben. Auch das kann man ggf. Fernsteuern. Aber wie Chris schon geschrieben hat, wird das eher nix, wenn man die Seite nicht aufrufen kann, um verschiedene Einstellungen nachzusehen, damit man weiß, was man im VBA-Makro verwenden muss, damit es klappt.
Deine HTML-Schnipsel
Das sind Anker-Tags, die heißen in HTML einfach a und stehen für einen Hyperlink. Hinter dem href steht die aufzurufende Quelle. Jeder a-Tag hat ein "eingebautes" Click-Event. Das bedeutet, er ist automatisch mit der Maus anklickbar und weiß, was er dann machen soll. In Deinem Fall sind JS-Events für href eingetragen. Wenn Du Deine Automatisierung über den IE vornimmst, kannst Du die Links einfach "anklicken". Der IE übernimmt dann automatisch die Verarbeitung der JS.
In Deinem weiteren geposteten Code ist eine Combobox enthalten. Wenn Du in solchen Dropdowns Werte auswählen musst, kann es sein, dass das Change-Event ausgelöst werden muss, um die neue Auswahl des Dropdowns für die Seite "sichtbar" zu machen. Ich kann Dir ggf. erklären, wie das geht. Solltest Du es selber rausfinden wollen wirst Du auf FireEvent stoßen. Verfolge diesen Ansatz nicht, das ist veraltet und funktioniert auf den meisten Seiten heutzutage nicht mehr. Man muss über Dispatch und ein paar andere Sachen arbeiten.
Wie man auf die richtige Stelle einer Seite zugreift
Hier könnte ich Dir maximal allgemeine Informationen geben, die Dir so aber vermutlich wenig weiterhelfen. Um z.B. die von Dir gezeigten a-Tags auf der Seite gezielt anzusprechen, müsste man die Struktur der Seite kennen. Sprich, den gesamten HTML-Code.
Die Struktur selbst ist im DOM (Document Object Model) als Baum hinterlegt. Das DOM bietet Methoden, um auf gewünschte Baumknoten zuzugreifen und sie entsprechend ihrer Funktionen zu automatisieren. Du bist sicher schon über getElementByID(), getElementsByTagName(), getElementsByClassName(), usw. gestolpert.
Hier kommen wir wieder an einen Punkt, den Chris auch schon genannt hat:
Was hast Du bisher? Sprich, poste mal Deinen Makrostand.
Zusätzlich lade den HTML-Code der Seite als Datei hoch. Die Endung .htm ersetzt Du dabei einfach durch .txt und wir hoffen, dass es nicht mehr als (die hier im Forum maximal zulässigen) 300 KB sind.
Soweit erstmal. Viele Grüße,
Zwenn
Anzeige
AW: Href ... auf IE Seite klicken
11.01.2021 17:00:12
Jürgen
Hallo Ihr Beiden und Danke für die schnelle und umfangreiche Antwort.
Zu Chris Frage ...das Ganze so zu steuern, als sitze ich selbst davor. Das funktioniert zwar...
Wie?

Das habe ich mit GetCursorPos, und POINTAPI gelöst.
Zuerst zeichne ich die Positionen auf und danach werden die Schritt für Schritt abgearbeitet. Nur, wenn ich einen Datensatz eintrage, dieser aber nicht gefunden wird, würde der "Klickautomat" einfach weiter klicken. Und das könnte ggf. zu Problemen führen.
Und ich gebe dir Recht, scheint als brauche ich mehr als nur einen "Schubs" ;-)
@Zwenn:
Den kompletten HTML Code kann ich leider nicht posten. Die Anwendung ist eine Entwicklung meines AG. Ich habe immer wieder mit diesen Eingaben, oder Klickabläufen zu tun, und wollte das vereinfachen.
Im Grunde habe ich noch gar Nichts, ausser den o. g. Klickautomat.
Mir fehlt die Möglichkeit diese Schaltfläche anzuklicken. Du schreibst ...Wenn Du Deine Automatisierung über den IE vornimmst, kannst Du die Links einfach "anklicken".
Und genau hier hänge ich fest. Ich habe hier aus dem Forum schon ein paar Codeschnipsel gefunden, aber da wird immer folgendes getElementByID(), getElementsByTagName(), getElementsByClassName() benutzt. Aber das habe ich leider nicht.
Wie hier z. B. aus einem Beitrag von Mr. B aus 2013:
Sub insolvenz()
Dim IEApp As Object
Set IEApp = CreateObject("InternetExplorer.Application")
IEApp.Visible = True
IEApp.Navigate "https://www.insolvenzbekanntmachungen.de/cgi-bin/bl_suche.pl"
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Document.ReadyState = "complete"
IEApp.Document.getelementbyid("Datum1").Value = Date - 5
IEApp.Document.getelementbyid("Datum2").Value = Date
IEApp.Document.getelementbyid("Absenden").Click
Set IEApp = Nothing
End Sub  
Das o. g. kommt meiner Idee schon relativ nah.
Vielleicht habt Ihr noch eine Idee.
Ich schau mir mal den von der Seite an und versuche ihn hier zu posten.
Viele Grüße
Jürgen
Anzeige
AW: Href ... auf IE Seite klicken
11.01.2021 18:16:58
ChrisL
Hi Jürgen
Wenn es eine Entwicklung deines AG's ist, dann kontaktiere mal deine IT, einen Prozessmanager oder Business Analyst. Womöglich gibt es einfachere Varianten bzw. sinnvolle Ratschläge. (manchmal sind solche Webapplikation lediglich graphische Benutzeroberflächen GUI auf alten Host-Applikationen oder Datenbanken)
Falls Zwenn (anhand der noch ausstehenden Beispieldatei) nicht helfen kann bzw. wenn die Steuerelemente nicht angesprochen werden können, dann hätte ich noch folgende Idee:
Du bleibst bei deiner POINTAPI-Lösung, suchst dir aber zusätzlich einen Code, welcher den bereits offenen IE identifiziert und ausliest. Anhand eines Merkmals z.B. Text "Abbruch, es konnte nicht gespeichert werden" oder Fenstertitel "Fehler" steigst du bei Bedarf vorzeitig aus der Routine aus.
cu
Chris
Anzeige
AW: Href ... auf IE Seite klicken
12.01.2021 06:36:35
Jürgen
Guten Morgen Chris,
danke für deine Antwort. Meine IT ist total überlastet. Erst Recht, wenn es um die internen Anwendungen geht. Da wird eher weiterentwickelt als so einen "VBA Bastler" wie mir weiter zu helfen ;-/
Das mit dem Ausstieg, wenn sich am Fenster etwas ändert oder wenn in der Tabelle, die sich befüllt etwas nicht stimmt, habe ich auch schon nachedacht. Vermutlich wird das wohl der bessere Weg sein.
Das IE Fenster so öffnen das es immer die gleiche Größe hat und immer an der gleichen Stelle steht. Und beim Befüllen die Datentabelle nach den Werten im IE auslesen. Das probiere ich heute nochmal aus.
Viele Grüße
Jürgen
Anzeige
Einen Schritt weiter und zwei Fragen mehr...
12.01.2021 09:03:45
Jürgen
Hallo Zusammen,
ich habe die Frage nochmal auf offen gestellt, weil ich einen Schritt weiter gekokmmen bin und hierzu noch eine Frage habe.

Dim objAllLinks As Object
Set objAllLinks = appIE.document.getelementsbytagname("A")
Stop
For Each Hyperlink In objAllLinks
'Click über Innertext
'Debug.Print Hyperlink.Innertext & " - " & Hyperlink.href
If Hyperlink.Innertext = "Eintrag" Then
Hyperlink.Click
Set objAllLinks = Nothing
Exit For
End If
Next Hyperlink
Stop
Set objAllLinks = appIE.document.getelementsbytagname("A")
For Each Hyperlink In objAllLinks
'Click über Innertext
'Debug.Print Hyperlink.Innertext & " - " & Hyperlink.href
If Hyperlink.Innertext = " Hinzufügen ... " Then
Hyperlink.Click
Set objAllLinks = Nothing
Exit For
End If
Next Hyperlink

Frage 1:
Wie kann ich den Link mit dem Innertext "Eintrag" oder " Hinzufügen ... " direkt ansprechen?
Ich weiß ja dass die da sind und klickbar sind.
Alles immer wieder mit einer Schleife abzulaufen ist ja unsinnig, oder?
Frage 2:
Wenn ich objAllLinks nicht lösche und wieder neu definiere, kommt eine Fehlermeldung. Das Gleiche passiert wenn ich zwischen dem Aufruf und dem Suchen nach dem Link manuell in der Anwendung etwas klicke.
Warum ist das so?
Sorry für die blöden Fragen aber mit Objekten habe ich überhaupt keine Erfahrung. Ich fühle mich gerade wie bei meinen ersten VBA Schritten
Vorab schon besten Dank für Eure Hilfe.
Viele Grüße
Jürgen
Anzeige
AW: Einen Schritt weiter und zwei Fragen mehr...
12.01.2021 10:03:50
ChrisL
Hi Jürgen
Solange die Elemente keinen eindeutigen Namen oder ID besitzen, musst du m.E. den Weg über die Schleife gehen. Ist aus meiner Sicht aber nicht weiter schlimm.
Alternativ hangelst du dich via DOM durch die Baumstruktur.
Zu 2. Ich kann es mir nur so erklären (reine Vermutung), dass sich das Dokument nach dem Click neu aufbaut/aktualisiert und dadurch die zuvor identifizierten Hyperlinks nicht mehr vorhanden sind. Auch wenn das Doc vermeintlich noch gleich aussieht, sind die Objekte durch die Aktualisierung ersetzt worden.
cu
Chris
AW: Einen Schritt weiter und zwei Fragen mehr...
12.01.2021 12:12:56
Zwenn
Hallo Jürgen,
ergänzend zu Chris Ausführungen folgendes.
zu 1:
Die Methoden getElementsByTagName() und getElementsByClassName() erzeugen Node Collections, während getElementByID() ein "einfaches" Objekt erzeugt. Mit dem Ergebnis von getElementByID() kann also direkt weiter gearbeitet werden, was dem von Dir gewünschten direkten Zugriff entspricht. Wie Chris aber schon geschrieben hat, scheinen Deine Links keine IDs zu haben. Jedenfalls nicht die beiden Beispiellinks aus Deinem Ausgangsposting.
Der zweite Link hat aber eine Klasse, nämlich class="icon-text-btn". Du kannst also eine Node Collection bilden, die alle HTML-Elemente mit genau dieser Klasse enthält:
Set nodeIconTextButton = appIE.document.getElementsByClassName("icon-text-btn")
Um festzustellen wieviele Elemente so eine Node Collection enthält, kannst Du anschließend die Eigenschaft Length der Node Collection abfragen:
MsgBox nodeIconTextButton.Length
Die Node Collection wird in jedem Fall gebildet und kann deshalb auch 0 Elemente enthalten, wenn es kein HTML-Element mit der angegebenen Klasse gab. Die Elemente einer Node Collection haben Indizes, wie sie von Arrays bekannt sind. Das erste Element hat dabei immer den Index 0. Über die Indizes kannst Du direkt auf beliebige Elemente zugreifen.
Hat die Node Collection also nur 1 Element, kannst Du es so verwenden:
nodeIconTextButton(0).Click
Wenn Du weißt, was Du machst, kannst Du das Zwischenspeichern in einer Variable weglassen:
appIE.document.getElementsByClassName("icon-text-btn")(0).Click
Durch den direkten Zugriff auf ein bestimmtes Element der Node Collection bei Zuweisung an eine Variable verfällt die Node Collection anschließend und es steht direkt das entsprechende HTML-Element zur Verfügung. Analog zu getElementByID(). Du kannst das Ganze also auch so aufschreiben:

Set nodeIconTextButton = appIE.document.getElementsByClassName("icon-text-btn")(0)
nodeIconTextButton.Click
Es gibt noch mehr zu HTML-Elementen ansich zu sagen und es gibt auch noch andere Möglichkeiten direkt auf bestimmte HTML-Elemente zuzugreifen. Z.B. über Attribute oder mit den Methoden QuerySelector() bzw. QuerySelectorAll(). Auch Fehlerbehandlung ist bei Web Scraping ein Thema. Ich kann hier aber schlecht einen ganzen "Lehrgang" zu den Grundlagen des Web Scraping schreiben. Das ist genau der Punkt, wegen dem ich in meiner ersten Antwort schrieb, ohne den HTML-Code ist Hilfe schwierig.
zu 2:
Chris hat genau das geschrieben, was ich auch denke. Denn sobald ein Link angeklickt wird, passiert etwas mit dem Dokument. Alles, was auf der Seite verändert wird, ist in vorher gespeicherten Variablen nicht verfügbar. Zusätzlich ist es so, dass die Reaktion auf den Klick auf einen Link auch eine Reaktionszeit benötigt. Deshalb ist es oft notwendig kleine Pausen einzubauen, wenn ein Link angeklickt wurde. Selbst wenn dadurch nur ein weiteres Steuerelement auf der Seite selbst durch JS generiert wird.
Du kannst einen Blick auf eine Lösung von mir auf StackOverflow werfen, in der ich das anwende. Es gibt viele Kommentare. Trotzdem ist das Ganze ohne Vorwissen einigermaßen komplex:
https://stackoverflow.com/questions/63294113/automate-ie-via-excel-to-fill-in-a-dropdown-and-continue/63299608#63299608
Hier ist noch eine weitere Lösung als Praxisbeispiel. Hier wird ausschließlich auf der einmal geladenen Seite gearbeitet, um Höhenanganben aus einer Landkarte auszulesen. Das Makro ist ebenfalls gut kommentiert, aber auch relativ komplex:
https://stackoverflow.com/questions/62150400/online-search-bar-values-after-export-from-excel-not-clicking-automatically-tag/62181827#62181827
Viele Grüße,
Zwenn
Anzeige
AW: Einen Schritt weiter und zwei Fragen mehr...
12.01.2021 17:02:14
Jürgen
Ihr seid der Wahnsinn!
Vielen Dank für die echt tollen Antworten (und das meine ich so wie es hier steht!)
Für meine sieben oder acht Klicks ist der Weg über die Schleifen ein gangbarer Weg. Den ich auch noch schnell umsetzten kann.
Dafür habt Ihr mir schon mal gute Erklärungen geliefert.
Wegen dem HTML Code, muss ich nochmal schauen, wie ich das mache.
Wenn mir nochmal was auf die Füße fällt und ich nicht weiter komme, dann melde ich mich einfach wieder bei Euch.
Jetzt kommen noch die beiden Drop-Down-Felder und zum Schluss muss ich noch überprüfen, ob mein Eintrag vorhanden ist oder nicht.
Mal sehen ob ich das alleine hinbekomme.
Nochmal vielen Dank für Eure Erklärungen.
Viele Grüße
Jürgen
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige