Anmelden Registrieren

Badges

Follow Peter Bouda on Google Plus

Feeds

Neueste BlogeinträgeBlog

Automatisierung von Windows-Anwendungen mit Perl

Bearbeitet am Mittwoch, 16. März 2011, 11:29 Uhr von pbouda

Wenn man Anwendungen testet oder es für irgendeine Anwendungsfunktion kein API gibt, dann versucht man meist bestimmte Aufgaben mit einer Software oder einem Skript zu automatisieren. Unter Windows gibt es das hervorragende AutoIt, was für die GUI-Steuerung so ziemlich alles beinhaltet, was der QA-Mensch so braucht. Weniger bekannt ist, dass sich auch Perl gut für Automatisierungsaufgaben eignet. Man kann per Perl auf alle COM-Objekte zugreifen, man kann auf einzelne GUI-Elemente von Anwendungen zugreifen und diese so fernsteuern. Alles was man braucht ist bei ActivePerl in den Win32::*-Modulen versteckt.

Hier ein kleines Beispiel für den Zugriff auf Notepad. Das Skript verwendet zum Finden und steuern des Notepadfensters zwei Funktionen (“FindWindowA” und “SetForegroundWindow”) aus der Bibliothek user32.dll, die über das Modul Win32::API angesteuert werden. Dann erfolgen alle weiteren Zugriffe direkt in das Fenster hinein über das Win32::GUI-Modul. In diesem Fall greift das Skript auf das 15. Element des Fensters zu (“Win32::GUI::GetDlgItem( $hwnd, 15 );”). In diese Element schreibt das Skript einen Text hinein, der anschließend wieder ausgelesen wird und in eine Datei gespeichert wird. Zwischendrin wird immer wieder “sleep” aufgerufen, damit auch langsamere Rechner Zeit bekommen, alles bis zum Ende auszuführen. Hier also das Skript:

use Win32::API;
use Win32::GUI qw { WM_CLOSE };

my $findwindow = new Win32::API("user32", "FindWindowA", ['P','P'], 'N');

my $setforegroundwindow = new Win32::API("user32",  "SetForegroundWindow",  ['N'], 'N');

# Notepad im Hintergrund starten
system(1,'c:\\windows\\system32\\notepad.exe');

sleep(3);

# Notepad in den Vordergrund holen
my $hwnd = $findwindow->Call('Notepad', 0);
my $rv = $setforegroundwindow->Call($hwnd);

# das Text-Edit-Control von Notepad finden
$textbox = Win32::GUI::GetDlgItem( $hwnd, 15 ); 

# Inhalt schreiben
Win32::GUI::Textfield::Append($textbox, "Hallo Notepad!\r\nDieser Text wird gleich gespeichert, bitte warten...");

sleep(2);

# Inhalt auslesen
$count = Win32::GUI::Textfield::GetLineCount($textbox);
$content = '';
for (my $i = 0; $i<$count; $i++) {
$content .= Win32::GUI::Textfield::GetLine($textbox,$i)."\n";
}

# Um den "Speichern"-Dialog zu verhindern beim Schließen...
Win32::GUI::Textfield::SetModify($textbox,0);

sleep(1);

# Notepad schließen
Win32::GUI::SendMessage($hwnd, WM_CLOSE, 0, 0);

open(F,">notepad-inhalt.txt");
print F $content;
close(F);