Webseiten fernsteuern

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Ist Ihnen das auch schon mal passiert, dass Sie ein Internetangebot mehr als einmal in Anspruch genommen haben und immer wieder gleiche oder ähnliche Daten in ein Formular eintragen mussten Dann können Sie aufatmen: Dank datenbankgesteuertem Formularausfüllen ist damit jetzt Schluss! In diesem Beitrag erfahren Sie, wie Sie Webformulare vollautomatisch ausfüllen, und das auch noch mit wechselnden Inhalten.

Der Autor war unruhig. Er programmiert und er schreibt gerne, aber Arbeiten wie das stupide Eingeben der Adressdaten von Kunden in die Webschnittstelle des Paketdienstes sind ihm zuwider. Warum bietet dieser auch keinen WebService an, den man bequem von der Datenbank aus füttern kann – denn dort sind ja alle notwendigen Daten gespeichert Ach ja, er bietet tatsächlich so etwas an – aber erst ab einem bestimmten Mindestaufkommen von Paketen, das in diesem Fall nicht erreicht wird.

Auch für dieses Problem wird es sicher eine Lösung geben: Warum denn nicht einfach die Internetseite "kapern" und die Adressdaten automatisch dort eintragen lassen Immerhin bietet Microsoft eine passende, per VBA einsetzbare DHTML-Bibliothek an! Gedacht, getan: Wenige Stunden später steht der erste Entwurf einer Routine, die Absender- und Empfängerdaten in das Webformular des Paketdienstes einträgt, zwei weitere Optionen abhakt und die Senden-Schaltfläche anklickt, um im nächsten Schritt den fertigen Paketaufkleber angezeigt zu bekommen. Kurze Sichtkontrolle, ein Klick auf die Drucken-Schaltfläche und schon sind fünf Minuten eingespart, die in neue Lösungen und Artikel investiert werden können.

Im Grunde gibt es eine ganze Reihe Möglichkeiten, Internetdienste auf diese Weise fernzusteuern: So lassen sich Artikel bei eBay einstellen, überweisungen per Online-Banking tätigen oder jene Paketaufkleber erzeugen.

Beispielanwendung

Dieser Beitrag zeigt, wie Sie die Weboberfläche eines nicht namentlich genannten Paketdienstes per VBA steuern und den passenden Paketschein geliefert bekommen. Das Ganze wird schön in Form einer einzigen Schaltfläche in ein Formular integriert, das die Bestelldaten des Kunden enthält.

Ein Klick auf diese Schaltfläche soll einen Webbrowser öffnen (hier den Internet Explorer), die Seiten mit dem Formular zum Eingeben der Absender- und Empfängerdaten aufrufen, dieses mit den immer gleichen Absenderdaten und den Daten des aktuellen Kunden füllen und das Formular absenden.

Nun haben Sie Glück, wenn Sie mit genau dem hier betroffenen Paketdienst zusammenarbeiten – Sie können die Anwendung dann direkt einsetzen. In der Regel hat aber jeder Anbieter andere Formulare mit anderen Steuerelementnamen, und auch der generelle Ablauf unterscheidet sich möglicherweise. Deshalb finden Sie nachfolgend im Detail, wie Sie selbst eine solche Fernsteuerung nachbauen können: Dazu untersuchen Sie zunächst die Zielwebseite hinsichtlich der enthaltenen Steuerelemente, bereiten die Daten so auf, dass diese in die Zielfelder passen, und stellen dann die Routine zusammen, die die Informationen aus der Datenbank ausliest und in das Webformular schreibt.

Zielformular

Ohne überhaupt einen Blick auf die möglicherweise verwendeten Techniken brauchen Sie auf jeden Fall die Namen der Formularfelder, die Sie mit den Daten aus der Datenbank füllen möchten. Um diese zu ermitteln, gibt es zwei Möglichkeiten:

  • Die Sichtmethode. Dabei öffnen Sie den Quellcode der Internetseite über den Menübefehl Ansicht/Quelltext und suchen die passenden Bezeichnungen heraus.
  • Die automatische Methode. Wenn schon automatisieren, dann auch richtig: Der Internet Explorer lässt sich per VBA referenzieren, also können Sie auch den angezeigten Inhalt auslesen. Das Ganze funktioniert per DHTML, einer Bibliothek, die den Zugriff auf das Objektmodell einer HTML-Seite zulässt: Damit können Sie beliebige Elemente einer Internetseite auslesen, anpassen oder auf andere Weise steuern.

Keine Frage, welche Methode hier zum Einsatz kommt. Zwar ist mit dem automatisierten Auslesen ein wenig Programmierarbeit verbunden, aber schließlich werden die meisten von Ihnen (und ich auch) für innovativen Quellcode und nicht für das manuelle Durchsuchen ellenlanger HTML-Codes bezahlt.

Das Zielformular der Beispielanwendung sieht übrigens wie in Bild 1 aus. Wie nun kommt man aber mit geringstmöglichem Aufwand an die Namen der Steuerelemente Zunächst einmal brauchen Sie eine Referenz auf den Webbrowser und müssen die gewünschte Seite aufrufen, dann können Sie per DHTML auf deren Elemente zugreifen.

pic001.tif

Bild 1: Dieses Webformular soll automatisch gefüllt und abgeschickt werden.

Klasse Schnittstelle

Um alles, was mit dem Zugriff auf den Internet Explorer zu tun hat, sauber zu kapseln, legen Sie eine eigene Klasse namens clsIEController an. Damit diese beim Instanzieren direkt eine Internet Explorer-Instanz erzeugt, nutzen Sie das Initialize-Ereignis.

Dieses instanziert ein Objekt des Typs InternetExplorer mit der Bezeichnung objIE. Dessen Deklaration impliziert übrigens das Schlüsselwort WithEvents, was bedeutet, dass Sie die Ereignisse dieses Objekts abfangen können – mehr dazu weiter unten. Ohne einen Verweis auf die passende Bibliothek bringt das allerdings alles nichts – also binden Sie die Bibliothek Microsoft Internet Controls in das aktuelle VBA-Projekt ein. Und wenn Sie schon einmal dabei sind, wiederholen Sie das Gleiche mit der Bibliothek Microsoft HTML Object Library.

Das Terminate-Ereignis tritt ein, wenn Sie eine Objektvariable mit Bezug auf diese Klasse löschen. Wichtig ist außerdem noch die Eigenschaft Visible, mit der man die Internet Explorer-Instanz ein- und ausblenden kann.

Dim WithEvents objIE As InternetExplorer
Private Sub Class_Initialize()
 Set objIE = New InternetExplorer
 objIE.Silent = True
End Sub
Private Sub Class_Terminate()
 Set objIE = Nothing
End Sub
Public Property Let Visible(bolVisible _
As Boolean) mVisible = bolVisible objIE.Visible = bolVisible End Property

Fehlt also noch Code, der endlich den Internet Explorer anzeigt. Dieser sieht so aus und kann in einem beliebigen Standardmodul untergebracht werden:

Public objIEController As clsIEController
Public Sub IEStarten()
 Set objIEController = New clsIEController
 objIEController.Visible = True
End Sub

Nach dem Aufrufen dieser Routine erscheint ein Internet Explorer, zeigt allerdings keine Seite an. Die passende Methode für die Klasse clsIEController sieht so aus:

Public Sub LoadDocument(strDocumentname As _
String) mDocumentComplete = False objIE.Navigate2 strDocumentname End Sub

Den Aufruf können Sie der kleinen Routine IEStarten hinzufügen (in einer Zeile):

objIEController.LoadDocument 
"http://www.access-im-unternehmen.de"

Warteschleife

Damit können Sie nun schon eine Seite in der neuen IE-Instanz anzeigen. Bevor Sie per Code auf die in der Seite enthaltenen Elemente zugreifen, müssen Sie zunächst noch sicherstellen, dass diese auch fertig geladen ist.

Und hier kommt das soeben erwähnte Schlüsselwort WithEvents ins Spiel: Der Internet Explorer stellt wie viele andere Anwendungen oder auch Objekte wie Formulare und Steuerelemente Ereignisse bereit.

So löst er beispielsweise ein Ereignis aus, wenn das Laden einer neuen Seite begonnen hat oder wenn diese fertig geladen ist. Die verfügbaren Ereignisse können Sie betrachten, wenn Sie im Codefenster der Klasse clsIEController im linken Kombinationsfeld den Eintrag objIE auswählen und dann das rechte Kombinationsfeld aufklappen (siehe Bild 2).

pic002.tif

Bild 2: Einfaches Zusammenstellen der Ereignisprozeduren für den Internet Explorer

Per Auswahl eines dieser Einträge legen Sie automatisch den Prozedurrumpf einer passenden Ereignisprozedur an.

In diesem Fall brauchen Sie erst einmal zwei davon:

  • BevoreNavigate2 wird vor dem Navigieren zu einer neuen Seite ausgelöst und
  • DocumentComplete nach Beendigung des
    Ladevorgangs.

Die beiden hier verwendeten Prozeduren stellen lediglich die interne Variable mDocumentComplete auf den Wert False beziehungsweise True ein:

Private Sub objIE_BeforeNavigate2(ByVal pDisp _
As Object, URL As Variant, Flags As _
Variant, TargetFrameName As Variant, _
PostData As Variant, _
Headers As Variant, Cancel As Boolean) mDocumentComplete = False End Sub Private Sub objIE_DocumentComplete(ByVal _
pDisp As Object, URL As Variant) mDocumentComplete = True End Sub

Was hat es damit auf sich Nun, diese Eigenschaft wird von der Klasse über die folgende Property Get-Prozedur nach außen hin verfügbar gemacht:

Public Property Get DocumentComplete() _
As Boolean DocumentComplete = mDocumentComplete End Property

Darüber lässt sich leicht prüfen, ob die gewünschte Seite bereits fertig geladen ist – und zwar in einer kleinen Schleife:

Do While Not .DocumentComplete
 DoEvents
Loop

Diese läuft erst weiter, wenn die Eigenschaft DocumentComplete des objIEController-Objekts den Wert True annimmt.

Dies ist auch der Fall, wenn es die Seite nicht gibt. Um auch dies zu kontrollieren, können Sie die folgende Ereignisprozedur nutzen, um im Fehlerfall eine Statusvariable mit einem passenden Wert zu füllen:

Private Sub objIE_NavigateError(ByVal pDisp As _
Object, URL As Variant, _
Frame As Variant, StatusCode As _
Variant, Cancel As Boolean) mStatus = StatusCode End Sub

Die passende Statusvariable deklarieren Sie wie folgt:

Dim mStatus As Long

Schließlich benötigen Sie noch eine Property Get-Prozedur, mit der Sie den Statuswert nach außen weitergeben können:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar