Exception Fenster einer Anwendung stoppt Autoit Script?

  • Hallo,

    wahrscheinlich stelle ich jetzt eine totale Anfängerfrage, also steinigt mich bitte nicht gleich. Aber ich finde keine Antwort auf meine Frage in den tiefen des www.

    Ich will die GUI einer Anwendung mit AutoIt automatisch testen lassen. Das Script soll dazu einfach verschiedene Fenster öffnen und durchklicken. Im Fehlerfall sollte es am besten den Stacktrace aus dem Exception Window kopieren und irgendwo speichern. Mein Problem ist jetzt, dass ich zwar das Programmfenster öffnen kann, dann durch etwaige Tabs klicke, aber das Script bei einem Fehler einfach stehen bleibt. Die Anwendung zeigt das Fehlerfenster, aber ich kann einfach nicht darauf zugreifen. Erst wenn ich das Fenster mit "Beenden" schließe läuft das Script weiter. Ist das so gewollt oder kann man das irgendwie umgehen?

    Mein Code zum Aufrufen der Tabs sieht so aus:

    [autoit]


    MsgBox(48, "Attention", "Now we change a tab item");
    _GUICtrlTab_SetCurFocus($hTab, 1);
    $sResult = _SendMessage($hWnd, $WM_NOTIFY, $TabID, $TCN_SELCHANGE);
    if @error Then
    MsgBox(48, "Fehler!", "Fehler "& @error);
    Exit
    EndIf
    MsgBox(48, "Attention", "exception?");

    [/autoit]

    Die erste Messagebox erscheint, die zweite wird erst nach "Beenden" wieder angezeigt.

    Danke!

    Einmal editiert, zuletzt von MoJo2600 (10. März 2010 um 16:04)

  • Hallo MoJo2600,

    verwende doch für die MsgBox den TimeOut-Parameter:

    [autoit]

    MsgBox(48, "Fehler!", "Fehler "& @error,20);wartet 20 Sekunden und beendet dann automatisch

    [/autoit]

    Oder du gibst die Fehlermeldungen in ein File aus und vermeidest MsgBox ganz,

    mfg (Auto)Bert

  • Sorry, das war etwas missverständlich ausgedrückt. Die erste erscheint, der Fall mit dem IF tritt nicht ein, weil @error nicht gesetzt ist. Aber die letzte Box wird nicht angezeigt.

    Es scheint als würde er an der Stelle mit dem _SendMessage stehen bleiben, weil dieses Exception Window aufgegangen ist. Auf das kann ich auch mit WinWaitActive oder so nicht zugreifen. Was ganz uncool ist.

  • Hallo MoJo2600,

    sag uns doch bitte um welche Anwendung es sich handelt. Ein paar ScreenShots dazu wären auch nicht schlecht. Auch solltest du das komplette Skript posten,

    mfg (Auto)Bert

  • Hallo,

    Screenshots sind schwierig, weil die Anwendung ein Prototyp für unsere neue Software ist, die ich nicht zeigen darf. Grundsätzlich habe ich ein Fenster, auf dem ein Panel mit Tabs liegt. wenn ich dort das Tab wechsle, erhalte ich eine Exception wie die folgende. Das ist eine 0815 Exception die Auftreten kann wenn man mit C# programmiert. Wie gesagt, ich will das Script ja dazu "missbrauchen", dass es mir einfach die Tabs durchklickt und in einem solchen Fehlerfall den Text irgendwo hin speichert. Also eine abgespeckte Version automatisierter Tests. Nur, um es noch einmal zu wiederholen, an der Stelle, an der dieses Fenster auftaucht, scheint das Script zu pausieren.

    [Blockierte Grafik: http://img51.imageshack.us/img51/6771/exceptiona.png]


    [autoit]


    #include <WindowsConstants.au3>
    #include <GuiTab.au3>
    #include <array.au3>

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

    Opt("WinWaitDelay",100)
    Opt("WinDetectHiddenText",1)
    Opt("MouseCoordMode",0)
    Opt("WinSearchChildren", 1);

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

    $title = "proSoftOffice - Alles andere ist doch kalter Kaffee!";

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

    WinWaitActive($title);
    MouseClick("left", 33, 33);
    MouseClick("left", 58,59);

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

    #cs
    Drei Sekunden warten
    #ce
    Sleep(3000);

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

    $hWnd = WinGetHandle($title);
    $hTab = ControlGetHandle($hWnd, "", "WindowsForms10.SysTabControl32.app.0.385b8a21");

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

    $TabID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hTab);
    $TabID = $TabID[0];

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

    _GUICtrlTab_SetCurFocus($hTab, 1);
    $sResult = _SendMessage($hWnd, $WM_NOTIFY, $TabID, $TCN_SELCHANGE);
    if @error Then
    MsgBox(48, "Fehler!", "Fehler "& @error);
    Exit
    EndIf

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

    $t = _WinWaitActivate("proSoft Office® Schwerwiegender Fehler","Außerdem können Sie ", 1);
    MsgBox(48, "Fehler!", "Fehler "& $t);

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

    #region --- Internal functions Au3Recorder Start ---
    Func _WinWaitActivate($title,$text,$timeout=0)
    WinWait($title,$text,$timeout)
    If Not WinActive($title,$text) Then WinActivate($title,$text)
    return WinWaitActive($title,$text,$timeout)
    EndFunc
    #endregion --- Internal functions Au3Recorder End ---

    [/autoit]
  • Hallo MoJo2600,

    der Fenstertitel und auch der Text, den du in Zeile 35 zum aufrufen von _WinWaitActivate verwendest stimmt nicht mit dem Screenshot überein. Oft kommt es auch vor, dass doppelte Leerzeichen beim abtippen übersehen werden, benutze doch daher das AutoIt Window Info Tool (Program Files\AutoIt3\AU3Info.exe) und kopier dir damit die Texte,

    mfg (Auto)Bert

  • Ja, das ist mir gerade auch aufgefallen. Aber komischerweise erkennt der AutoIt Finder das Fehlerfenster nicht als eigenes Window. Die Controls erkennt er, aber das Fenster wird immer dem "Parent" zugeordnet. Das _WinAPI_PostMessage verhält sich genauso _SendMessage. Hm... jetzt gehen mir langsam die Ideen aus, was ich noch testen könnte.

  • Hm... also das SendMessage oder PostMessage scheinen nicht das Problem zu sein. _GUICtrlTab_SetCurFocus($hTab, 1); verursacht anscheinend das stehen bleiben. Wenn ich alles ganz simpel mit Maus Clicks nachbilde funktioniert es. Dann wird auch korrekt auf das Fehlerfenster reagiert.

    Kann man dieses SetCurFocus auch in ein PostMessage umwandeln?

  • Yay... so scheint es zu funktionieren:

    [autoit]


    _WinAPI_PostMessage($hTab, $TCM_SETCURFOCUS, 1, 0);
    _WinAPI_PostMessage($hWnd, $WM_NOTIFY, $TabID, $TCN_SELCHANGE);

    [/autoit]

    Vielen Dank für alle Tipps!

    Einmal editiert, zuletzt von MoJo2600 (10. März 2010 um 16:03)