[Tut] FF.au3 – AutoIt-Funktionen im Browser

  • Hier ein Tutorial zu Stilgar's UDF, da es dafür noch Bedarf zu geben scheint und ich mich selbst gerade darin eingearbeitet habe.
    Also werde ich auch nachträglich noch das ein oder andere ergänzen!


    [*] 1. Was ist „FF.au3“?
    [*] 2. Vorbereitung
    [*] 3. Erste Schritte
    [*] 4. Login
    [*] 5. Weitere Funktionen
    [*] 6. MozRepl
    [*] 7. User-Calls
    [*] 8. XPather & _FXPath


    1. Was ist „FF.au3“ und wo kommt es her?

    Die FF.au3 ist eine UDF (User Defined Function) von u.a. Thorsten Willert, auf dessen Website wir auch auch Dokumentation, die UDF und Beispiele auf DEUTSCH finden können.
    http://thorsten-willert.de/

    Dank dieser „Funktions-Sammlung“ können wir mittels FireFox Daten in Formulare eingeben, Links verfolgen, Seiten aufrufen, Seiten auslesen und Daten extrahieren und vieles mehr.
    In diesem Zusammenhang habt ihr sicher auch schon von der IE.au3 gehört... Hören und vergessen, die FF.au3 ist funktioneller, einfacher und schneller!


    2. Meine Vorbereitung, bevor ich überhaupt anfangen kann

    Als erstes braucht ihr natürlich eine aktuelle Version der FF.au3, die ihr hier bekommt:
    http://thorsten-willert.de/Themen/FFau3/Testversion/files

    Dann müsst ihr natürlich noch FireFox haben (*lach*) und das AddOn MozRepl, ohne das das Programm nicht funktionieren kann. Das AddOn bekommt ihr hier:
    http://wiki.github.com/bard/mozrepl
    Wie ihr das handhaben könnt, dass auch z.B. andere User das nutzen können, wenn ihr mit der FF.au3 ein Programm publiziert, dazu komme ich später.

    Wenn ihr auch AutoIt & Co habt, steht uns nichts weiter im Wege!

    Eine Anmerkung noch: Solltet ihr Befehle suchen, findet ihr hier einen Überblick, erläutert in DEUTSCH:
    http://german.documentation.ff-au3.thorsten-willert.de/
    Ein paar (kompliziert zu überblickende) Beispiele findet ihr hier:
    http://thorsten-willert.de/Themen/FFau3/FF.au3/files


    3. Grundfunktionalität und erste Schritte

    Zu Beginn ist es natürlich ratsam, gleich was ihr machen wollt, FireFox zu starten:

    [autoit]

    _FFStart([$sURL = "about:blank"[, $sProfile = "default"[, $iMode = 1[, $bHide = False]]]])

    [/autoit]

    Mit der parameterlosen Funktion startet ihr einfach nur ein FireFox-Fenster, gebt ihr eine Adresse als 1. Parameter ein, startet er diese, der nächste Parameter wählt das FF-Profil(braucht ihr erstmal nicht^^), der folgende ist wieder wichtiger, er bestimmt, ob das Fenster unsichtbar gestartet wird oder sichtbar.
    * $bHide: True = unsichtbar; False = sichtbar
    * $iMode: 0 = Wird in bereits geöffnetes FF-Fenster geladen; 1 = Neues FF-Fenster; 2 = Wenn Fenster vorhanden, lädt er es dort hinen, sonst macht er ein neues auf

    Ihr seht also, wir können mit diesem Befehl auch weiterhin navigieren! Allerdings ist das umständlich und wenn das Fenster unsichtbar ist, kann das zu Schwierigkeiten führen. Also nutzen wir einen anderen Befehl:

    [autoit]

    _FFOpenURL($sURL)

    [/autoit]

    Damit können wir ganz einfach eine neue URL in den Browser laden. Der Parameter bedarf wohl keiner weiteren Worte.

    Was man auf macht, sollte man auch wieder schließen! Besonders, wenn ihr mit einem unsichtbaren Browser arbeitet ist dieses wichtig!

    [autoit]

    _FFQuit()

    [/autoit]

    „_FFWindowClose()“ schließt nur ein Fenster, nicht ganz FireFox, was sicher auch sehr praktabel ist.
    Es ist auch wichtig, dass ihr den Include nicht vergesst. Vergesst nicht, dass ihr auch hier das Fenster wieder mit „WinSetState()“ sichtbar machen könnt!

    Es ist also Zeit für ein erstes Beispiel!

    Spoiler anzeigen
    [autoit]

    #include <FF.au3> ; Muss immer da sein

    [/autoit] [autoit][/autoit] [autoit]

    _FFStart("www.web.de") ; oder _FFConnect() wenn FireFox bereits offen sein sollte! Startet den FireFox mit der Seite "www.web.de" und wartet mit Fortführung des Scripts, bis geladen

    [/autoit] [autoit][/autoit] [autoit]

    If _FFIsConnected() Then ; Wenn FireFox nun verbunden ist, dann...
    Sleep (1000) ; 1 Sekunde zum Verdeutlichen
    _FFOpenURL ("www.google.de") ; Navigiert uns zu "www.google.de"
    Sleep (1000) ; 1 Sekunde zum Verdeutlichen
    _FFQuit() ; Beendet das Ganze wieder
    Else ; Wenn FF nicht verbunden ist...
    MsgBox(64, "Ein Fehler ist aufgetreten", "Eine Verbindung mit dem Mozilla FireFox war nicht möglich!")
    EndIf

    [/autoit]


    4. Erstellen einer LogIn-Funktion

    Das war doch schon einmal ein kleiner Erfolg!
    Doch darauf können wir uns ja nicht ausruhen... Wenn wir nur Seiten ansteuern, bringt uns das nicht sehr viel.

    Wer zu „bequem“ ist, sich eine eigene LogIn-Funktion zu schreiben, für den hat Thorsten eine sehr gute und eig. immer funktionierende Alternative geschrieben:
    http://thorsten-willert.de/Themen/FFau3/…F_AutoLogin.au3


    Das Wichtigste bezüglich Interaktion ist wohl das Klicken auf einen Link.

    [autoit]

    _FFLinkClick($vSearch[, $sMode = "href"])

    [/autoit]

    Der erste Parameter gibt den Suchbegriff (oder deinen Teil dessen!) bzw. den Index des Links, der zweite Parameter die „Art“ des Suchbegriffes.
    Wir können nach sechs Arten suchen: „href“; „text“; „name“; „title“; „id“; „index“
    Jeder Link hat eine gewisse „Beschreibung“ im Quelltext, sollte das nicht so sein, können wir ihn zumindest durch den Index aktivieren!

    Wichtig ist auch, dass wir Formulare ausfüllen können, wie sonst sollen wir uns denn irgendwo einloggen?

    [autoit]

    _FFSetValue($sValue, $sElement[, $sMode = "elements"[, $iIndex = 0]])

    [/autoit]


    Der erste Parameter gibt den Inhalt an, den wir eintragen wollen, also z.B. den Usernamen. Der zweite Parameter, das des Elements, also z.B. den Namen InputBox, während der dritte Parameter angibt, wie wir das Element beschreiben, durch Namen, Klasse, Tag oder ID. Der vierte und proportionale Parameter sagt uns, das wievielte Element genommen werden soll, wenn unsere Beschreibung mehrmals passt.
    Mit dieser Funktion ist es ausserdem möglich, direkt Elemente zu benutzen, die wir mit _FFObj und _FFXPath(wird später drauf noch eingegangen) bestimmen, zu nutzen!

    Nun müssen wir das Ganze natürlich auch noch abschicken!

    [autoit]

    _FFFormSubmit([$vForm = 0[, $sMode = "index"[, $sSubmitMode = "submit"]]])

    [/autoit]

    Der erste Parameter gibt den Namen oder die ID des Formulars an, dass wir abschicken wollen (kann man oft vernachlässigen!), der zweite Parameter gibt an, ob wir beim ersten Parameter einen „index“, einen „name“n oder eine „id“ eingegeben haben.
    Der dritte Parameter ist sehr wichtig, da einige Webseiten es uns durch Tricks schwerer machen. Dort geben wir an, wie das Formular bestätigt werden soll. Durch „submit“, „click“, „enter“(Taste gedrückt halten), „enter2“(Taste betätigen), „auto“.

    Nun beglücke ich euch wieder mit einem Beispiel, spielt ruhig ein bisschen mit den Parametern rum!

    Spoiler anzeigen
    [autoit]

    #include <FF.au3> ; Muss immer da sein

    [/autoit] [autoit][/autoit] [autoit]

    ; Ihr müsst euch ein bisschen mit QuellCode auskennen. Lasst euch den Quellcode anzeigen und sucht nach Elementen, die in der Nähe stehen,
    ; wie vor dem Formular für den Benutzernamen "Nutzer"

    [/autoit] [autoit][/autoit] [autoit]

    _FFStart("www.web.de") ; Wenn der FF offen sein sollte, ist auch _FFConnect möglich! Startet den FireFox mit der Seite "www.web.de" und wartet mit Fortführung des Scripts, bis geladen

    [/autoit] [autoit][/autoit] [autoit]

    If _FFIsConnected() Then ; Wenn die Verbindung zum FF hergestellt werden konnte, dann...

    [/autoit] [autoit][/autoit] [autoit]

    _FFLinkClick("FreeMail","text") ; Klickt auf den Link, der "FreeMail" heisst

    [/autoit] [autoit][/autoit] [autoit]

    _FFSetValue("TEST", "username", "name") ; Setzt in das Element mit dem Namen "" den Benutzernamen ein
    _FFSetValue("123", "password", "name") ; Setzt in das Element mit dem Namen "" den Benutzernamen ein
    _FFFormSubmit() ; Bestätigt das Formular

    [/autoit] [autoit][/autoit] [autoit]

    _FFWindowClose() ; Schließt das Fenster wieder

    [/autoit] [autoit][/autoit] [autoit]

    Else ; Sonst... (Fehlermeldung!)
    MsgBox(64, "Ein Fehler ist aufgetreten", "Eine Verbindung mit dem Mozilla FireFox war nicht möglich!")
    EndIf

    [/autoit]


    5. Weitere wichtige Funktionen und deren Anwendung

    Es gibt natürlich nicht nur Links, sondern auch Bilder, die als Hyperlink agieren. Auch die wollen angeklickt werden. Im Prinzip ist der Befehl der normalen Link-Klick-Funktion sehr ähnlich, darum fasse ich mich kurz in der Erläuterung.

    [autoit]

    _FFImageClick($vSearch[, $sMode = "src"])

    [/autoit]

    Der erste Parameter ist wieder der „Suchbegriff“, der zweite beschreibt die Art. Dieser kann „src“(Link-Text des Bildes), „alt“(Alternativ-Text des Bildes), „name“, „title“, „id“ , „href“ oder „index“ sein.

    Normaler Weise warten alle Befehle, bis die Seite geladen ist, sollte dies aber mal nicht der Fall sein, gibt es noch einen Befehl, der die Seite sich zu Ende laden bzw. eine bestimme Zeit warten, lässt.

    [autoit]

    _FFLoadWait([$iTimeOut = $_FF_LOADWAIT_TIMEOUT])

    [/autoit]

    Dieser Befehl lässt parameterlos die Seite zu Ende laden. Ihr könnt aber auch eine Zahl(in ms) angeben, die er warten soll (sehe ich keinen Nutzen drin)...

    Dann könnt ihr mit der FF.au3, was die IE.au3 nicht beherrscht, sogar einzelne Tabs ansteuern! Doch Vorsicht, wenn ihr mit einem unsichtbaren Fenster arbeitet, es wird wieder selektiert! Ihr müsst es dann direkt wieder verstecken oder euch etwas anderes einfallen lassen.

    [autoit]

    _FFTabAdd([$sURL = "about:blank"[, $bSelect = True]])

    [/autoit]

    Dieser Befehl lässt parameterlos die Seite zu Ende laden. Mit dem optionalen Parameter kann man bestimmen, wie lange er warten soll, falls man doch nicht komplett bis zum Aufbau von z.B. jedem einzelnen Bild warten möchte, sondern nur, bis ein bestimmter Bereich vorhanden sein sollte.

    Um die einzelnen Tabs ansteuern zu können, braucht ihr folgenden Befehl:

    [autoit]

    _FFTabSetSelected([$vTab = 0[, $sMode = "index"]])

    [/autoit]

    So könnt ihr einen bestimmen Tab auswählen. Der erste Parameter kann das „Label“(z.B. Startseite) oder den „Index“ beinhalten, was dann im 2 Parameter auch stehen muss. Weiterhin kann der erste Parameter auch die Werte „prev“ (vorheriger Tab), „next“ (nächster Tab), „first“(erster Tab) oder „last“ (letzter Tab) annehmen.

    Zu guter Letzt wollen wir die Tabs auch wieder schließen.

    [autoit]

    _FFTabClose([$vTab = -1[, $sMode = "index"]])

    [/autoit]

    Ohne Parameter wird der aktuelle Tab geschlossen. Im ersten Parameter kann wieder das „Label“ oder der „Index“ eingetragen werden, was auch wieder dann im zweiten Parameter stehen muss. Sonst kann der erste Parameter auch „all“, „selected“, „prev“, „next“, „first“ oder „last“ sein (ihr solltet nun wissen, was was bedeutet!).

    Und wieder ein kleines Beispiel für euch:

    Spoiler anzeigen
    [autoit]

    #include <FF.au3> ; Muss immer da sein

    [/autoit] [autoit][/autoit] [autoit]

    _FFStart("www.web.de") ; Wenn FF bereits gestartet sein sollte, geht auch _FFConnect! Startet den FireFox mit der Seite "www.web.de" und wartet mit Fortführung des Scripts, bis geladen

    [/autoit] [autoit][/autoit] [autoit]

    If _FFIsConnected() Then ; Wenn die Verbindung zum FF hergestellt werden konnte, dann...

    [/autoit] [autoit][/autoit] [autoit]

    Sleep (1000) ; Wartet 1 Sekunde zur Veranschaulichung

    [/autoit] [autoit][/autoit] [autoit]

    _FFTabAdd("www.google.de", False) ; Erstellt den Tab "www.google.de", bringt ihn aber nicht in den Vordergrund
    Sleep (1000) ; Wartet 1 Sekunde zur Veranschaulichung
    _FFTabAdd("http://www.autoit.de/") ; Erstellt den Tab "www.autoit.de" und holt ihn in den Vordergrund
    Sleep (1000) ; Wartet 1 Sekunde zur Veranschaulichung

    [/autoit] [autoit][/autoit] [autoit]

    _FFTabSetSelected("next") ; Wählt den nächsten Tab an
    Sleep (1000) ; Wartet 1 Sekunde zur Veranschaulichung

    [/autoit] [autoit][/autoit] [autoit]

    _FFTabClose() ; Schließt den aktivierten Tab
    Sleep (1000) ; Wartet 1 Sekunde zur Veranschaulichung

    [/autoit] [autoit][/autoit] [autoit]

    _FFQuit() ; Schließt FireFox

    [/autoit] [autoit][/autoit] [autoit]

    Else ; Sonst... (Fehlermeldung!)
    MsgBox(64, "Ein Fehler ist aufgetreten", "Eine Verbindung mit dem Mozilla FireFox war nicht möglich!")
    EndIf

    [/autoit]

    Nun denkt ihr euch sicher „Oh mein Gott, ist der bald fertig? Was muss ich noch alles wissen?“... Aber keine Angst, soviel kommt nicht mehr an Befehlen. Ich kann euch ja auch nicht alles vorkauen! Jetzt kommt aber eine ganz elementare Sache und ihr solltet gut aufpassen.

    Ihr wollt und müsst, wenn ihr Automatisierungen programmiert, sehr schnell in den QuellCode rein, das haben wir ja schon gemacht, aber manchmal müsst ihr diesen auch auslesen! Und genau DAS werde ich euch jetzt zeigen und vielleicht verrate ich euch noch ein bis zwei kleine Tricks*zwinker*.

    [autoit]

    _FFReadHTML([$sMode = "body"[, $iFilter = 0]])

    [/autoit]

    Oh, dieser Code ist so abartig wichtig und hat auch seine Tücken...
    Der erste Parameter kann den Wert „body“ oder „html“ annehmen. Also gibt den Wert zwischen jeweils diesen Tags im Code aus. Jeder mit Grundkenntnissen HTML kennt den Unterschied. Der Rest muss hier sowiso die Finger von lassen.
    Mit dem zweiten Parameter kann man einen Filter (auch mehrere möglich/addierbar!) aktivieren. „0“ (deaktiviert), „1“ (Non ASCII), „2“ (Double Whitespaces), „4“ (Double Linefeeds), „8“ (HTML Tags) und „16“ (Einfache HTML Tags / Entities Konvertor).

    Was passiert also, wenn ich diesem Befehl einer Variable zuordnen? Er nimmt den Wert eines langen Strings an (wenn FireFox offen ist).
    In diesem String stehen Haufenweise Informationen über den Mainframe und ihr könnt durch die „String“-Befehle eig. alles isolieren, was ihr wollt. Dazu wird es gleich auch ein Beispiel geben.

    Wichtig auch: „_StringBetween()“ hat ein ARRAY als Ergebnis. Das bedeutet, wenn nichts gefunden wird und ihr mit etwas arbeiten wollt, das „da sein sollte“, aber z.B. FireFox nicht offen ist, wird das Script sich beenden...!

    Einschub vor dem Beispiel:

    So wählt ihr einen anderen Frame:

    [autoit]

    _FFFrameEnter($vFrame[, $sMode = "index"])

    [/autoit]

    Im ersten Parameter gebt ihr den „Index“, den „Name“n oder die „Id“ ein und im zweiten Parameter setzt ihr dann diese „Art“.

    Und schon ist es wieder Zeit für ein Beispiel!

    Spoiler anzeigen
    [autoit]

    #include <FF.au3> ; Muss immer da sein
    #Include <String.au3> ; Benötigt für String-Befehle

    [/autoit] [autoit][/autoit] [autoit]

    _FFStart("http://www.autoit.de/", "default", 2, True) ; Wenn FF offen sein sollte, kann man auch _FFConnect nehmen! Startet den FireFox(wird unsichtbar!) mit der Seite "http://www.autoit.de/" und wartet mit Fortführung des Scripts, bis geladen

    [/autoit] [autoit][/autoit] [autoit]

    If _FFIsConnected() Then ; Wenn die Verbindung zum FF hergestellt werden konnte, dann...

    [/autoit] [autoit][/autoit] [autoit]

    $HTML = _FFReadHTML() ; Liest den HTML-Code aus und speichert ihn in einer Variable

    [/autoit] [autoit][/autoit] [autoit]

    $a = _StringBetween($HTML, "dateS.png", "</span>") ; Wir lesen die Variable aus und haben zwei Werte, die um den gewünschten liegen
    $b = StringTrimLeft($a[0], 16) ; Wir haben ermitteln, welche überschüssigen Informationen an dem String hängen und schneiden sie ab

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "Test", $b) ; Eine MessageBox mit dem Ergebnis(Datum und Uhrzeit), Script führt sich erst nach "Ok" fort

    [/autoit] [autoit][/autoit] [autoit]

    _FFQuit() ; Schließt FireFox

    [/autoit] [autoit][/autoit] [autoit]

    Else ; Sonst... (Fehlermeldung!)
    MsgBox(64, "Ein Fehler ist aufgetreten", "Eine Verbindung mit dem Mozilla FireFox war nicht möglich!")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Wie ihr seht, umgehe ich geschickt die Anführungszeichen, in dem ich den String manipuliere...
    So könnt ihr auch Linkadressen ermitteln, die jedes Mal ein anderes Ende haben (Kampf-IDs in Spielen!)!
    Ihr lest den Teil aus, der immer anders ist und setzt dann vor den String den Teil, der immer bleibt. Als Suchraster hat man dann ja die statischen Teile...


    6. Muss ich das mit MozRepl jedem erklären, der meine Programme nutzen will?

    Nein :D...! Denn Thorsten Willert hat da vorgesorgt und eine UDF kreiiert, die überprüft, ob MozRepl bereits installiert ist. Wenn dies nicht der Fall ist, wird das direkt nachgeholt.
    Hier die UDF( FFEx.au3):


    http://thorsten-willert.de/Themen/FFau3/FF.au3/files

    7. Wie bekomme ich die UserCall-Hilfe in Scite für die _FF-Funktionen?

    Ihr bekommt die aktuelle Version immer hier: http://thorsten-willert.de/Themen/FFau3/Verschiedenes/files
    Die deutsche/englische Datei einfach öffnen oder runterladen und den Inhalt in diese hier einfügen/überschreiben:
    "*:\Program Files\AutoIt3\SciTE\api\au3.user.calltips"


    Jeden Freitag werden Änderungen hier auch geupdated!


    8. Gibt es eine einfachere Methode, Strings auszulesen?

    Aber natürlich gibt es die. Mit der Funktion "_FFXPath" in Verbindung mit dem Tool XPather ist es ein leichtes, an Werte zu kommen!
    Hier gibt es das AddOn zum Downloaden: https://addons.mozilla.org/de/firefox/addon/1192
    Es ist natürlich ein AddOn für Firefox.

    [autoit]

    _FFXPath($sQuery[, $sAttribute = "textContent"[, $iReturnType = 2[, $iFilter = 0]]])

    [/autoit]


    Tja, das haben wir also nun, doch wie kann man das nutzen?...
    Ich erläutere mal die Parameter:

    Der erste Parameter ist das "Suchwort"... Der zweite Parameter ist eine Einschränkung dieses, er beschreibt den "Textinhalt". Er kann z.B. auch "src" annehmen, wenn man den "Text" des "src" eines Bildes haben möchte.
    Hierzu sei gesagt, dass _FFXPath nach Objekten sucht, bzw. Tags, die das umgeben, was wir suchen...
    Dann gibt die Funktion das umschlossene Wort aus, bzw. zählt Funktionen, etc...

    Der dritte Parameter, der die Art beschreibt, in der das Ergebnis geliefert wird:

    Spoiler anzeigen

    /0\ Unwichtig, was das Ergebnis ist, es wird ausgegeben. Wenn das Ergebnis ein Array ist, wirkt die „0“ wie die „6“.
    /1\ Das Ergebnis ist eine Zahl (z.B. wichtig für die count()-Funktion).
    /2\ Das Ergebnis ist ein einzelner String.
    /3\ Gibt einen Wahrheitswert(bool'schen Wert) aus, was nützlich ist, wenn ihr die XPath-Funktion „not()“ nehmt.
    /6\ Das Ergebnis ist ein Array, der alle Ausdrücke beinhaltet, die dem Suchstring momentan zuordbar sind. Das Array muss nicht unbedingt richtig in sich geordnet sein.
    /7\ Das Ergebnis ist ein Array, der alle Ausdrücke beinhaltet, die dem Suchstring momentan zuordbar sind. Das Array ist richtig geordnet.
    /8\ Das Ergebnis ist ein Array, dass einen beliebig zum Suchbegriff passenden String beinhaltet, der nicht unbedingt dem ersten findbaren entspricht.
    /9\ Das Ergebnis ist ein Array, dass den ersten zum Suchbegriff passenden String beinhaltet.
    /10\ Das Ergebnis ist die Zahl der Übereinstimmungen(COUNT).
    /11\ Schränkt die Suche ein, das Ergebnis muss min. einen Teil des 2. Parameters beinhalten.
    /12\ Schränkt die Suche ein, das Ergebnis muss mit dem 2. Parameter beginnen.
    /13\ Schränkt die Suche ein, das Ergebnis ist der 2. Parameter.
    /14\ Schränkt die Suche ein, das Ergebnis ist der 2. Parameter.

    Und schlußendlich der vierte Parameter, der Filter:
    /1\ „Nicht-ASCII“ / filtert Sonderzeichen und ä,ö,ü, etc
    /2\ Double Whitespaces (Abstände)
    /4\ Double Linefeeds(Zeilenvorschübe)
    /8\ HTML-Tags
    /16\ Einfacher HTML-Tag / Entities Konvertor

    Das AddOn habe ich nun nicht so zerplückt, da es selbsterklärend ist...
    Im Prinzip ist die Benutzung dieses Tools nicht sehr schwer... Xpather ist im „Rechtsklick-Menü“ eingebaut, nach der Installation und wenn man ein Wort, Bereich oder Feld mit einem Rechsklick anwählt, bekommt man direkt das ganze Suchschema, das man benötigt... Und zwar einen Wert, der MEHR als eindeutig beschrieben ist.

    Natürlich bekommt ihr noch eines eurer geliebten Beispiele:

    Spoiler anzeigen
    [autoit]

    ; Das ist nur eine Übersetzung, das Beispiel ist von Thorsten Willert!

    [/autoit] [autoit][/autoit] [autoit]

    #Include <Array.au3> ; benötigt für das Arbeiten mit Arrays
    #Include <FF.au3> ; Kennt ihr mittlerweile ;)?

    [/autoit] [autoit][/autoit] [autoit]

    If _FFConnect() Then ; Wenn man mit FireFox verbunden ist,...
    _FFTabAdd( "http://ff-au3-example.thorsten-willert.de/") ; ... erstellt er einen neuen Tab

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(64, "Anzahl der Passwortfelder:", _FFXPath( "//input[@type='password']", "", 10)) ; Sucht nach "input"-Feldern des Typus "password" und "zählt" diese

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(64, "Fieldset-Legend:", _FFXPath( "//form[1]/fieldset/legend")) ; Sucht nach dem 1. Form, hinter dem "fieldset" beginng und gibt dann den Wert zwischen den "legend"-Tags aus

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(64, "Text from 0ption 5:", _FFXPath( "//option[2]")) ; Die 2. Option wird ausgegeben, bzw. der Wert, der zwischen den 2. "option"-Tags steht

    [/autoit] [autoit][/autoit] [autoit]

    $vTmp = "Method: " & _FFXPath( "//form[1]/@method") & @crlf ; Gibt den "Value" des Parameters "method" aus
    $vTmp &= "Action: " & _FFXPath( "//form[1]/@action") ; Gibt den "Wert" des parameters "action" an
    MsgBox(64, "Form 2", $vTmp) ; ...

    [/autoit] [autoit][/autoit] [autoit]

    $aArray = _FFXPath("//option","value",7) ; Gibt die richtig geordneten Werte aus, die von "option"-Tags umgeben sind (und als "0. Array" die Anzahl der Ergebnisse)
    _ArrayDisplay($aArray) ; Zeigt das Array in einer Liste

    [/autoit] [autoit][/autoit] [autoit]

    _FFXPath("//form[1]//input[@type='checkbox' and position()=2]","",9) ; Sucht die 1. Form, darin einen input (-Trennung-) vom Typus "checkbox" UND(!) geht zur 2. Position, auf die das zutrifft, um das auszugeben, was von den checkbox-Tags umgeben ist
    MsgBox(64,"", _FFObj("xpath.type") & @crlf & _FFObj("xpath.value")) ; Gibt die ART des Objektes aus und den Wert
    _FFObj("xpath.checked=true") ; Setzt ein Häkchen in diese Checkbox! Anmerkung: In weiteren FF-Funktionen wird immer vom letzten Wert ausgegangen, den man mit FFXPath ermittelt hat, eine extra Variable braucht man nicht immer!

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Eigenes Beispiel

    [/autoit] [autoit][/autoit] [autoit]

    #Include <Array.au3> ; s.o.
    #Include <FF.au3> ; *zwinker*

    [/autoit] [autoit][/autoit] [autoit]

    _FFStart("www.web.de") ; Nicht mehr neu für euch!

    [/autoit] [autoit][/autoit] [autoit]

    MSGBox(64, "Soviele Input-Felder hat http://www.web.de!", _FFXPath("//input", "", 10)) ; Zählt die Inputfelder, die http://www.web.de gerade im Quellcode hat
    MSGBox(64, "Das ist die Beschriftung des Jobs-Link von http://www.web.de!", _FFXPath("//html[@id='buster']/body/div[@id='container']/div[@id='footer']/ul/li[@id='footerJobs']/a/span"))

    [/autoit]


    Dazu noch eine Kleinigkeit ->

    Code
    Schau hier

    Möchte ich die "src" auslesen ->

    [autoit]

    $src = _FFXpath("//th[contains(.,'Schau hier')]//img/@src")

    [/autoit]

    Hier noch ein kleines "Interview mit Thorsten Willert":

    Ich: Was ist vorteilhafter/schneller? XPather-Suchvorschlag nehmen oder den selber so "erarbeiten"?
    XPather sucht im Prinzip das gleiche, nur, dass er ja den Befehl wesentlich mehr einschränkt, also mit //html/... anfängt... Was sehr lang wird...

    So kurz gehalten bin ich gefeiter vor Veränderungen, richtig? :D Aber angeblich soll XPather so gut mit dieser Funktion kombinierbar sein :D. Was hat das dann für Vorteile?!

    T.W.: Stimmt das ist "etwas" umfangreicher. Xpath ist schließlich eine komplette Sprache zum Abfragen von XML-Strukturen.

    Am besten mal die Links in der Dokumentation "überfliegen" oder die hier ansehen:
    http://www.w3.org/TR/xpath (angeblich soll FF zwar Xpath 2.0 eingebaut haben - funktioniert aber anscheinend nicht ... )
    http://de.selfhtml.org/xml/darstellung/xpathsyntax.htm
    http://www.zvon.org/xxl/XPathTutorial/Ou…r/examples.html (Anm. von mir(Acanis): UNBEDINGT REINSCHAUEN!)

    Der Xpather-Vorschlag ist eine gute Grundlage, wenn man sehr komplizierte Strukturen hat, also z.B. sehr verschachtelte DIVs die nur Aufgrund von Texten, Klassen oder Ähnlichem zu unterscheiden sind.
    Wenn man allerdings den kompletten xpath übernimmt läuft man Gefahr, das bei der kleinsten Änderung auf dieser Seite die Abfrage nicht mehr funktionert. Darum würde ich den Vorschlag von XPather als Grundlage nehmen und solange kürzen, bis kein eindeutiges Ergebnis mehr erscheint - die Ausdrücke lassen sich in XPather direkt testen.
    Normalerweise sind die Strukturen einer Seite meist so einfach, daß man XPather eh nur noch zum "Testen" braucht.

    Auch würde ich die Abfragen von hinten her "aufzäumen".
    Wenn z.B. ein img die id=*bild0815" hat, dann brauch ich nicht mehr als //img[@id='0815'] - da eine ID (normalerweise) eindeutig ist, braucht es keine weiteren Angaben.
    Oder ich habe nur eine Tabelle auf der Seite, bei der ich aus der zweiten Reihe die zweite Spalte den Text haben möchte:
    //tr[2]//td[2]
    mehr braucht es dann da nicht.

    Ich: Ist die Funktion schneller als FF_HTMLRead()?

    T.W.: Ganz klar ja.
    HTMLRead ist eigentlich ein Relikt aus den allerersten Versionen, wo ich noch eine Ähnlichkeit der Funktionen zur IE.au3 beibehalten wollte - mittlerweile ziemlich überflüssig ...

    * Erstens ist der Befehl relativ laaaangsam - da nimmt man leichter gleich INetGetSource oder ähnliches.
    * Änderungen per AJAX bekommt man gar nicht erst mit, wenn man den Quellcode ausliest - per Xpath hingegen ist das jederzeit möglich
    * Es ist per xpath viel eleganter und sicherer Abzufragen, als den Quellcode mit den String-Funktionen zu zerlegen.
    * Bei den Rückgaben die per Array erfolgen, spart man sich zig Schleifen in AutoIt.
    * Viele Funktionen (rechnen usw.) kann man auch gleich per XPath erledigen, da erspart man sich es viele Werte abzufragen und diese dann weiter zu verarbeiten
    * und da man auch Werte setzen kann und nicht nur welche Abfragen, wäre ein "ankreuzen" sämtlicher Checkboxen mit XPath einfach:

    [autoit]

    _FFXpath("//input[@type='checkbox']", "checked=true", 6)

    [/autoit]

    schneller gehts ja wohl nicht mehr ...
    * ... :D

    -----------------------------------------------------------------------------------------

    Ich hoffe sehr, es gefällt euch und dass ihr dem Thema nun etwas verwandter seid. Gerne nehme ich Kritik, als auch Lob, an.


    LG Acanis

    24 Mal editiert, zuletzt von Acanis (16. Januar 2010 um 15:18)

  • Hi cooles Tutorial sehr nützlich

    bei den beispielen solltest du hinter die includes noch den dateinamen schreiben also

    [autoit]

    #include <FF.au3>

    [/autoit]

    ansonsten nützlich
    mach weiter so !

    gruss Simon

  • Die UDF für mozrepl ist nicht auffindbar.
    _MozRepl_Detect.au3

    Wäre nett wenn du sie noch mal hochladen würdest.

  • Hallo erstmal super tutorial!!!!
    Das hat mir lust auf mehr gemacht bzw. aufs ausprobieren.
    Könnte jmd. vielleicht mal kurz schreiben wie man ein udf einbindet oder verlinken?
    Danke im vorraus ;)
    Edit:
    und vll. ein kronkretes Beispiel hierbei das wäre echt nett.

  • schau dir mal den AutoIt-Befehl

    [autoit]

    #include

    [/autoit]

    an. Eine UDF ist ein ganz normales AutoIt-Script, du könntest es auch zur Not einfach unter dein vorhandenes Script drunterkopieren

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (1. Dezember 2009 um 20:42)

  • So, nach den Verbesserungsvorschlägen und Anregungen von Thorsten habe ich das Tutorial auf den neusten Stand gebracht, was auch nötig war, da sich auch einige Grund-Funktionen nun geändert haben :)...

    LG Acanis

  • Vielen Dank, ist korrigiert, diese Funktion ist Teil der FFEx.au3 geworden und somit als einzelne UDF hinfällig :)!

    LG

  • Hab da mal ne Frage....


    Wenn man FF mit Hide startet, gibt es dann eine Möglichkeit, das wieder sichtbar zu machen ?

    [autoit]

    If ProcessExists("Sig.exe") Then
    ConsoleWrite("@@ mfg")
    Else
    ConsoleWrite("!! -no sig-")
    EndIf

    [/autoit]
  • Hey, nice Tutorial, nur will das bei mir irgendwie nicht^^
    Bei mir kommt der Fehler, dass Firefox nicht ansprechbar sei (Else Bedingung....)
    Also, die FF.au3 habe ich in den selben Ordner getan, wie das Script (Ich hoffe das ist so richtig), was muss ich denn sonst noch machen, dass das ganze làuft?

    Greetz
    Fr34k

  • Ahhh, habs nun^^
    Ich hatte das erst mit Chrome runtergeladen, und da ladet man einfach das File runter... in Firefox nimmt es es direkt...

    Thx & Greetzz

  • ich hab auch noch eine frage zu der ff.au3

    und zwar, habe ich eine liste von URLs die ich in Firefox nacheinander öffnen will (das funktioniert auch soweit).
    nun zu meiner frage.
    Ist es möglich das ich sage alle links die "abc" beinhalten öffnest du in Firefox fenster A (in tabs) und für die links die "def" beinhalten öffnest du in Firefox Fenster B (in tabs)

    aktuell werden alle links aus meiner liste in nur einem Fenster in Tabs geöffnet...ich würde nur halt gerne bestimmte links in einem getrennten fenster öffnen.