Unzuverlässige Steuerung durch AutoIT

  • Hallo zusammen,

    ich erstelle derzeit etliche Scripts zur automatischen Installation bestimmter Programme.

    Dazu verwende ich eine virtuelle Maschine, auf der außer XP Professional, allen aktuellen Servicepacks und Patches sowie dem Internet Explorer 7 nichts installiert ist. Von diesem Zustand habe ich einen Snapshot gemacht, so daß ich für jeden Test ein jungfräuliches XP zur Verfügung habe. Somit sind auch die Testbedingungen immer dieselben.

    Was mir als AutoIT-Neuling auffällt ist, daß die Steuerung der Programme durch AutoIT nicht zuverlässig ist.

    So kommt es immer wieder vor, daß ich ein Script erstellt habe, das auf dem jungfräulichen Windows völlig einwandfrei durchläuft und das Programm tadellos installiert.

    Stelle ich den jungfräulichen Zustand wieder her und lasse das unveränderte AutoIT-Script erneut laufen, kann es sein, daß es wieder sauber durchläuft - aber genauso gut kann es auch einfach stehen bleiben, obwohl im Code kein Fehler steckt.

    Ich habe mir schon überlegt, ob das Script zu schnell abgearbeitet wird und das zu installierende Programm die von AutoIT gelieferten Eingaben deshalb nicht verarbeiten kann. Darum habe ich hie und da "Sleep"-Anweisungen eingebaut - die an mancher Stelle tatsächlich helfen.

    Ganz aktuell sitze ich an der Installation des Programms CDex. Die Installation läuft jedesmal sauber durch - bis zum Schluß die Abfrage kommt, ob das Readme-File gelesen werden soll. Hier soll AutoIT den Befehl Send ("!n") schicken, damit das Fenster geschlossen wird. Hat auch schon funktioniert, jetzt aber nicht mehr, obwohl absolut nichts am Programmcode geändert wurde.

    Solche Situationen tauchen immer wieder auf. Zigmal getestet, zigmal funktioniert - dann plötzlich nicht mehr.

    Grundsätzlich würde mich interessieren, ob andere ähnliche Beobachtungen gemacht haben und ob es Möglichkeiten gibt, daß AutoIT die Programme zuverlässiger steuert - bzw. wo mein Fehler liegt.

    Viele Grüße
    Michael

  • Oder du benutzt die falschen Commands ;)

    Guck dir statt sleep -> WinWait(Active)
    und statt send -> alle ControlCommands an!

    • Offizieller Beitrag

    @MB0902 . Poste doch mal Code zum testen. Sonst schießen wir sowieso nur ins blaue .

  • @MB0902 . Poste doch mal Code zum testen. Sonst schießen wir sowieso nur ins blaue .

    Das Script FPInstall, welches den Flashplayer installiert, lief anfangs tadellos. Mittlerweile wird das FlashPlayer-Setup überhaupt nicht mehr gestartet, obwohl weder am Script was geändert wurde, noch die Setup-Datei durch eine aktuellere ersetzt oder an der Windows-Installation was gedreht wurde.

    Das Script FFKonfig konfiguriert FireFox. Es läuft anstandslos durch, nur wird die Startseite sporadisch nicht eingetragen.

    Eben habe ich wie im Ursprungspost beschrieben über virtuelle Maschine/Snapshot ein jungfräuliches Windows hergestellt, dann zuerst das FireFox-Installationscript gestartet, anschließend dieses Konfigurationsscript. Die Startseite wurde nicht eingetragen. Ich habe das Konfigurationsscript sofort ein zweites Mal gestartet - diesmal wurde die Startseite eingetragen.

    Dann habe ich wieder ein jungfräuliches Windows hergestellt, Installationsscript und anschließend Konfigurationsscript laufen lassen - beides lief anstandslos durch inkl. Eintragen der Startseite

    Dritter Versuch - ebenfalls mit frischer Windowsinstallation. Ergebnis: anstandlose Abarbeitung der Scripts.

    Fazit: zweimal gehts, einmal nicht.

    Gruß
    Michael

  • Oder du benutzt die falschen Commands ;)

    Guck dir statt sleep -> WinWait(Active)
    und statt send -> alle ControlCommands an!

    Das hab ich natürlich schon gemacht. Sind die ControlCommands "sicherer" und zuverlässiger, als "Send"?

  • Mit einigen Jahren Erfahrung im Deployment würde ich das Problem anders sehen:


    (Kleiner Einschub: Es gibt die sogenannte 80:20-Regel. Das bedeutet:

    Um 80 % einer Arbeit zu erledigen, braucht man 20% der Zeit,

    die letzten 20% verschlingen hingegen den Grossteil der Zeit - die 80% der Zeit.

    Fazit: Mensch sollte genau abwägen, wie präzise die Arbeit (das Script)

    werden soll / muss)

    Fazit: je höher der Anspruch an fehlerfreies Verhalten des
    Scriptablaufes sein soll, desto höher wird der Aufwand bei der
    Programmierung sein.

    Hier: Das Setup und das steuernde AutoIT-Script laufen linear und
    parallel zueinander ab. Darin ist implizit harteincodiert: Das
    Zeitverhalten des Setups und des AutoIT-Scriptes passen perfekt
    zusammen.


    Bei kleinen Abweichungen vom Zeitverhalten KANN es aber zu Diskrepanzen
    führen - Script- und Setup- Verhalten / Ablauf "passen" nicht mehr
    zueinander.


    Abhilfe: Da das setup nicht veränderbar ist, muss das steuernde
    AutoIT-Script so verändert werden, dass es jeden möglichen zeitlichen
    oder logischen Ablauf des Setups bearbeiten kann. Das kann mensch
    z.Bsp. so einbauen, das das Script in einer Schleife alle möglichen zu
    bearbeitenden Meldungen / Buttons o.ä. abfragt und gegebenenfalls
    bearbeitet.

    Mit sinnvoll gewählten Pausen kann mensch das so optimieren, das die Schleife optimal oft / selten abgearbeitet wird.

    Natürlich muss mensch dann auch ein geplantes Ende des Scriptes
    einbauen: Nach erfolgreicher Bearbeitung der Ende-Meldung des Setups,
    nach Timeout (vermutlich also kein erfolgreiches Setup), usw.


    Je nach Anspruch kann das dann weiter verfeinert werden (Qualität höher bedeutet: Aufwand höher).

  • Hier meine Variante von Adobe FlashPlayer Plugin.
    Und mit TuneUp 2007.

    Geht auch mit FireFox, nur mit AutoIt selbst habe ich probleme

    Ciao
    XTC99


    Spoiler anzeigen
    [autoit]


    #RequireAdmin
    #cs ----------------------------------------------------------------------------
    AutoIt Version: 3.3.0.0
    Author: XTC99

    Script Function:
    Automatic Silent Installtion
    #ce ----------------------------------------------------------------------------

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

    ;~Define Variables
    DIM $setup = @ScriptDir & "\install_flash_player.exe"
    DIM $setup_ie = @ScriptDir & "\install_flash_player_ax.exe"

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

    ;~ Check for Files
    If not FileExists ($setup) Then
    MsgBox(16,"Adobe Flash Player", "File not found :"& @LF & $setup)
    Exit 5
    EndIf

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

    If not FileExists ($setup_ie) Then
    MsgBox(16,"Adobe Flash Player", "File not found :"& @LF & $setup_ie)
    Exit 5
    EndIf

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

    ;Install FlashPlayer Firefox
    If ProcessExists ("firefox.exe") Then ProcessClose ("firefox.exe")
    run($setup)
    WinWait("Adobe Flash Player Plugin Installation: Fertig","&Details anzeigen")
    If Not WinActive("Adobe Flash Player Plugin Installation: Fertig") Then WinActivate("Adobe Flash Player Plugin Installation: Fertig")
    ControlClick ("Adobe Flash Player Plugin Installation: Fertig", "&Beenden", "Button2")

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

    ;Install FlashPlayer InternetExplorer
    If ProcessExists ("IEXPLORE.EXE") Then ProcessClose ("IEXPLORE.EXE")
    run($setup_ie)
    WinWait("Adobe Flash Player ActiveX Installation: Fertig","&Details anzeigen")
    If Not WinActive("Adobe Flash Player ActiveX Installation: Fertig") Then WinActivate("Adobe Flash Player Plugin Installation: Fertig")
    ControlClick ("Adobe Flash Player ActiveX Installation: Fertig", "&Beenden", "Button2")

    [/autoit]
    Spoiler anzeigen
    [autoit]


    #RequireAdmin
    #cs ----------------------------------------------------------------------------
    AutoIt Version: 3.3.0.0
    Author: XTC99

    Script Function:
    Automatic Silent Installtion
    #ce ----------------------------------------------------------------------------
    $g_szVersion = "AutoIt Script"

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

    DIM $snkey= "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX" ;Key eingeben

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

    AutoItWinSetTitle($g_szVersion)

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

    run("TU2007TrialDE.exe")

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

    WinWait ("TuneUp Utilities 2007 ", "&Weiter >")
    If Not WinActive("TuneUp Utilities 2007") Then WinActivate("TuneUp Utilities 2007")
    ControlClick ("TuneUp Utilities 2007", "&Weiter >", "Button1")

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

    WinWait("TuneUp Utilities 2007","Lizenzvertrag")
    If Not WinActive("TuneUp Utilities 2007") Then WinActivate("TuneUp Utilities 2007")
    ControlClick ("TuneUp Utilities 2007", "Ich &akzeptiere den Lizenzvertrag", "Button3")
    ControlClick ("TuneUp Utilities 2007", "&Weiter >", "Button4")

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

    WinWait("TuneUp Utilities 2007","Benutzer-Informationen")
    If Not WinActive("TuneUp Utilities 2007") Then WinActivate("TuneUp Utilities 2007")
    ControlSetText("TuneUp Utilities 2007","Benutzer-Informationen","RichEdit20W1","Name")
    ControlSetText("TuneUp Utilities 2007","Benutzer-Informationen","RichEdit20W2","Firma")
    ControlClick ("TuneUp Utilities 2007", "&Jeden Benutzer dieses Computers", "Button2")
    ControlClick ("TuneUp Utilities 2007", "&Weiter >", "Button4")

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

    WinWait("TuneUp Utilities 2007", "Zielordner")
    If Not WinActive("TuneUp Utilities 2007") Then WinActivate("TuneUp Utilities 2007")
    ControlClick ("TuneUp Utilities 2007", "&Weiter >", "Button1")

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

    WinWait("TuneUp Utilities 2007", "Anwendungseinstellungen")
    If Not WinActive("TuneUp Utilities 2007") Then WinActivate("TuneUp Utilities 2007")
    ControlClick ("TuneUp Utilities 2007", "TuneUp Utilities 2007 nach der Installation starten", "Button6")
    ControlClick ("TuneUp Utilities 2007", "&Weiter >", "Button1")

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

    WinWait("TuneUp Utilities 2007", "TuneUp Utilities 2007 wurde erfolgreich installiert")
    If Not WinActive("TuneUp Utilities 2007") Then WinActivate("TuneUp Utilities 2007")
    ControlClick ("TuneUp Utilities 2007", "&Fertig stellen", "Button1")

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

    WinWait("Update-Prüfung empfohlen")
    If Not WinActive("Update-Prüfung empfohlen") Then WinActivate("Update-Prüfung empfohlen")
    ControlCommand("Update-Prüfung empfohlen", "Updates für meine TuneUp-Produkte", "TComboBox1", "SelectString", "Nicht erinnern")
    ControlClick ("Update-Prüfung empfohlen", "OK", "TButton1")

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

    WinWait("TuneUp Utilities 2007", "Code eingeben")
    If Not WinActive("TuneUp Utilities 2007") Then WinActivate("TuneUp Utilities 2007")
    ControlClick ("TuneUp Utilities 2007", "Code eingeben", "TButton3")

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

    WinWait("Code eingeben")
    If Not WinActive("Code eingeben") Then WinActivate("Code eingeben")
    ControlSetText("Code eingeben","","TEdit2"," ")
    ControlSetText("Code eingeben","","TEdit1"," ")
    ControlSetText("Code eingeben","","TTURegCodeEdit1",$snkey)
    ControlClick ("Code eingeben", "OK", "TButton2")

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

    WinWait("Vielen Dank!")
    If Not WinActive("Vielen Dank!") Then WinActivate("Vielen Dank!")
    ControlClick ("Vielen Dank!", "OK", "Button1")

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

    WinWait("Programm-Neustart erforderlich")
    If Not WinActive("Programm-Neustart erforderlich") Then WinActivate("Programm-Neustart erforderlich")
    ControlClick ("Programm-Neustart erforderlich", "OK", "Button1")

    [/autoit]

    ----------------------------------------------------------------------------------------------------------------------
    Früher musste man Drachen töten und konnte die Jungfrau heiraten.
    Heute gibt es keine Jungfrauen mehr, man muss den Drachen heiraten!

    Einmal editiert, zuletzt von XTC99 (20. Mai 2009 um 15:53)

  • Grundsätzlich würde mich interessieren, ob andere ähnliche Beobachtungen gemacht haben und ob es Möglichkeiten gibt, daß AutoIT die Programme zuverlässiger steuert - bzw. wo mein Fehler liegt.

    Ich hatte anfangs auch Probleme mit 'zufälligen' Ergebnissen meiner Installationsskripte. Inzwischen habe ich mir angewöhnt, Benutzereingaben vor einer Skriptaktion zu sperren und sicher zu stellen, dass das gewünschte Fenster auch wirklich aktiv ist. Außerdem verwende ich für Controlclicks so gut wie nie Mauskoordinaten. Seitdem gibts eigentlich kaum noch Probleme.

    Ich hab mal einen Ausschnitt deines FF-Skripts, in dem der Einstellungsdialog aufgerufen wird, beispielhaft in meinem Sinne geändert:

    [autoit]

    ShellExecute('firefox.exe') ; nur für meine Testzwecke

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

    BlockInput(1) ; Benutzereingaben sperren

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

    Opt("WinTitleMatchMode", 2) ;1=vom Anfang, 2=enthält, 3=genau, 4=fortgeschritten, -1 bis -4=Groß-/Klein ignorieren

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

    $FensterTitel = "Mozilla Firefox"

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

    If WinWait($FensterTitel, "", 3) = 1 Then ; Auf das Firefox-Fenster 3s warten
    If Not WinActive($FensterTitel, "") Then WinActivate($FensterTitel, "") ; wenn nicht aktiviert, dann aktivieren
    If Not WinWaitActive($FensterTitel, "", 2) Then ; wenn nach 2s immer noch nicht aktiv, dann Skript abbrechen
    BlockInput(0) ; Benutzereingaben freigeben
    Exit
    EndIf

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

    Opt("WinTitleMatchMode", 1) ;1=vom Anfang, 2=enthält, 3=genau, 4=fortgeschritten, -1 bis -4=Groß-/Klein ignorieren

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

    ;Fenster maximieren
    WinSetState($FensterTitel, "", @SW_MAXIMIZE)

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

    ;Einstellungen
    Send("!x") ;Extras
    Sleep(50)
    Send("e") ;Einstellungen

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

    ; ...

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

    EndIf

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

    BlockInput(0) ; Benutzereingaben freigeben

    [/autoit]

    Ich hoffe, das hilft ein wenig weiter.

    Gruß Ashpool

    Gruß Ashpool

    Zitat von mir

    Bin immer wieder erstaunt, wie begrenzt ein Horizont sein kann.

  • Vielen Dank. Ich werde mich damit heute auseinandersetzen. Der "Opt"-Befehl war mir noch nicht bekannt.

    Eine Frage noch:

    Was hat das in eckigen Klammern [] stehende AutoIT bzw. /AutoIT zu bedeuten?

    Viele Grüße
    Michael

  • Was hat das in eckigen Klammern [] stehende AutoIT bzw. /AutoIT zu bedeuten?


    Damit wird der Text hier im Forum als AutoIt-Quelltext formatiert. Es wird eingefügt, wenn du im beim Erstellen der Nachricht im Editor den AutoIt-Button anklickst. Alles was dazwischen steht, wird in der normalen Forumsansicht von einer Codebox umgeben und mit Farb- und Schriftattributen versehen, als wenn du den Code in SciTe geöffnet hättest.
    Aber eigentlich siehtst du das ja nur, wenn du eine Nachricht schreibst. Bei deinem letzen Post scheint sowieso etwas durcheinandergekommen zu sein, das was als Zitat von mir angegeben wird, ist ja eigentlich deine Antwort.
    ?(

    Gruß Ashpool

    Zitat von mir

    Bin immer wieder erstaunt, wie begrenzt ein Horizont sein kann.