NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4392 most downloaded on PyPI
A set of Python modules to automate the Microsoft Windows GUI
Last release 2 years ago
no release in 18 months
Ships unpredictably
gaps range from 3 weeks to 5.2 years
Nearly every release is documented
notes for 29 of 30 stable releases
Nothing withdrawn
no release was ever pulled
21 years old
30 releases · first in 2006
The last Python 2.7 compatible release with pinned dependencies.
06-January-2025
Add allow_magic_lookup flag for Application and Desktop object. Thanks @pakal!
allow_magic_lookup flag for Application and Desktop object. Thanks @pakal!win32_hooks.py. Thanks @TomRobo237!vk_packet=False in method type_keys, default value is vk_packet=True. Thanks @philmbailey!__init__.py. Thanks @pakal!remote_memory_block.py. Thanks @TomRobo237!One column per quarter.
27-October-2019
Enhancements:
allow_magic_lookup flag for Application and Desktop object. Thanks pakal_!win32_hooks.py. Thanks TomRobo237_!vk_packet=False in method type_keys, default value is vk_packet=True. Thanks philmbailey_!Bug Fixes:
__init__.py. Thanks pakal_!remote_memory_block.py. Thanks TomRobo237_!.. _pakal: https://github.com/pakal .. _TomRobo237: https://github.com/TomRobo237 .. _olesteban: https://github.com/olesteban .. _caoyaxing221: https://github.com/caoyaxing221 .. _nuno-andre: https://github.com/nuno-andre .. _philmbailey: https://github.com/philmbailey
Reuse ctypes.wintypes more to avoid redundant definitions for Win32 API.
ctypes.wintypes more to avoid redundant definitions for Win32 API.EditWrapper.is_editable() for "uia" backend.InvalidControlType properly.menu_select() for one level main menu in WinForms apps.Application object non-iterable (iterating was hang).GetWindowRect (method .rectangle()).dump_tree() / print_control_identifiers().Improve support for WinForms and Qt5: ComboBox, ListBox, DataGrid/Table.
kill() hard (and fast) by default (can be used with param soft=True optionally).visible_only=False a default option for method connect() (useful for minimized apps).down and up for .type_keys() method. See the improved docs for keyboard module for more details. Thanks @badari412 !windows() to class Desktop.UnicodeDecodeError/UnicodeEncodeError in several cases
while printing wrapper object representation.backend="uia".COMError for runtime_id property.click() for some radio buttons.utf-8 encoding while writing dump_tree() output to file.backend="win32".GetWindowRect call.Check admin privileges for both target app and Python process. This allows detecting cases when window messages won't work.
automation_id and control_type properties
for "win32" backend (the most useful for WinForms). Correct
child_window() keywords are auto_id and control_type.iter_children() and iter_descendants().is_checked() to "win32" check box.Application().connect(...) works better with timeout
argument..set_focus() for "uia" backend including minimized window case
(issue #443).maximize()/minimize() methods can be chained now.@always_wait_until_passes and @always_wait_until..format() for logging BaseWrapper actions (issue #471).Final fix for ValueError: NULL COM pointer access (UIA backend).
ValueError: NULL COM pointer access (UIA backend).Multi-threading mode (MTA) for comtypes is enabled by default, if it's not initialized by another library before importing pywinauto.
Method get_value() has been added to EditWrapper in UIA backend.
Method scroll() has been added for all UIA controls which have ScrollPattern implemented.
Added methods is_minimized/is_maximized/is_normal/get_show_state for UIAWrapper.
Added handling in-place controls inside ListView control and (row, column) indexing in a grid-like table mode. Examples:
auto_detected_ctrl = list_view.get_item(0).inplace_control()
combo = list_view.get_item(1,1).inplace_control("ComboBox")
combo.select("Item name")
edit = list_view.get_item(3,4).inplace_control("Edit")
edit.type_keys("some text{ENTER}", set_foreground=False)
dt_picker = list_view.get_item(2,0).inplace_control("DateTimePicker")
Improved string representation for all wrapper objects. Thanks @airelil!
backend="uia".wait/wait_not methods:
wait('exists') doesn't work for backend="uia". Thanks @maollm!wait/wait_not take ~ default time (5 sec.) instead of customized timeout like 1 sec.depth param can used in a WindowSpecification now. depth=1 means this control,
depth=2 means immediate children only and so on (aligned with print_control_identifiers method). Thanks @dmitrykazanbaev!send_chars is supposed to send character input (this includes {Enter}, {Tab}, {Backspace}) without Alt/Shift/Ctrl modifiers.send_keystrokes is for key input (including key combinations with Alt/Shift/Ctrl modifiers).Application().connect(path='your.exe') uses default timeout Timings.app_connect_timeout.
It can accept timeout and retry_interval keyword arguments. Thanks @daniil-kukushkin!print_control_identifiers is more consistent and minimum 2x faster now! Thanks @cetygamer!Application with your own methods. Thanks @efremovd!work_dir can be used in Application().start(...). Thanks @efremovd!Application has been enriched with methods is_process_running() and wait_for_process_exit(). Thanks @efremovd!timings uses time.clock() for Python 2.x and time.perf_counter() for Python 3.x
so that accident system time change can't affect on your script behavior. Thanks @airelil!print_control_identifiers() can dump UI elements tree to a file. Thanks @sovrasov!backend="uia", extended example for MS Paint. Thanks @ArtemSkrebkov!CalendarWrapper for backend="win32" with these methods: get_month_delta,
set_month_delta and get_month_range. Thanks @Nikita-K!legacy_properties() to UIAWrapper. Thanks @AsyaPronina!backend="win32". Thanks @KirillMoizik!TreeViewWrapper for backend="win32"
(argument 4: <type 'exceptions.OverflowError'>: long int too long to convert).03-July-2017
Improved string representation for all wrapper objects. Thanks airelil_!
Fixed several sporadic crashes for backend="uia".
Fixed several bugs in wait/wait_not methods:
wait('exists') doesn't work for backend="uia". Thanks maollm_!wait/wait_not take ~ default time (5 sec.) instead of customized timeout like 1 sec.depth param can used in a WindowSpecification now. depth=1 means this control,
depth=2 means immediate children only and so on (aligned with print_control_identifiers method). Thanks dmitrykazanbaev_!
Significantly improved sending keys to an inactive window silently. Special thanks for antonlarin_! Now 2 methods are available:
send_chars is supposed to send character input (this includes {Enter}, {Tab}, {Backspace}) without Alt/Shift/Ctrl modifiers.send_keystrokes is for key input (including key combinations with Alt/Shift/Ctrl modifiers).Method Application().connect(path='your.exe') uses default timeout Timings.app_connect_timeout.
It can accept timeout and retry_interval keyword arguments. Thanks daniil-kukushkin_!
Method print_control_identifiers is more consistent and minimum 2x faster now! Thanks cetygamer_!
Fixed subclassing Application with your own methods. Thanks efremovd_!
Param work_dir can be used in Application().start(...). Thanks efremovd_!
Class Application has been enriched with methods is_process_running() and wait_for_process_exit(). Thanks efremovd_!
Module timings uses time.clock() for Python 2.x and time.perf_counter() for Python 3.x
so that accident system time change can't affect on your script behavior. Thanks airelil_!
Added WireShark example. Thanks ViktorRoy94_!
Now print_control_identifiers() can dump UI elements tree to a file. Thanks sovrasov_!
Improved logging actions for backend="uia", extended example for MS Paint. Thanks ArtemSkrebkov_!
Extended CalendarWrapper for backend="win32" with these methods: get_month_delta,
set_month_delta and get_month_range. Thanks Nikita-K_!
Added method legacy_properties() to UIAWrapper. Thanks AsyaPronina_!
Improved VB6 ListView detection for backend="win32". Thanks KirillMoizik_!
Fixed 64-bit specific bug in TreeViewWrapper for backend="win32"
(argument 4: <type 'exceptions.OverflowError'>: long int too long to convert).
.. _airelil: https://github.com/airelil .. _maollm: https://github.com/maollm .. _dmitrykazanbaev: https://github.com/dmitrykazanbaev .. _antonlarin: https://github.com/antonlarin .. _daniil-kukushkin: https://github.com/daniil-kukushkin .. _cetygamer: https://github.com/cetygamer .. _efremovd: https://github.com/efremovd .. _ViktorRoy94: https://github.com/ViktorRoy94 .. _sovrasov: https://github.com/sovrasov .. _ArtemSkrebkov: https://github.com/ArtemSkrebkov .. _Nikita-K: https://github.com/Nikita-K .. _AsyaPronina: https://github.com/AsyaPronina .. _KirillMoizik: https://github.com/KirillMoizik
Maximized window is always resized (restored) when calling set_focus().
set_focus().print_control_identifiers() gets bytes string on Python 3.x.ensure_visible() is called inside before the click.taskbar.SystemTrayIcons localization friendly.win32_hooks module is well tested and more reliable now. See detailed example.
win32_hooks module is well tested and more reliable now. See detailed example.HwndWrapper.set_focus() fails when used via interpreter. Thanks @mtkennerly!comtypes prints a lot of warnings at import pywinauto.is_dialog() and restore() are missed for UIA backend.print_control_identifiers() crashes on some applications with Unicode symbols.python setup.py install may fail if pyWin32 dependency was installed manually.dlg = app.Custom.Menu.send_chars() can now send {ENTER} to some applications. Thanks @batterseapower!control_type or auto_id in
a WindowSpecification. Method Application.kill() is also optimized in many cases.08-February-2017
win32_hooks module is well tested and more reliable now.
See detailed example_.
.. _detailed example: https://github.com/pywinauto/pywinauto/blob/master/examples/hook_and_listen.py
Fixed several bugs and crashes here and there.
.. _mborus: https://github.com/mborus
HwndWrapper.set_focus() fails when used via interpreter. Thanks Matthew Kennerly_!.. _Matthew Kennerly: https://github.com/mtkennerly
Kirill Moizik_!.. _Kirill Moizik: https://github.com/KirillMoizik
AttributeError: WindowSpecification class has no 'CPUUsage' method.
comtypes prints a lot of warnings at import pywinauto.
Methods is_dialog() and restore() are missed for UIA backend.
Method print_control_identifiers() crashes on some applications with Unicode symbols.
Installation by python setup.py install may fail if pyWin32 dependency was installed manually.
Bug in resolving attributes: 'UIAWrapper' object has no attribute 'Menu' for dlg = app.Custom.Menu
Method send_chars() can now send {ENTER} to some applications. Thanks Max Bolingbroke_!
.. _Max Bolingbroke: https://github.com/batterseapower
Searching UI elements is faster now especially if you use control_type or auto_id in
a WindowSpecification. Method Application.kill() is also optimized in many cases.
Added an example for Win10 Calculator_.
.. _example for Win10 Calculator: https://github.com/pywinauto/pywinauto/blob/master/examples/win10_calculator.py
This big release introduces MS UI Automation (UIA) support (beta). Feedback is very welcome!
app = Application(backend='uia').start('your_app.exe').'win32' if nothing is specified.UIAutomationCore.dll through comtypes (like UiaComWrapper for .NET but in CPython).keyboard and mouse can be used out of any window context now. And they work on Linux as well!ElementInfo and from BaseWrapper. New backend
must be registered by function backend.register(). Linux AT SPI and Apple Accessibility API are in the long term plans.click_input should be used
instead of ClickInput.win32_hooks module. Keyboard and mouse event
handlers can be registered in the system. It was inspired by pyHook, pyhk,
pyhooked and similar modules, but re-written from scratch. Thanks for
Max Samokhvalov! The fork (at some moment) of the win32_hooks module is
used in pyhooked 0.8 by Ethan Smith.This big release introduces MS UI Automation (UIA) support:
Just start from app = Application(backend='uia').start('your_app.exe').
Supported controls: Menu, Button/CheckBox/RadioButton, ComboBox, Edit, Tab control, List (ListView), DataGrid, Tree, Toolbar, Tooltip, Slider.
Documentation is built continuously now on ReadTheDocs. See also improved Getting Started Guide.
New multi-backend architecture makes implementation of new platforms support easier in the future. The minimal set for new backend includes its name and two classes inherited from .element_info.ElementInfo and from pywinauto.base_wrapper.BaseWrapper. New backend must be registered by function pywinauto.backend.register().
Code style is much closer to PEP8: i.e. click_input should be used instead of ClickInput.
Initial implementation of the win32_hooks module. Keyboard and mouse event handlers can be registered in the system. It was inspired by pyHook, pyhk, pyhooked and similar modules, but re-written from scratch. Thanks for Max Samokhvalov! The fork of the win32_hooks module is used in pyhooked 0.8 by Ethan Smith.
A lot of small improvements are not counted here.
Add where="check" possible value to the ListViewWrapper.Click/ClickInput` methods.
where="check" possible value to the ListViewWrapper.Click/ClickInput` methods.CheckByClickInput and UncheckByClickInput methods for a plain check box.MenuBarClickInput method of the ToolbarWrapper.Better backward compatibility with pywinauto 0.4.2:
TypeKeys method again;SetEditText/TypeKeys methods to take non-string arguments;SetEditText/TypeKeys.Wait("active"), raise a SyntaxError when waiting for an incorrect state.MenuItem method Click is renamed to ClickInput while Click = Select now.SetTransparency method can make a window transparent in a specified degree (from 0 to 255).found_index is useful to choose the control in the list of similar ones with same texts.New Application methods: CPUUsage returns CPU usage as a percent (float number), WaitCPUUsageLower waits until the connected process' CPU usage is low
CPUUsage returns CPU usage as a percent (float number),
WaitCPUUsageLower waits until the connected process' CPU usage is lower than
specified value (2.5% by default).ListViewWrapper interface is aligned with TreeViewWrapper. GetItem() returns a _listview_item object that looks like a _treeview_element now.TreeViewWrapper.Select doesn't work when the control is not in focus.TabControlWrapper.Select doesn't work in case of TCS_BUTTONS style set.ListViewWrapper methods Check/UnCheck are fixed.ClientToScreen method doesn't return a value (modifying mutable argument is not good practice).07-September-2015
New Application methods: CPUUsage returns CPU usage as a percent (float number),
WaitCPUUsageLower waits until the connected process' CPU usage is lower than
a specified value (2.5% by default).
A new class _listview_item. It is very similar to _treeview_element.
Add DPI awareness API support (Win8+). It allows correct work when all fonts are scaled at 125%, 150% etc (globally or per monitor).
"Tools overview" section in docs.
Fix number of bugs:
TreeViewWrapper.Select doesn't work when the control is not in focus.
TabControlWrapper.Select doesn't work in case of TCS_BUTTONS style set.
ListViewWrapper methods Check/UnCheck are fixed.
Toolbar button: incorrect access by a tooltip text.
Warning "Cannot retrieve text length for handle" uses print() instead of actionlogger.
ClientToScreen method doesn't return a value (modifying mutable argument is not good practice).
[x] Warnings about mismatched Python/application bitness
DebugMessage methodactionlogger.enable() and actionlogger.disable().
For those who are familiar with standard logging module there's method actionlogger.set_level(level).13-July-2015
Resolve pip issues
Warn user about mismatched Python/application bitness (64-bit Python should be used for 64-bit application and 32-bit Python is for 32-bit app)
Add "TCheckBox" class name to ButtonWrapper detection list
Fix DebugMessage method
Disable logging (actionlogger.py) by default, provide shortcuts:
actionlogger.enable() and actionlogger.disable(). For those who are
familiar with standard logging module there's method
actionlogger.set_level(level)
[x] 64-bit Python and 64-bit apps support (but 32-bit Python is recommended for 32-bit apps)
best_match algorithm allows names like ToolbarFile$23453)RemoteMemoryBlock can now detect memory corruption by checking guard signaturetaskbar modulesysinfo module for checking 32-bit or 64-bit OS and Pythonset_foreground flag in TypeKeys method for typing into in-place controlscreate_new_console and wait_for_idle in Application.start methodRenamed WindowSpecification.(Ww)indow() to ChildWindow() and added deprecation messages for the other functions.
03-April-2010
Gracefully Handle dir() calls on Application or WindowSpecification objects (which used hang for a while as these classes would search for windows matching members, methods and bases). The code now checks for any attribute that starts with '' and ends with '' and raises AttributeError immediately. Thanks to Sebastian Haase for raising this.
Removed the reference to an Application object in WindowSpecification. It was not used in the class and made the class harder to use. WindowSpecification is now more useful as a utility class.
Add imports of application.WindowSpecification and application.Application to pywinauto.init.py so that these classes can be used more easily (without having to directly import pywinauto.application). Thanks again to Sebastian Haase.
Added a function to empty the clipboard (thanks to Tocer on Sourceforge)
Use 'SendMessageTimeout' to get the text of a window. (SendMessage will hang if the application is not processing messages)
Fixed references to PIL.ImageGrab. PIL add's it's module directly to the module path, so it should just be referenced by ImageGrab and not PIL.ImageGrab.
Use AttachThreadInput + PostMessage rather than SendMessageTimeout to send mouse clicks.
Fix how timeout retry times are calculated in timings.WaitUntil() and timings.Wait
Fixed some issues with application.Kill_() method, highlighted due to the changes in the HwndWrapper.Close() method.
Fix writing images to XML. It was broken with updates to PIL that I had not followed. Changed the method of knowing if it is an image by checking for various attributes.
Renamed WindowSpecification.(Ww)indow() to ChildWindow() and added deprecation messages for the other functions.
Improved the tests (fixed test failures which were not pywinauto issues)
Major change this release is that Sendkeys is no longer a requirement! A replacement that supports Unicode is included with pywinauto. (hopefully soon
27-November-2009
Major change this release is that Sendkeys is no longer a requirement! A replacement that supports Unicode is included with pywinauto. (hopefully soon to be released as a standalone module). Please note - this is still quite untested so this release should be treated with some care..
Made sure that default for WindowSpecification.Window_() was to look for non top level windows. The defaults in find_windows() had been changed previously and it now needed to be explicitly overridden.
Fixed a missing reference to 'win32defines' when referencing WAIT_TIMEOUT another typo of false (changed to False)
Removed the restriction to only get the active windows for the process, now it will be possible to get the active windows, even if a process is not specified. From http://msdn.microsoft.com/en-us/library/ms633506%28VS.85%29.aspx it gets the active window for the foreground thread.
Hopefully improved Delphi TreeView and ListView handling (added window class names as supported window classes to the appropriate classes).
Added support for running UI tests with reference controls. (requried for some localization tests)
Various PyLint and PEP8 fixes made.
Fixed toolbar button pressing - This required for HwndWrapper.NotifyParent() to be updated (to accept a new ID parameter)
10-March-2009
Fixed toolbar button pressing - This required for HwndWrapper.NotifyParent() to be updated (to accept a new ID parameter)
Fixed a bug wherea listview without a column control would make pywinauto fail to capture the dialog.
Converted documenation from Pudge generated to Sphinx Generated
Added some baic support for Pager and Progress controls (no tests yet)
Added some more VB 'edit' window classes
Added some more VB 'listbox' window classes
Added some more VB 'button' window classes
Ensured that return value from ComboBoxWrapper.SelectedIndices is always a tuple (there was a bug where it would sometimes be a ctypes array)
Changed default for finding windows to find disabled windows as well as enabled ones (previous was to find enabled windows only) (note this may impact scripts that relied on the previous setting i.e. in cases where two dialogs have the same title!)
Much better handling of InvalidWindowHandle during automation runs. This could be raised when a closing window is still available when the automation was called, but is gone half way through whatever function was called.
Made clicking more robust by adding a tiny wait between each SendMessageTimeout in _perform_click().
Added attributes can_be_label and has_title to HwndWrapper
and subclasses to specify whether a control can act as a label for
other controls, and whether the title should be used for identifying
the control. If you have created your own HwndWrapper subclasses you
may need to override the defaults.
Added a control_id parameter to find_windows which allows
finding windows based off of their control id's
Added a FriendlyClassName method to MenuItem
Split up the functions for button truncation data
Commented out code to get a new font if the font could not be recovered
Moved code to get the control font from Truncation test to handleprops
Added a function to get the string representation of the bug. (need to refactor PrintBugs at some point).
Fixed a variable name (from fname -> font_attrib as fname was not a defined variable!)
Forced some return values from MissingExtraString test to be Unicode
Fixed the MiscValues test (converted to Unicode and removed some extraneous characters)
Updated the path for all unittests
Made two unit tests sligthly more robust and less dependent on computer/app settings
Updated timing settings for unit tests
Updated the examples to work in dev environment.
Nothing published for this version
Added parameter to _treeview_item.Rectangle() to have an option to get the Text rectangle of the item. And defaulted to this.
28-July-2006
Added parameter to _treeview_item.Rectangle() to have an option
to get the Text rectangle of the item. And defaulted to this.
Added _treeview_item.Click() method to make it easy to click
on tree view items.
Fixed a bug in TreeView.GetItem() that was expanding items
when it shouldn't.
Added HwndWrapper.Scroll() method to allow scrolling. This
is a very minimal implementation - and if the scrollbars are
implemented as separate controls (rather then a property of a
control - this will probably not work for you!). It works for
Notepad and Paint - that is all I have tried so far.
Added a call to HwndWrapper.SetFocus() in
_perform_click_input() so that calls to
HwndWrapper.ClickInput() will make sure to click on the
correct window.
Removed references to _ctrl() method within pywinauto as it was raising a DeprecationWarning internally even if the user was not using it.
24-May-2006
Moved to a metaclass implementation of control finding. This removes some cyclic importing that had to be worked around and other then metaclass magic makes the code a bit simpler.
Some of the sample files would not run - so I updated them so they would (Thanks to Stefaan Himpe for pointing this out)
Disabled saving application data (it was still being saved in Application.RecordMatch() even if the rest of the application data code is disabled. This was causing what appeared to be a memory leak where pywinauto would keep grabbing more and more memory (especially for controls that contain a lot of information). Thanks to Frank Martinez for leading me to this).
Added ListViewWrapper.GetItemRect() to enable retrieving the rectangle for a particular item in the listview.
Removed references to _ctrl() method within pywinauto as it was raising a DeprecationWarning internally even if the user was not using it.
The latest version of ctypes (0.9.9.6) removed the code generator I was using some generated code in win32functions.py (stdcall). I was not using thos
25-Apr-2006
The latest version of ctypes (0.9.9.6) removed the code generator I was using some generated code in win32functions.py (stdcall). I was not using those functions so I just commented them out.
Started the process of renaming methods of the Application and
WindowSpecification classes. I will be converting names to
UppercaseNames_(). The trailing _ is to disambiguate the
method names from potential Window titles.
Updated how print_control_identifiers works so that it now always prints the disambiguated control name. (even for single controls)
Added hash to HwndWrapper so that controls could be dictionary keys.
Caching various information at various points. For example I cache how well two pieces of text match. For short scripts this has little impact - but for larger script it could well have a major impact. Also caching information for controls that cannot change e.g. TopLeveParent, Parent, etc
Commented out all deprecated methods (will be removed completely in some future release).
19-Apr-2006
Added a wait for the control to be active and configurable sleeps after 'modifying' actions (e.g. Select, Deselect, etc)
Fixed Timings.Slow() and Timings.Fast() - they could in certain circumstances do the opposite! If you had already set a timing slower or faster then they would set it then they would blindly ignore that and set their own times. I added functionality that they will take either the slowest or fastest of the new/current setting rather then blindly setting to the new value.
Fixed some hidden bugs with HwndWrapper.CloseClick()
Fixed a bug in setup.py that would raise an error when no argument was specified
Added an argument to HwndWrapper.SendMessageTimeout so that the wait options could be passed in.
Added HwndWrapper.Close(), Maximize(), Minimize(), Restore() and GetShowState().
Commented out all deprecated methods (will be removed completely in some future release).
Added Application.kill_() method - which closes all windows and kills the application. If the application is asking if you want to save your changes - you will not be able to click yes or no and the application will be killed anyway!.
Fixed the spelling of Stefaan Himpe's name
31-Mar-2006
Fixed the spelling of Stefaan Himpe's name
Fixed setup.py which was working for creating a distribution but not for installing it (again thanks to Stefaan for pointing it out!)
Change calculation of distance in findbestmatch.GetNonTextControlName() so that it does not need to square or get the square root to find the real dis
findbestmatch.GetNonTextControlName()
so that it does not need to square or get the square root to
find the real distance - as we only need to compare values - not have
the actual distance. (Thanks to Stefaan Himpe)extra_tests.py which needs to export a ModifyRegisteredTests() method.
Also cleaned up the code a little.notepad_fast.py to make it easier to profile (added a method)WrapHandle to use a cache for classes it has matched - this is
to avoid having to match against all classes constantly.SendMessageTimeout to .001 seconds from .4
seconds this results in a significant speedup. Will need to make this
value modifiable via the timing module/routine.WaitNot was raising an error if the control was not found - it should
have returned (i.e. success - control is not in any particular state
because it does not exist!).ListViewWrapper.Deselect() per Chistophe Keller's suggestion.
While I was at it I added a check on the item value passed in and added
a call to WaitGuiIdle(self) so that the control has a chance to process
the message.timings.Timings class. There are
some simple methods for changing the timings.Added automatic Application data collection which can be used when running the same test on a different spoken language version. Support is still prel
Added automatic Application data collection which can be used when running the same test on a different spoken language version. Support is still preliminary and is expected to change. Please treat as early Alpha.
If you have a different language version of Windows then you can try
this out by running the notepad_fast.py example with the langauge
argument e.g.
examples\notepad_fast.py language
This will load the application data from the supplied file notepad_fast.pkl and use it for finding the right menu items and controls to select.
app = Application().connect_(title = 'Find')
app.Find.Close.Click()
app.NotePad.MenuSelect("File->Exit")
1st change was to implement static methods start() and
connect(). These methods return a new Application instance
so the above code becomes
app = Application.connect(title = 'Find')
app.Find.Close.Click()
app.NotePad.MenuSelect("File->Exit")
I also wanted to make it easier to start working with a simple
application - that may or may not have only one dialog. To make this
situation easier I made window_() not throw if the application has not
been start()ed or connect()ed first. This leads to simpler code
like
app = Application()
app.Find.Close.Click()
app.NotePad.MenuSelect("File->Exit")
What happens here is that when you execute any of Application.window_(),
Application.__getattr__() or Application.__getitem__() when the
application hasn't been connected or started. It looks for the window
that best matches your specification and connects the application to
that process.
This is extra functionality - existing connect_() and
start_() methods still exist
HwndWrapper.SetFocus() so that it would work even if the window
was not in the foreground. (it now makes the window foreground as well
as giving it focus). This overcomes a restriction in Windows where
you can only change the foreground window if you own the foreground
window.controls.common_controls.TabControlWrapper.GetTabState()
and TabStates() as these did not seem to be returning valid values anyway.MenuSelect would sometimes not work as expected.
Some Menu actions require that the window that owns the menu be active.
Added a call to SetFocus() before selecting a menu item to ensure that
the window was active.clipboard.GetData()Please use Wait() and WaitNot() as I have Deprecated these Wait* methods.
application.WindowSpecification.Wait() and WaitNot() methods.
These methods allow you to wait for a control to exist, be visible,
be enabled, be ready (both enabled and visible!) or to wait for the
control to not be in any of these states. WaitReady(),
WaitNotEnabled(), WaitNotVisible() now use these methods. I was able to also
add the missing methods WaitNotReady(), WaitEnabled(), WaitVisible(),
WaitExists(), WaitNotExists(). Please use Wait() and WaitNot() as I have
Deprecated these Wait* methods.application.Application.start() and connect() static methods. These
methods are factory methods in that they will return an initialized Application
instance. They work exactly the same as start_() and connect_() as they are
implemented in terms of those. from pywinauto.application import Application
notepad = Application.start("notepad")
same_notepad = Application.connect(path = "notepad")
…EditWrapper.SetText() still exists - but may be deprecated.
PopupMenuWrapper for context menu's
You can now work easily with context menu's
e.g. app.Notepad.Edit.RightClick()
# need to use MenuClick rather then MenuSelect
app.PopupMenu.MenuClick("Select All")
app.Notepad.Edit.RightClick()
app.PopupMenu.MenuClick("Copy")
I could think of merging the RightClick() and MenuSelect() into one method
ContextMenuSelect() if that makes sense to most people.
Added Support for Up-Down controls
Not all top level windows now have a FriendlyClassName of "Dialog". I changed this because it made it hard to get windows of a particular class. For example the main Notepad window has a class name of "Notepad".
This was primarily implemented due to work I did getting the System Tray.
Renamed StatusBarWrapper.PartWidths() to PartRightEdges() as this
is more correct for what it returns.
Changed HwndWrapper.Text() and SetText() to WindowText() and SetWindowText() respectively to try and make it clearer that it is the text returned by GetWindowText and not the text that is visible on the control. This change also suggested that EditWrapper.SetText() be changed to SetEditText() (though this is not a hard requirement EditWrapper.SetText() still exists - but may be deprecated.
Added ClickInput, DoubleClickInput, RightClickInput, PressMouseInput ReleaseMouseInput to HwndWrapper - these use SendInput rather then WM_LBUTTONDOWN, WM_RBUTTONUP, etc used by Click, DoubleClick etc.
I also added a MenuClick method that allows you to click on menu items. This means you can now 'physically' drop menus down.
Some further working with tooltips that need to be cleaned up.
Fixed a bug where coordinates passed to any of the Click operations had the X and Y coordinates swapped.
Added new MenuItem and Menu classes that are to the most part hidden but you can get a menu item by doing
app.Notepad.MenuItem("View")
app.Notepad.MenuItem("View->Status Bar")
MenuItems have various actions so for example you can use
MenuItem.IsChecked() to check if the menu item is checked.
Among other methods there are Click() and Enabled().
Modified the 'best match' algorithm for finding controls. It now searches a couple of times, and tries to find the best fit for the text passed to it. The idea here is to make it more "Select what I want - not that other thing that looks a bit like what I want!". It is possible this change could mean you need to use new identifiers in scripts - but in general very little modification should be necessary.
There was also a change to the algorithm that looked for the closest text control. It missed some obvious controls in the previous implementation. It also had a bug for controls above the control rather than to the left.
Added a new example scripts SaveFromInternetExplorer.py and SaveFromFirefox.py which show automating downloading of a page from either of these browsers.
Added yet more unit tests, there are now a total of 134 tests.
Changed how windows are searched for (from application) This change should not be a significant change for users
DialogWrapper.MenuSelect() method to notify the parent
that it needs to initialize the menu's before it retrieves the items app.dlg.<Nearby_text><Window_class>
e.g. to reference the "Footer" edit control in the Page Setup dialog you could use
app.PageSetup.FooterEdit
MoveWindow method to HwndWrapperWrote doc strings for all modules, classes and functions
_connect, _start, _window, _control, _write
respectively to
connect_, start_, window_, connect_, write_
If you forget to change _window, _connect and _start then you will probably get the following error:
TypeError: '_DynamicAttributes' object is not callable
pywinauto is now a package name - you need to import it or its modulesFriendlyClassName is discovered (and still not really happy!)Your coding agent can read these notes before it upgrades. Set up the MCP server →