[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:
    _FFStart([$sURL = "about:blank"[, $sProfile = "default"[, $iMode = 1[, $bHide = False]]]])


    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:
    _FFOpenURL($sURL)


    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!
    _FFQuit()


    „_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!





    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.
    _FFLinkClick($vSearch[, $sMode = "href"])


    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?
    _FFSetValue($sValue, $sElement[, $sMode = "elements"[, $iIndex = 0]])
    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!


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


    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!




    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.
    _FFImageClick($vSearch[, $sMode = "src"])


    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.
    _FFLoadWait([$iTimeOut = $_FF_LOADWAIT_TIMEOUT])


    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.
    _FFTabAdd([$sURL = "about:blank"[, $bSelect = True]])


    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: _FFTabSetSelected([$vTab = 0[, $sMode = "index"]])


    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.
    _FFTabClose([$vTab = -1[, $sMode = "index"]])


    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:



    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*.
    _FFReadHTML([$sMode = "body"[, $iFilter = 0]])


    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:
    _FFFrameEnter($vFrame[, $sMode = "index"])


    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!



    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.


    _FFXPath($sQuery[, $sAttribute = "textContent"[, $iReturnType = 2[, $iFilter = 0]]])
    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:


    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:



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


    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

  • Hi cooles Tutorial sehr nützlich


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


    #include <FF.au3>


    ansonsten nützlich
    mach weiter so !


    gruss Simon

  • 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 #include an. Eine UDF ist ein ganz normales AutoIt-Script, du könntest es auch zur Not einfach unter dein vorhandenes Script drunterkopieren

  • 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 ?

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

  • 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.