AW: SAP-Browser aus SAP fernsteuern
09.01.2020 20:05:44
Zwenn
Hallo Klaus,
ich baue mal darauf, dass Dein angegebener VBA Lvl stimmt :-)
Aus den folgenden Grundlagen solltest Du Dir was zusammenbasteln können:
Sub BrowserSAP()
'Mal etwas so nicht lauffähiger Code für einige grundsätzliche Erklärungen
Dim objShell As Object
Dim objWindow As Object
Dim browser As Object
Dim url As String
Dim knotenEingabe As Object
Dim stringVariable As String
'Wenn man alles automatisieren will:
url = "SAP-Anwendung URL für Browser" ' 0 Then
'Prüfen ob es der richtige IE ist
'Jeder Tab im IE wird als eigenes Fenster behandelt
'Es ist also (fast) egal, wieviele Tabs geöffnet sind
'Möglichkeit 1: Über den Titel
If InStr(1, objWindow.Document.getElementsByTagName("title")(0).innertext, _
"Statischer immer gleicher Titel des Tabs") Then
'Gefundenes Fenster auf besser klingende Objekt Variable umswitchen ;-)
Set browser = objWindow
'Richtiger Tab in richtigem IE gefunden
'Also nicht weitersuchen
Exit For
End If
'Möglichkeit 2: Über die URL
If objWindow.Document.Location = url Then
'Gefundenes Fenster auf besser klingende Objekt Variable umswitchen ;-)
Set browser = objWindow
'Richtiger Tab in richtigem IE gefunden
'Also nicht weitersuchen
Exit For
End If
End If
Next objWindow
'Zugriff auf HTML-Elemente
'Wenn es nur das eine HTML-Element mit der CSS-Klasse
'"th-if th-ellipsis" gibt, könnte man das Eingabefeld
'wie folgt referenzieren:
Set knotenEingabe = browser.Document.getElementsByClassName("th-if th-ellipsis")(0)
'Es wird eine Node Collection gebildet, auf deren Elemente über ihre Indizes ab 0
'zugegriffen werden kann. Wenn es nur ein Element gibt, muss man es also über (0)
'referenzieren
'Es gibt aber eine ID, wie Du richtig erkannt hast
'Wurde der HTML Standard eingehalten und es gibt
'die ID nur einmal, kann man direkt auf das
'Element zugreifen:
Set knotenEingabe = browser.Document.getElementByID("C14_W46_V47_zordersearch_order_id")
'Hier wird keine Node Collection gebildet, weil eine ID in einem HTML Dokument
'eindeutig sein sollte. Es sollte aber immer geprüft werden, ob das auch der Fall
'ist. Sonst wird immer das erste Element mit der angegebenen ID referenziert
'Es gibt auch noch getElementsByTagName(), womit ebenfalls eine Node Collection
'gebildet wird und getAttribute(), womit nicht dirtekt auf HTML-Elemente
'zugegriffen werden kann. In Attributen stehen aber oft auch Informationen
'die man gern abgreifen möchte
'Die beiden sind für Dein Vorhaben an dieser Stelle aber nicht praktikabel
'Etwas mit einem HTML-Element machen
'Wenn es ein Button ist, kann man ihn nun wie folgt anklicken:
knotenEingabe.Click
'Wenn es ein Textfeld ist, kann man so Text eintragen:
knotenEingabe.Value = "Wunschtext"
'Wenn es eine Checkbox ist, kann man den Haken so setzen:
knotenEingabe.Checked = True
'Wenn es ein Element ist, das Text enthält, den man will:
stringVariable = knotenEingabe.innertext
'Wenn es ein Element ist, dessen HTML man ganz will:
stringVariable = knotenEingabe.outerHTML
'Wenn es ein Element ist, dessen HTML man ohne die einschließenden Tags will:
stringVariable = knotenEingabe.innerHTML
End Sub
Im Folgenden noch ein paar Links, wo Du Beispiele aus der Praxis einsehen kannst. Davon gibts natürlich im Netz haufenweise. Wenn Du selber recherchieren willst/ musst, sind Deine Suchbegriffe von denen Du ausgehen kannst "webscraping" und "document object model"
Es gibt auch noch weitere Möglichkeiten auf Inhalte von Webseiten zuzugreifen, wenn man mit den Get-Methoden nicht ans Ziel kommt. Zusätzlich kann man z.B. auch auf iFrames zugreifen, HTML-Events triggern, JS auslösen, usw.
Hier gibt es zwei Lösungen für das gleiche Problem. Die erste von Anton, meine folgt als Antwort auf seine:
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1732523
Hier zeige ich, wie man an Infos in einem JS kommt (Text zerfleddern, vorletzte Antwort):
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1722065
Hier gibts noch Erklärungen zum direkten Aufbau einer URL mit Parametern (nur wenn get statt post von der Seite verwendet wird). Sowas weißt Du aber vielleicht auch alles schon:
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1696480
Hier noch ein sehr ausführliches Projekt mit vielen Kommentaren und HTML Ausschnitten im Quellcode des Makros. Lass Dich davon nicht erschlagen, sondern nutze es ggf. als Referenz:
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1678466
Wenn Du weitere Fragen hast, lade bitte den HTML-Quellcode als Textdatei hoch. Ansonsten kann man nicht gezielt ansetzen, sondern immer nur eine allgemeine Hilfestellung geben oder im Nebel stochern.
Viele Grüße,
Zwenn