Opera Erweiterungen

  • Hallo,
    ich habe da ein kleines Problem mit Opera und seinen Erweiterungen.
    Ich will einige Erweiterungen für Opera (fünf) automatisch mit AutoIt installieren.

    Dazu muss man ja diese *.oex Dateien mit:

    [autoit]


    ShellExecute($Pfad_Install_Sonstiges & "\Erweiterungen" & "\" & $_Opera_Extension)

    [/autoit]


    ausführen (ein anderer Aufruf geht es anscheinend nicht).

    Dann wird Opera gestartet und ein Fenster mit der Frage, ob man diese Erweiterung installieren möchte, erscheint.

    Dieses Fenster kann man auch mit dem "Fenster-Info-Tool" identifizieren.
    Nur auf diesem Fenster befinden sich auch zwei Schaltflächen ("Installeren" und "Abbrechen").
    Die kann man nicht mit dem "Fenster-Info-Tool" identifizieren und daher anscheinend nur mit:

    [autoit]


    MouseClick("LEFT", 270, 230, 1, 0)

    [/autoit]


    für Installieren anklicken.
    Das Problem dabei ist nur, die Schaltflächen befinden sich nicht immer am selben Ort und daher geht ein:
    "MouseClick()"
    auch schon mal ins "leere".
    Gibt es da eventuell noch eine andere Möglichkeit die Schaltflächen gezielter anzusprechen ?

    Und das nächste Problem ist:
    Wenn man die "Installieren"-Schaltfläche angeklickt hat, so erscheint wenig später ein Hinweis:
    "Erweiterung installiert" o.ä.
    Dieser Hinweis muss erschienen sein bevor das Script irgendwie weitermacht, sonst gibt es Fehler.
    Nur wie kann man das erscheinen dieses Hinweises erkennen ?
    Das "Fenster-Info-Tool" erkennt den Hinweis anscheinend nicht und es erscheint auch kein Prozess o.ä.
    den man zum identifizieren auswerten könnte.
    Daher fällt mir eigentlich nur ein:

    [autoit]


    Sleep(8000)

    [/autoit]


    ein, nach acht Sekunden Wartezeit sollte danach sollte eigentlich auch der lahmste Rechner fertig sein.
    Oder gibt es eine Möglichkeit den Hinweis eindeutig zu erkennen ?
    Irgendwie müsst das doch möglich sein, der Browser ruft doch auch etwas auf und das müsste man doch eigentlich auch erkennen können.

    Vielen Dank, schon jetzt, für Tipps, damit ich mir dann ein funktionierendes Script zusammen "stricken" kann.

    MfG:
    BigRox

    Einmal editiert, zuletzt von BigRox (14. November 2012 um 09:51)

  • Ich benutze Opera nicht und kann daher nichts testen, allerdings könnte man wenn wirklich gar nichts mehr hilft den "Hinweis" aus der Speicher lesen... Andernfalls gibt es ja auch noch schöne Dinge wie ControlClick() ImageSearch usw. ;)

    LG
    Christoph :)

  • Wenn die Buttons nicht per Controlklick erreichbar sind (sind sie bei mir auch nicht, hab ich gerade getestet), könntest Du mit WinGetPos() die Position der Fenster ermitteln und dann deinen MouseClick() relativ zu der ermittelten Ecke oben/links ausführen.

    Außer das Fenster ändert auch noch jedesmal die Größe ;)

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hallo Micha_he,
    ich habe oben in meinem Testscript, die Option:

    [autoit]


    Opt("MouseCoordMode", 2)

    [/autoit]


    angegeben. Dadurch sind die Koordinaten relativ zum Anwendungsbereich des aktiven Fensters.
    Das Problem ist aber, dass Fenster ändert seine Größe je nach dem Text darin.
    Dadurch verschieben sich auch die Koordinaten des "Installieren" Buttons.

    Das kommt zwar nicht sehr oft vor, aber einmal reicht ja schon und es gibt einen Fehler.
    Zur Abhilfe müsste ich daher jedesmal die aktuelle Position des Buttons haben.

    MfG:
    BigRox


    Edit: Eben ist mir eine Möglichkeit eingefallen, wie ich das mit den Hinweisfenstern am Installationsende lösen könnte. In Opera gibt es doch eine Datei "widgets.dat" wo die Erweiterungen eingetragen werden.
    Wenn diese Datei grösser wird, müsste eigentlich auch die Installation fertig sein.

    Das muss ich aber jetzt mal ausprobieren.

    Einmal editiert, zuletzt von BigRox (12. November 2012 um 19:05)

  • Hallo,
    ich habe meine Idee von gestern mehrfach getestet.
    Es geht tatsächlich.
    Opera kommt zwar mit dem einblenden der Hinweise nicht mehr hinterher, aber trotzdem sind alle Erweiterungen nachher installiert.

    Ich habe so mal aus Spass 50 Erweiterungen in einer Schleife hintereinander installiert, der Browser hat nur etwa 15 Hinweise einblenden können, dann war die Schleife durch und Opera wurde von meinem Testscript geschlossen. Aber Opera zeigte beim nächsten Aufruf dennoch alle 50 Erweiterungen als installiert an.

    Anscheinend funktioniert es so, oder: "Wieder ein Problem erschlagen".

    MfG:
    BigRox

    Ich würde je mein Testscript ja hier einfügen, aber leider geht das mal wieder nicht, da momentan wieder alle Buttons (die oben an dem Fenster) zum formatieren fehlen und auch Dateianhänge einfügen geht nicht mehr. Vielleicht geht es ja irgendwann mal wieder (und ich dachte schon: "Endlich geht es". Das war wohl nichts).

    2 Mal editiert, zuletzt von BigRox (13. November 2012 um 17:51)

  • Hallo mal wieder,
    ich habe mich eine ganze Zeit nicht mehr eingeloggt und plötzlich geht es wieder und das ohne das ich irgendetwas geändert habe.
    Daher hier nun das Script:

    Spoiler anzeigen
    [autoit]


    ; #SCRIPT# ----------------------------------------------------------------------------------------------------------------------------------------------
    ; Script Name : Erweiterungen instalieren.au3
    ; Beschreibung : Script um die Erweiterungen für "Opera" zu installieren
    ; (YouTube Unblocker, Facebook-Blocker, Fastesttube, In-Place-Translator, ClipConverter).
    ;
    ; AutoIt Version : 3.3.8.1
    ; Script Autor : BigRox
    ; -------------------------------------------------------------------------------------------------------------------------------------------------------

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

    ; Sonstiges für dieses Script festlegen.
    #RequireAdmin

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

    ; Optionen für dieses Script angeben.
    Opt("MustDeclareVars", 1)

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

    ; Variablen deklarieren.
    Local $Erweiterung_Name, $Pfad_Install_Sonstiges, $LV, $Datei, $Suchhandle

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

    ; Einigen Variablen Werte zuweisen.
    $Pfad_Install_Sonstiges = @HomeDrive & "\Opera\Sonstiges"

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

    ; Das Suchhandle für die Suche nach ".oex"-Dateien ermitteln.
    $Suchhandle = FileFindFirstFile($Pfad_Install_Sonstiges & "\Erweiterungen\*.oex")

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

    $LV = 0
    ; Eine Endlosschleife um alle ".oex"-Dateien in dem Verzeichnis auszulesen starten.
    While 1
    $Datei = FileFindNextFile($Suchhandle)
    If @error Then ; Wenn keine Dateien mehr vorhanden sind, die Schleife abbrechen.
    ExitLoop
    EndIf
    $LV = $LV + 1
    ; Die Funktion zum Installieren der Erweiterung starten.
    _Opera_Erweiterung($Datei, "Erw. " & $LV)
    ; <Sleep> zur Sicherheit.
    Sleep(500)
    WEnd

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

    ; Die Funktion zum schließen des Browser aufrufen (der Browser wurde nur zum installieren der Erweiterungen gestartet).
    _Browser_schliessen(5, False)

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

    Exit

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

    ; Funktion zum installieren der Browser-Erweiterungen.
    Func _Opera_Erweiterung($_Opera_Extension, $_Ext_Nr)

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

    Local $_Array[200], $_Ext_Path, $_File_Sitze, $_LV, $_Wnd_Handle, $_Wnd_Name

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

    ; Einigen Variablen Werte zuweisen.
    $_Ext_Path = @UserProfileDir & "\Lokale Einstellungen\Anwendungsdaten\Opera\Opera\widgets"
    $_Wnd_Name = "Erweiterung installieren"

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

    ; Den Inhalt der "wigets.dat"-Datei in ein Array einlesen,
    _FileReadToArray($_Ext_Path & "\widgets.dat", $_Array)
    For $_LV = 1 To $_Array[0]
    ; Testen ob die Erweiterung schon installiert wurde, wenn "Ja", die Meldung ausgeben und die Funktion ohne Installation verlassen.
    If StringRegExp($_Array[$_LV], "(\Q" & $_Opera_Extension & "\E)") Then
    MsgBox(0, "", '! ! ! Die Erweiterung "' & $_Ext_Nr & '" wurde schon installiert ! ! !')
    Return
    EndIf
    Next

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

    ; Die ursprüngliche Dateigröße ermitteln.
    $_File_Sitze = FileGetSize($_Ext_Path & "\widgets.dat")

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

    ; Die Erweiterung installieren.
    ShellExecute($Pfad_Install_Sonstiges & "\Erweiterungen" & "\" & $_Opera_Extension)

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

    ; Eintragungen usw. in Fenster 1 (Erweiterung installieren).
    $_Wnd_Handle = _Fenster_aktivieren($_Wnd_Name, "", $_Ext_Nr)
    ; Tastencodes an das Fenster senden um den "Installieren"-Button zu fokussieren und anzuklicken (anders lässt sich nicht sicher auf dieses Fenster reagieren).
    Send("{TAB}")
    Sleep(500)
    Send("{ENTER}")
    Sleep(500)
    _Fenster_deaktiv($_Wnd_Name)
    ; Die aktuelle Dateigröße mit der gespeicherten Dateigröße vergleichen, wenn die aktuelle Dateigröße größer ist, die Schleife und die Funktion beenden.
    While FileGetSize($_Ext_Path & "\widgets.dat") < $_File_Sitze
    Sleep(500)
    WEnd
    Return

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

    EndFunc

    [/autoit]

    Vielleicht kann ja einer so etwas brauchen.
    Verbesserungsvorschläge sind natürlich auch erwünscht.

    Das mit dem Fenster und den Buttons, habe ich mit "Send()"-Befehlen gelöst, da der "Installieren"-Button immer nach einem Tab den Fokus hat und dabei ist es egal wo er sich in dem Fenster befindet.
    Mit:
    Send("{TAB}")
    und dann
    Send("{ENTER}")
    "treffe" ich den Button also immer.

    MfG:
    BigRox