SourceFiles.org - Use the Source, Luke
Home | Register | News | Forums | Guide | MyLinks | Bookmark

Related Sites

Latest News
  General News
  Reviews
  Press Releases
  Software
  Hardware
  Security
  Tutorials
  Off Topic


Back to files

NAME

X11::GUITest - Provides GUI testing/interaction facilities.

Developed by Dennis K. Paulsen

VERSION

0.21

Updates are made available at the following sites:

      http://sourceforge.net/projects/x11guitest (Primary) 
      http://www.freshmeat.net (Linked)
      http://www.cpan.org (Secondary)

Please consult 'docs/Changes' for the list of changes between module revisions.

DESCRIPTION

This Perl package is intended to facilitate the testing of GUI applications by means of user emulation. It can be used to test/interact with GUI applications; which have been built upon the X library or toolkits (i.e., GTK+, Xt, Qt, Motif, etc.) that "wrap" the X library's functionality.

DEPENDENCIES

An X server with the XTest extensions enabled. This seems to be the norm. If it is not enabled, it usually can be by modifying the X server configuration (i.e., XF86Config).

The standard DISPLAY environment variable is utilized to determine the host, display, and screen to work with. By default it is usually set to ":0.0" for the localhost. However, by altering this variable one can interact with applications under a remote host's X server. To change this from a terminal window, one can utilize the following basic syntax: export DISPLAY=<hostname-or-ipaddress>:<display>.<screen> Please note that under most circumstances, xhost will need to be executed properly on the remote host as well.

There is a known incompatibility between the XTest and Xinerama extensions, which causes the XTestFakeMotionEvent() function to misbehave. When the Xinerama (X server) extension is turned on, this (Perl) extension has been modified to allow one to invoke an alternative function. See Makefile.PL for details.

INSTALLATION

      perl Makefile.PL
      make
      make test
      make install

SYNOPSIS

For additional examples, please look under the 'eg/' sub-directory from the installation folder.

      use X11::GUITest qw/
        StartApp
        WaitWindowViewable
        SendKeys
      /;

      # Start gedit application
      StartApp('gedit');

      # Wait for application window to come up and become viewable. 
      my ($GEditWinId) = WaitWindowViewable('gedit');
      if (!$GEditWinId) {
        die("Couldn't find gedit window in time!");
      }

      # Send text to it
      SendKeys("Hello, how are you?\n");

      # Close Application (Alt-f, q).
      SendKeys('%(f)q');

      # Handle gedit's Question window if it comes up when closing.  Wait
      # at most 5 seconds for it.
      if (WaitWindowViewable('Question', undef, 5)) {
        # DoN't Save (Alt-n)
        SendKeys('%(n)');
      }

FUNCTIONS

Parameters enclosed within [] are optional.

If there are multiple optional parameters available for a function and you would like to specify the last one, for example, you can utilize undef for those parameters you don't specify.

REGEX in the documentation below denotes an item that is treated as a regular expression. For example, the regex "^OK$" would look for an exact match for the word OK.

FindWindowLike TITLEREGEX [, WINDOWIDSTARTUNDER]

            Finds the window Ids of the windows matching the specified title
            regex. Optionally one can specify the window to start under;
            which would allow one to constrain the search to child windows
            of that window.

            An array of window Ids is returned for the matches found. An
            empty array is returned if no matches were found.

              my @WindowIds = FindWindowLike('gedit');
              # Only worry about first window found
              my ($WindowId) = FindWindowLike('gedit');

WaitWindowLike TITLEREGEX [, WINDOWIDSTARTUNDER] [, MAXWAITINSECONDS]

            Waits for a window to come up that matches the specified title
            regex. Optionally one can specify the window to start under;
            which would allow one to constrain the search to child windows
            of that window.

            One can optionally specify an alternative wait amount in
            seconds. A window will keep being looked for that matches the
            specified title regex until this amount of time has been
            reached. The default amount is defined in the DEF_WAIT constant
            available through the :CONST export tag.

            If a window is going to be manipulated by input,
            WaitWindowViewable is the more robust solution to utilize.

            An array of window Ids is returned for the matches found. An
            empty array is returned if no matches were found.

              my @WindowIds = WaitWindowLike('gedit');
              # Only worry about first window found
              my ($WindowId) = WaitWindowLike('gedit');

              WaitWindowLike('gedit') or die("gedit window not found!");

WaitWindowViewable TITLEREGEX [, WINDOWIDSTARTUNDER] [, MAXWAITINSECONDS]

            Similar to WaitWindow, but only recognizes windows that are
            viewable. When GUI applications are started, their window isn't
            necessarily viewable yet, let alone available for input, so this
            function is very useful.

            Likewise, this function will only return an array of the
            matching window Ids for those windows that are viewable. An
            empty array is returned if no matches were found.

WaitWindowClose WINDOWID [, MAXWAITINSECONDS]

Waits for the specified window to close.

            One can optionally specify an alternative wait amount in
            seconds. The window will keep being checked to see if it has
            closed until this amount of time has been reached. The default
            amount is defined in the DEF_WAIT constant available through the
            :CONST export tag.

            zero is returned if window is not gone, non-zero if it is gone.

ClickWindow WINDOWID [, X Offset] [, Y Offset] [, Button]

Clicks on the specified window with the mouse.

            Optionally one can specify the X offset and Y offset. By
            default, the top left corner of the window is clicked on, with
            these two parameters one can specify a different position to be
            clicked on.

            One can also specify an alternative button. The default button
            is M_LEFT, but M_MIDDLE and M_RIGHT may be specified too. Also,
            you could use the logical Id for the button: M_BTN1, M_BTN2,
            M_BTN3, M_BTN4, M_BTN5. These are all available through the
            :CONST export tag.

            zero is returned on failure, non-zero for success

GetWindowFromPoint X, Y [, SCREEN]

            Returns the window that is at the specified point. If no screen
            is given, it is taken from the value given when opening the X
            display.

            zero is returned if there are no matches (i.e., off screen).

IsChild PARENTWINDOWID, WINDOWID

            Determines if the specified window is a child of the specified
            parent.

            zero is returned for false, non-zero for true.

QuoteStringForSendKeys STRING

            Quotes {} characters in the specified string that would be
            interpreted as having special meaning if sent to SendKeys
            directly. This function would be useful if you had a text file
            in which you wanted to use each line of the file as input to the
            SendKeys function, but didn't want any special interpretation of
            the characters in the file.

            Returns the quoted string, undef is returned on error.

               Quote  ~, %, etc.  as  {~}, {%}, etc for literal use in SendKeys. 
              SendKeys( QuoteStringForSendKeys('Hello: ~%^(){}+') );

StartApp COMMANDLINE

            Uses the shell to execute a program. This function returns as
            soon as the program is called. Useful for starting GUI
            applications and then going on to work with them.

            zero is returned on failure, non-zero for success

              StartApp('gedit');

RunApp COMMANDLINE

Uses the shell to execute a program until its completion.

            Return value will be application specific, however -1 is
            returned to indicate a failure in starting the program.

              RunApp('/work/myapp');

ClickMouseButton BUTTON

            Clicks the specified mouse button. Available mouse buttons are:
            M_LEFT, M_MIDDLE, M_RIGHT. Also, you could use the logical Id
            for the button: M_BTN1, M_BTN2, M_BTN3, M_BTN4, M_BTN5. These
            are all available through the :CONST export tag.

            zero is returned on failure, non-zero for success.

<Documentation Continued...>

DefaultScreen

            Returns the screen number specified in the X display value used
            to open the display.

ScreenCount

            Returns the number of screens in the X display specified when
            opening it.

SetEventSendDelay DELAYINMILLISECONDS

            Sets the milliseconds of delay between events being sent to the
            X display. It is usually not a good idea to set this to 0.

            Please note that this delay will also affect SendKeys.

            Returns the old delay amount in milliseconds.

GetEventSendDelay

Returns the current event sending delay amount in milliseconds.

SetKeySendDelay DELAYINMILLISECONDS

Sets the milliseconds of delay between keystrokes.

Returns the old delay amount in milliseconds.

GetKeySendDelay

            Returns the current keystroke sending delay amount in
            milliseconds.

GetWindowName WINDOWID

            Returns the window name for the specified window Id. undef is
            returned if name could not be obtained.

              # Return the name of the window that has the input focus.
              my $WinName = GetWindowName(GetInputFocus());

SetWindowName WINDOWID, NAME

Sets the window name for the specified window Id.

zero is returned on failure, non-zero for success.

GetRootWindow [SCREEN]

            Returns the Id of the root window of the screen. This is the
            top/root level window that all other windows are under. If no
            screen is given, it is taken from the value given when opening
            the X display.

GetChildWindows WINDOWID

            Returns an array of the child windows for the specified window
            Id. If it detects that the window hierarchy is in transition, it
            will wait half a second and try again.

MoveMouseAbs X, Y [, SCREEN]

            Moves the mouse cursor to the specified absolute position in the
            optionally given screen. If no screen is given, it is taken from
            the value given when opening the X display.

            Zero is returned on failure, non-zero for success.

GetMousePos

            Returns an array containing the position and the screen (number)
            of the mouse cursor.

              my ($x, $y, $scr_num) = GetMousePos(); 

PressMouseButton BUTTON

            Presses the specified mouse button. Available mouse buttons are:
            M_LEFT, M_MIDDLE, M_RIGHT. Also, you could use the logical Id
            for the button: M_BTN1, M_BTN2, M_BTN3, M_BTN4, M_BTN5. These
            are all available through the :CONST export tag.

            zero is returned on failure, non-zero for success.

ReleaseMouseButton BUTTON

            Releases the specified mouse button. Available mouse buttons
            are: M_LEFT, M_MIDDLE, M_RIGHT. Also, you could use the logical
            Id for the button: M_BTN1, M_BTN2, M_BTN3, M_BTN4, M_BTN5. These
            are all available through the :CONST export tag.

            zero is returned on failure, non-zero for success.

SendKeys KEYS

Sends keystrokes to the window that has the input focus.

            The keystrokes to send are those specified in KEYS parameter.
            Some characters have special meaning, they are:

                    Modifier Keys:
                    ^       CTRL
                    %       ALT
                    +       SHIFT
                    #       META

                    Other Keys:
                    ~       ENTER
                    \n      ENTER
                    \t      TAB
                    ( and ) MODIFIER GROUPING
                    { and } QUOTE / ESCAPE CHARACTERS

            Simply, one can send a text string like so:

                    SendKeys('Hello, how are you today?');

            Parenthesis allow a modifier to work on one or more characters.
            For example:

                    SendKeys('%(f)q'); # Alt-f, then press q
                    SendKeys('%(fa)^(m)'); # Alt-f, Alt-a, Ctrl-m
                    SendKeys('+(abc)'); # Uppercase ABC using shift modifier
                    SendKeys('^(+(l))'); # Ctrl-Shift-l
                    SendKeys('+'); # Press shift

            Braces are used to quote special characters, for utilizing
            aliased key names, or for special functionality. Multiple
            characters can be specified in a brace by space delimiting the
            entries. Characters can be repeated using a number that is space
            delimited after the preceeding key.

            Quote Special Characters

                    SendKeys('{{}'); # {
                    SendKeys('{+}');  +
                    SendKeys('{}'); # #

                    You can also use QuoteStringForSendKeys to perform quoting.

            Aliased Key Names

                    SendKeys('{BAC}'); # Backspace
                    SendKeys('{F1 F2 F3}'); # F1, F2, F3
                    SendKeys('{TAB 3}'); # Press TAB 3 times
                    SendKeys('{SPC 3 a b c}'); # Space 3 times, a, b, c

            Special Functionality

                    # Pause execution for 500 milliseconds
                    SendKeys('{PAUSE 500}');

            Combinations

                    SendKeys('abc+(abc){TAB PAUSE 500}'); # a, b, c, A, B, C, Tab, Pause 500
                    SendKeys('+({a b c})'); # A, B, C

            The following abbreviated key names are currently recognized
            within a brace set. If you don't see the desired key, you can
            still use the unabbreviated name for the key. If you are unsure
            of this name, utilize the xev (X event view) tool, press the key
            you want and look at the tools output for the name of that key.
            Names that are in the list below can be utilized regardless of
            case. Ones that aren't in this list are going to be case
            sensitive and also not abbreviated. For example, using 'xev' you
            will find that the name of the backspace key is BackSpace, so
            you could use {BackSpace} in place of {bac} if you really wanted
            to.

Name Action

BAC BackSpace BS BackSpace BKS BackSpace BRE Break CAN Cancel CAP Caps_Lock DEL Delete DOW Down END End ENT Return ESC Escape F1 F1 ... ... F12 F12 HEL Help HOM Home INS Insert LAL Alt_L LMA Meta_L LCT Control_L LEF Left LSH Shift_L LSK Super_L MNU Menu NUM Num_Lock PGD Page_Down PGU Page_Up PRT Print RAL Alt_R RMA Meta_R RCT Control_R RIG Right RSH Shift_R RSK Super_R SCR Scroll_Lock SPA Space SPC Space TAB Tab UP Up zero is returned on failure, non-zero for success. For configurations (Xvfb) that don't support Alt_Left, Meta_Left is automatically used in its place.

PressKey KEY

Presses the specified key.

            One can utilize the abbreviated key names from the table listed
            above as outlined in the following example:

              # Alt-n
              PressKey('LAL'); # Left Alt
              PressKey('n');
              ReleaseKey('n');
              ReleaseKey('LAL');

              # Uppercase a
              PressKey('LSH'); # Left Shift
              PressKey('a'); 
              ReleaseKey('a');
              ReleaseKey('LSH');

            The ReleaseKey calls in the above example are there to set both
            key states back.

            zero is returned on failure, non-zero for success.

ReleaseKey KEY

Releases the specified key. Normally follows a PressKey call.

            One can utilize the abbreviated key names from the table listed
            above.

              ReleaseKey('n');

            zero is returned on failure, non-zero for success.

PressReleaseKey KEY

Presses and releases the specified key.

            One can utilize the abbreviated key names from the table listed
            above.

              PressReleaseKey('n');

            This function is affected by the key send delay.

            zero is returned on failure, non-zero for success.

IsKeyPressed KEY

Determines if the specified key is currently being pressed.

            You can specify such things as 'bac' or the unabbreviated form
            'BackSpace' as covered in the SendKeys information. Brace forms
            such as '{bac}' are unsupported. A '{' is taken literally and
            letters are case sensitive.

              if (IsKeyPressed('esc')) {  # Is Escape pressed?
              if (IsKeyPressed('a')) { # Is a pressed?
              if (IsKeyPressed('A')) { # Is A pressed?

            Returns non-zero for true, zero for false.

IsMouseButtonPressed BUTTON

            Determines if the specified mouse button is currently being
            pressed.

            Available mouse buttons are: M_LEFT, M_MIDDLE, M_RIGHT. Also,
            you could use the logical Id for the button: M_BTN1, M_BTN2,
            M_BTN3, M_BTN4, M_BTN5. These are all available through the
            :CONST export tag.

              if (IsMouseButtonPressed(M_LEFT)) { # Is left button pressed?

            Returns non-zero for true, zero for false.

IsWindow WINDOWID

            zero is returned if the specified window Id is not for something
            that can be recognized as a window. non-zero is returned if it
            looks like a window.

IsWindowViewable WINDOWID

            zero is returned if the specified window Id is for a window that
            isn't viewable. non-zero is returned if the window is viewable.

MoveWindow WINDOWID, X, Y

Moves the window to the specified location.

zero is returned on failure, non-zero for success.

ResizeWindow WINDOWID, WIDTH, HEIGHT

Resizes the window to the specified size.

zero is returned on failure, non-zero for success.

IconifyWindow WINDOWID

Minimizes (Iconifies) the specified window.

zero is returned on failure, non-zero for success.

UnIconifyWindow WINDOWID

Unminimizes (UnIconifies) the specified window.

zero is returned on failure, non-zero for success.

RaiseWindow WINDOWID

            Raises the specified window to the top of the stack, so that no
            other windows cover it.

            zero is returned on failure, non-zero for success.

LowerWindow WINDOWID

            Lowers the specified window to the bottom of the stack, so other
            existing windows will cover it.

            zero is returned on failure, non-zero for success.

GetInputFocus

Returns the window that currently has the input focus.

SetInputFocus WINDOWID

            Sets the specified window to be the one that has the input
            focus.

            zero is returned on failure, non-zero for success.

GetWindowPos WINDOWID

            Returns an array containing the position information for the
            specified window. It also returns size information (including
            border width) and the number of the screen where the window
            resides.

              my ($x, $y, $width, $height, $borderWidth, $screen) =
                    GetWindowPos(GetRootWindow());

GetParentWindow WINDOWID

Returns the parent of the specified window.

            zero is returned if parent couldn't be determined (i.e., root
            window).

GetScreenRes [SCREEN]

            Returns the screen resolution. If no screen is specified, it is
            taken from the value given when opening the X display. If the
            screen (number) is invalid, the returned list will be empty.

              my ($x, $y) = GetScreenRes();

GetScreenDepth [SCREEN]

            Returns the color depth for the screen. If no screen is
            specified, it is taken from the value given when opening the X
            display. If the screen (number) is invalid, -1 will be returned.

            Value is represented as bits, i.e. 16.

              my $depth = GetScreenDepth();

OTHER DOCUMENTATION
Available under the docs sub-directory.

      Changes (Module Changes)
      CodingStyle (Coding-Style Guidelines)
      ToDo (ToDo List)
      Copying (Copy of the GPL License)

COPYRIGHT

Copyright(c) 2003-2006 Dennis K. Paulsen, All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License.

AUTHOR

Dennis K. Paulsen <ctrondlp@cpan.org> (Des Moines, Iowa USA)

CREDITS

Thanks to everyone; including those specifically mentioned below for patches, suggestions, etc.:

      Alexey Tourbin
      Richard Clamp
      Gustav Larsson
      Nelson D. Caro


Other Sites

Discussion Groups
  Beginners
  Distributions
  Networking / Security
  Software
  PDAs

About | FAQ | Privacy | Awards | Contact
Comments to the webmaster are welcome.
Copyright 2006 Sourcefiles.org All rights reserved.