* Add 0.4.0 release notes

This commit is contained in:
markm 2010-04-03 10:12:00 +00:00
parent e54edace88
commit 70a9c2b4a7

@ -2,6 +2,53 @@
Change Log Change Log
========== ==========
0.4.0 Various cleanup and bug fixes.
------------------------------------------------------------------
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)
0.3.9 Experimental! New Sendkeys, and various fixes 0.3.9 Experimental! New Sendkeys, and various fixes
------------------------------------------------------------------ ------------------------------------------------------------------
27-November-2009 27-November-2009
@ -10,35 +57,35 @@ Change Log
A replacement that supports Unicode is included with pywinauto. (hopefully A replacement that supports Unicode is included with pywinauto. (hopefully
soon to be released as a standalone module). Please note - this is still soon to be released as a standalone module). Please note - this is still
quite untested so this release should be treated with some care.. quite untested so this release should be treated with some care..
* Made sure that default for WindowSpecification.Window_() was to look * Made sure that default for WindowSpecification.Window_() was to look
for non top level windows. The defaults in find_windows() had been for non top level windows. The defaults in find_windows() had been
changed previously and it now needed to be explicitly overridden. changed previously and it now needed to be explicitly overridden.
* Fixed a missing reference to 'win32defines' when referencing WAIT_TIMEOUT * Fixed a missing reference to 'win32defines' when referencing WAIT_TIMEOUT
another typo of false (changed to False) another typo of false (changed to False)
* Removed the restriction to only get the active windows for the process, * 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 now it will be possible to get the active windows, even if a process is
not specified. not specified.
From http://msdn.microsoft.com/en-us/library/ms633506%28VS.85%29.aspx From http://msdn.microsoft.com/en-us/library/ms633506%28VS.85%29.aspx
it gets the active window for the foreground thread. it gets the active window for the foreground thread.
* Hopefully improved Delphi TreeView and ListView handling (added window * Hopefully improved Delphi TreeView and ListView handling (added window
class names as supported window classes to the appropriate classes). class names as supported window classes to the appropriate classes).
* Added support for running UI tests with reference controls. (requried * Added support for running UI tests with reference controls. (requried
for some localization tests) for some localization tests)
* Various PyLint and PEP8 fixes made. * Various PyLint and PEP8 fixes made.
0.3.8 Collecting improvements from last 2 years 0.3.8 Collecting improvements from last 2 years
------------------------------------------------------------------ ------------------------------------------------------------------
10-March-2009 10-March-2009
* Fixed toolbar button pressing - This required for * Fixed toolbar button pressing - This required for
HwndWrapper.NotifyParent() to be updated (to accept a new HwndWrapper.NotifyParent() to be updated (to accept a new
ID parameter) ID parameter)
* Fixed a bug wherea listview without a column control would * Fixed a bug wherea listview without a column control would
@ -46,7 +93,7 @@ Change Log
* Converted documenation from Pudge generated to Sphinx Generated * Converted documenation from Pudge generated to Sphinx Generated
* Added some baic support for Pager and Progress controls * Added some baic support for Pager and Progress controls
(no tests yet) (no tests yet)
* Added some more VB 'edit' window classes * Added some more VB 'edit' window classes
@ -54,88 +101,88 @@ Change Log
* Added some more VB 'listbox' window classes * Added some more VB 'listbox' window classes
* Added some more VB 'button' window classes * Added some more VB 'button' window classes
* Ensured that return value from ComboBoxWrapper.SelectedIndices * Ensured that return value from ComboBoxWrapper.SelectedIndices
is always a tuple (there was a bug where it would sometimes be is always a tuple (there was a bug where it would sometimes be
a ctypes array) a ctypes array)
* Changed default for finding windows to find disabled windows * Changed default for finding windows to find disabled windows
as well as enabled ones (previous was to find enabled windows only) as well as enabled ones (previous was to find enabled windows only)
(note this may impact scripts that relied on the previous (note this may impact scripts that relied on the previous
setting i.e. in cases where two dialogs have the same title!) setting i.e. in cases where two dialogs have the same title!)
* Much better handling of InvalidWindowHandle during automation * Much better handling of InvalidWindowHandle during automation
runs. This could be raised when a closing window is still available runs. This could be raised when a closing window is still available
when the automation was called, but is gone half way through when the automation was called, but is gone half way through
whatever function was called. whatever function was called.
* Made clicking more robust by adding a tiny wait between each * Made clicking more robust by adding a tiny wait between each
SendMessageTimeout in _perform_click(). SendMessageTimeout in _perform_click().
* Added attributes ``can_be_label`` and ``has_title`` to ``HwndWrapper`` * Added attributes ``can_be_label`` and ``has_title`` to ``HwndWrapper``
and subclasses to specify whether a control can act as a label for and subclasses to specify whether a control can act as a label for
other controls, and whether the title should be used for identifying other controls, and whether the title should be used for identifying
the control. If you have created your own HwndWrapper subclasses you the control. If you have created your own HwndWrapper subclasses you
may need to override the defaults. may need to override the defaults.
* Added a ``control_id`` parameter to find_windows which allows * Added a ``control_id`` parameter to find_windows which allows
finding windows based off of their control id's finding windows based off of their control id's
* Added a FriendlyClassName method to MenuItem * Added a FriendlyClassName method to MenuItem
* Split up the functions for button truncation data * Split up the functions for button truncation data
* Commented out code to get a new font if the font could not * Commented out code to get a new font if the font could not
be recovered be recovered
* Moved code to get the control font from Truncation test to * Moved code to get the control font from Truncation test to
handleprops handleprops
* Added a function to get the string representation of the * Added a function to get the string representation of the
bug. (need to refactor PrintBugs at some point). bug. (need to refactor PrintBugs at some point).
* Fixed a variable name (from fname -> font_attrib as fname * Fixed a variable name (from fname -> font_attrib as fname
was not a defined variable!) was not a defined variable!)
* Forced some return values from MissingExtraString test * Forced some return values from MissingExtraString test
to be Unicode to be Unicode
* Fixed the MiscValues test (converted to Unicode and * Fixed the MiscValues test (converted to Unicode and
removed some extraneous characters) removed some extraneous characters)
* Updated the path for all unittests * Updated the path for all unittests
* Made two unit tests sligthly more robust and less dependent * Made two unit tests sligthly more robust and less dependent
on computer/app settings on computer/app settings
* Updated timing settings for unit tests * Updated timing settings for unit tests
* Updated the examples to work in dev environment. * Updated the examples to work in dev environment.
0.3.7 Merge of Wait changes and various bug fixes/improvements 0.3.7 Merge of Wait changes and various bug fixes/improvements
------------------------------------------------------------------ ------------------------------------------------------------------
10-April-2007 10-April-2007
* Added Timings.WaitUntil() and Timings.WaitUntilPasses() which * Added Timings.WaitUntil() and Timings.WaitUntilPasses() which
handle the various wait until something in the code. Also handle the various wait until something in the code. Also
refactored existing waits to use these two methods. refactored existing waits to use these two methods.
* Fixed a major Handle leak in RemoteMemorBlock class (which is * Fixed a major Handle leak in RemoteMemorBlock class (which is
used extensively for 'Common' controls. I was using OpenHandle used extensively for 'Common' controls. I was using OpenHandle
to open the process handle, but was not calling CloseHandle() to open the process handle, but was not calling CloseHandle()
for each corresponding OpenHandle(). for each corresponding OpenHandle().
* Added an active_() method to Application class to return the * Added an active_() method to Application class to return the
active window of the application. active window of the application.
* Added an 'active' option to WindowSpecification.Wait() and * Added an 'active' option to WindowSpecification.Wait() and
WaitNot(). WaitNot().
* Some cleanup of the clipboard module. GetFormatName() * Some cleanup of the clipboard module. GetFormatName()
was improved and GetData() made a little more robust. was improved and GetData() made a little more robust.
* Added an option to findwindows.find_windows() to find only * Added an option to findwindows.find_windows() to find only
active windows (e.g. active_only = True). Default is False. active windows (e.g. active_only = True). Default is False.
* Fixed a bug in the timings.Timings class - timing values are * Fixed a bug in the timings.Timings class - timing values are
@ -143,10 +190,10 @@ Change Log
intance (self). intance (self).
* Updated ElementTree import in XMLHelpers so that it would work * Updated ElementTree import in XMLHelpers so that it would work
on Python 2.5 (where elementtree is a standard module) as well on Python 2.5 (where elementtree is a standard module) as well
as other versions where ElementTree is a separate module. as other versions where ElementTree is a separate module.
* Enhanced Item selection for ListViews, TreeViews - it is now * Enhanced Item selection for ListViews, TreeViews - it is now
possible to pass strings and they will be searched for. More possible to pass strings and they will be searched for. More
documentation is required though. documentation is required though.
@ -169,9 +216,9 @@ Change Log
* Fixed a bug in how findbestmatch.FindBestMatches was working. * Fixed a bug in how findbestmatch.FindBestMatches was working.
It would match against text when it should not! It would match against text when it should not!
* Updated how timings.Timings.Slow() worked, if any time setting * Updated how timings.Timings.Slow() worked, if any time setting
was less then .2 after 'slowing' then set it to .2 was less then .2 after 'slowing' then set it to .2
0.3.6 Scrolling and Treview Item Clicking added 0.3.6 Scrolling and Treview Item Clicking added
@ -181,23 +228,23 @@ Change Log
* Added parameter to ``_treeview_item.Rectangle()`` to have an option * Added parameter to ``_treeview_item.Rectangle()`` to have an option
to get the Text rectangle of the item. And defaulted to this. to get the Text rectangle of the item. And defaulted to this.
* Added ``_treeview_item.Click()`` method to make it easy to click * Added ``_treeview_item.Click()`` method to make it easy to click
on tree view items. on tree view items.
* Fixed a bug in ``TreeView.GetItem()`` that was expanding items * Fixed a bug in ``TreeView.GetItem()`` that was expanding items
when it shouldn't. when it shouldn't.
* Added ``HwndWrapper.Scroll()`` method to allow scrolling. This * Added ``HwndWrapper.Scroll()`` method to allow scrolling. This
is a very minimal implementation - and if the scrollbars are is a very minimal implementation - and if the scrollbars are
implemented as separate controls (rather then a property of a implemented as separate controls (rather then a property of a
control - this will probably not work for you!). It works for control - this will probably not work for you!). It works for
Notepad and Paint - that is all I have tried so far. Notepad and Paint - that is all I have tried so far.
* Added a call to ``HwndWrapper.SetFocus()`` in * Added a call to ``HwndWrapper.SetFocus()`` in
``_perform_click_input()`` so that calls to ``_perform_click_input()`` so that calls to
``HwndWrapper.ClickInput()`` will make sure to click on the ``HwndWrapper.ClickInput()`` will make sure to click on the
correct window. correct window.
0.3.5 Moved to Metaclass control wrapping 0.3.5 Moved to Metaclass control wrapping
------------------------------------------------------------------ ------------------------------------------------------------------
@ -209,28 +256,28 @@ Change Log
* Some of the sample files would not run - so I updated them * Some of the sample files would not run - so I updated them
so they would (Thanks to Stefaan Himpe for pointing this out) so they would (Thanks to Stefaan Himpe for pointing this out)
* Disabled saving application data (it was still being saved in * Disabled saving application data (it was still being saved in
Application.RecordMatch() even if the rest of the application Application.RecordMatch() even if the rest of the application
data code is disabled. This was causing what appeared to be a data code is disabled. This was causing what appeared to be a
memory leak where pywinauto would keep grabbing more and more memory leak where pywinauto would keep grabbing more and more
memory (especially for controls that contain a lot of memory (especially for controls that contain a lot of
information). Thanks to Frank Martinez for leading me to this). information). Thanks to Frank Martinez for leading me to this).
* Added ListViewWrapper.GetItemRect() to enable retrieving the * Added ListViewWrapper.GetItemRect() to enable retrieving the
rectangle for a particular item in the listview. rectangle for a particular item in the listview.
* Removed references to _ctrl() method within pywinauto as it * Removed references to _ctrl() method within pywinauto as it
was raising a DeprecationWarning internally even if the user was raising a DeprecationWarning internally even if the user
was not using it. was not using it.
0.3.4 Fixed issue with latest ctypes, speed gains, other changes 0.3.4 Fixed issue with latest ctypes, speed gains, other changes
------------------------------------------------------------------ ------------------------------------------------------------------
25-Apr-2006 25-Apr-2006
* The latest version of ctypes (0.9.9.6) removed the code generator * The latest version of ctypes (0.9.9.6) removed the code generator
I was using some generated code in win32functions.py (stdcall). I I was using some generated code in win32functions.py (stdcall). I
was not using those functions so I just commented them out. was not using those functions so I just commented them out.
* Started the process of renaming methods of the ``Application`` and * Started the process of renaming methods of the ``Application`` and
@ -240,14 +287,14 @@ Change Log
* Updated how print_control_identifiers works so that it now always * Updated how print_control_identifiers works so that it now always
prints the disambiguated control name. (even for single controls) prints the disambiguated control name. (even for single controls)
* Added __hash__ to HwndWrapper so that controls could be dictionary * Added __hash__ to HwndWrapper so that controls could be dictionary
keys. keys.
* Caching various information at various points. For example I cache * Caching various information at various points. For example I cache
how well two pieces of text match. For short scripts this has how well two pieces of text match. For short scripts this has
little impact - but for larger script it could well have a major little impact - but for larger script it could well have a major
impact. impact.
Also caching information for controls that cannot change Also caching information for controls that cannot change
e.g. TopLeveParent, Parent, etc e.g. TopLeveParent, Parent, etc
@ -256,10 +303,10 @@ Change Log
------------------------------------------------------------------ ------------------------------------------------------------------
19-Apr-2006 19-Apr-2006
* Added a wait for the control to be active and configurable * Added a wait for the control to be active and configurable
sleeps after 'modifying' actions (e.g. Select, Deselect, etc) sleeps after 'modifying' actions (e.g. Select, Deselect, etc)
* Fixed Timings.Slow() and Timings.Fast() - they could in certain * Fixed Timings.Slow() and Timings.Fast() - they could in certain
circumstances do the opposite! If you had already set a timing circumstances do the opposite! If you had already set a timing
slower or faster then they would set it then they would blindly slower or faster then they would set it then they would blindly
ignore that and set their own times. I added functionality that ignore that and set their own times. I added functionality that
@ -274,13 +321,13 @@ Change Log
* Added an argument to HwndWrapper.SendMessageTimeout so that * Added an argument to HwndWrapper.SendMessageTimeout so that
the wait options could be passed in. the wait options could be passed in.
* Added HwndWrapper.Close(), Maximize(), Minimize(), Restore() * Added HwndWrapper.Close(), Maximize(), Minimize(), Restore()
and GetShowState(). and GetShowState().
* Commented out all deprecated methods (will be removed completely * Commented out all deprecated methods (will be removed completely
in some future release). in some future release).
* Added Application.kill_() method - which closes all windows and * Added Application.kill_() method - which closes all windows and
kills the application. If the application is asking if you want 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 to save your changes - you will not be able to click yes or no
and the application will be killed anyway!. and the application will be killed anyway!.
@ -305,28 +352,28 @@ Change Log
find the real distance - as we only need to compare values - not have find the real distance - as we only need to compare values - not have
the actual distance. (Thanks to Stefaan Himpe) the actual distance. (Thanks to Stefaan Himpe)
* Compiled regular expression patterns before doing the match to * Compiled regular expression patterns before doing the match to
avoid compiling the regular expression for window that is being avoid compiling the regular expression for window that is being
tested (Thanks to Stefaan Himpe) tested (Thanks to Stefaan Himpe)
* Made it easier to add your own control tests by adding a file * Made it easier to add your own control tests by adding a file
extra_tests.py which needs to export a ModifyRegisteredTests() method. extra_tests.py which needs to export a ModifyRegisteredTests() method.
Also cleaned up the code a little. Also cleaned up the code a little.
* Updated notepad_fast.py to make it easier to profile (adde a method) * Updated notepad_fast.py to make it easier to profile (adde a method)
* Changed WrapHandle to use a cache for classes it has matched - this is * Changed WrapHandle to use a cache for classes it has matched - this is
to avoid having to match against all classes constantly. to avoid having to match against all classes constantly.
* Changed default timeout in SendMessageTimeout to .001 seconds from .4 * Changed default timeout in SendMessageTimeout to .001 seconds from .4
seconds this results in a significant speedup. Will need to make this seconds this results in a significant speedup. Will need to make this
value modifiable via the timing module/routine. value modifiable via the timing module/routine.
* WaitNot was raising an error if the control was not found - it should * 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 have returned (i.e. success - control is not in any particular state
because it does not exist!). because it does not exist!).
* Added ListViewWrapper.Deselect() per Chistophe Keller's suggestion. * Added ListViewWrapper.Deselect() per Chistophe Keller's suggestion.
While I was at it I added a check on the item value passed in and added 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 a call to WaitGuiIdle(self) so that the control has a chance to process
the message. the message.
@ -354,8 +401,8 @@ Change Log
examples\notepad_fast.py language examples\notepad_fast.py language
This will load the application data from the supplied file This will load the application data from the supplied file
notepad_fast.pkl and use it for finding the right menu items and notepad_fast.pkl and use it for finding the right menu items and
controls to select. controls to select.
* Test implementation to make it easier to start using an application. * Test implementation to make it easier to start using an application.
@ -365,7 +412,7 @@ Change Log
app.Find.Close.Click() app.Find.Close.Click()
app.NotePad.MenuSelect("File->Exit") app.NotePad.MenuSelect("File->Exit")
1st change was to implement static methods ``start()`` and 1st change was to implement static methods ``start()`` and
``connect()``. These methods return a new Application instance ``connect()``. These methods return a new Application instance
so the above code becomes:: so the above code becomes::
@ -373,10 +420,10 @@ Change Log
app.Find.Close.Click() app.Find.Close.Click()
app.NotePad.MenuSelect("File->Exit") app.NotePad.MenuSelect("File->Exit")
I also wanted to make it easier to start working with a simple 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 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 situation easier I made ``window_()`` not throw if the application has not
been ``start()ed`` or ``connect()ed`` first. This leads to simpler code been ``start()ed`` or ``connect()ed`` first. This leads to simpler code
like:: like::
app = Application() app = Application()
@ -384,12 +431,12 @@ Change Log
app.NotePad.MenuSelect("File->Exit") app.NotePad.MenuSelect("File->Exit")
What happens here is that when you execute any of Application.window_(), What happens here is that when you execute any of Application.window_(),
Application.__getattr__() or Application.__getitem__() when the Application.__getattr__() or Application.__getitem__() when the
application hasn't been connected or started. It looks for the window application hasn't been connected or started. It looks for the window
that best matches your specification and connects the application to that best matches your specification and connects the application to
that process. that process.
This is extra functionality - existing connect_() and This is extra functionality - existing connect_() and
start_() methods still exist start_() methods still exist
* Fixed HwndWrapper.SetFocus() so that it would work even if the window * Fixed HwndWrapper.SetFocus() so that it would work even if the window
@ -402,13 +449,13 @@ Change Log
with these changes pywinauto should run on Python 2.3 (though I haven't with these changes pywinauto should run on Python 2.3 (though I haven't
done extensive testing). done extensive testing).
* Commented out controls.common_controls.TabControlWrapper.GetTabState() * Commented out controls.common_controls.TabControlWrapper.GetTabState()
and TabStates() as these did not seem to be returning valid values anyway. and TabStates() as these did not seem to be returning valid values anyway.
* Fixed documentation issues were parts of the documentation were not * Fixed documentation issues were parts of the documentation were not
getting generated to the HTML files. getting generated to the HTML files.
* Fixed issue where MenuSelect would sometimes not work as expected. * Fixed issue where MenuSelect would sometimes not work as expected.
Some Menu actions require that the window that owns the menu be active. 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 Added a call to SetFocus() before selecting a menu item to ensure that
the window was active. the window was active.
@ -423,25 +470,25 @@ Change Log
07-Mar-2006 07-Mar-2006
* Added wrapper classes for Menus and MenuItems this enabled cleaner * Added wrapper classes for Menus and MenuItems this enabled cleaner
interaction with Menu's. It also gives more functionality - you can now interaction with Menu's. It also gives more functionality - you can now
programmatically Click() on menus, and query if a menu item is checked programmatically Click() on menus, and query if a menu item is checked
or not. or not.
* Added application.WindowSpecification.Wait() and WaitNot() methods. * Added application.WindowSpecification.Wait() and WaitNot() methods.
These methods allow you to wait for a control to exist, be visible, 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 be enabled, be ready (both enabled and visible!) or to wait for the
control to not be in any of these states. WaitReady(), control to not be in any of these states. WaitReady(),
WaitNotEnabled(), WaitNotVisible() now use these methods. I was able to also WaitNotEnabled(), WaitNotVisible() now use these methods. I was able to also
add the missing methods WaitNotReady(), WaitEnabled(), WaitVisible(), add the missing methods WaitNotReady(), WaitEnabled(), WaitVisible(),
WaitExists(), WaitnotExists(). Please use Wait() and WaitNot() as I have WaitExists(), WaitnotExists(). Please use Wait() and WaitNot() as I have
Deprecated these Wait* methods. Deprecated these Wait* methods.
* Slightly modified timeout waits for control resolution so that a timed * Slightly modified timeout waits for control resolution so that a timed
function more accurately follows the timeout value specified. function more accurately follows the timeout value specified.
* Added application.Application.start() and connect() static methods. These * Added application.Application.start() and connect() static methods. These
methods are factory methods in that they will return an initialized Application 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 instance. They work exactly the same as start_() and connect() as they are
implemented in terms of those. implemented in terms of those.
from pywinauto.application import Application from pywinauto.application import Application
@ -452,17 +499,17 @@ Change Log
more robust. more robust.
* Added a new Controls Overview document page which lists all the actions on * Added a new Controls Overview document page which lists all the actions on
all controls. all controls.
* Added more unit tests now up to 207 from 134 (added 68 tests) * Added more unit tests now up to 207 from 134 (added 68 tests)
0.2.1 Small Release number - big changes 0.2.1 Small Release number - big changes
------------------------------------------------ ------------------------------------------------
17-Feb-2006 17-Feb-2006
* Quick release to get many changes out there - but this release has * Quick release to get many changes out there - but this release has
been less tested then I would like for a .3 release. been less tested then I would like for a .3 release.
* Allow access to non text controls using the closest Text control. * Allow access to non text controls using the closest Text control.
@ -476,11 +523,11 @@ Change Log
app.Notepad.Edit.RightClick() app.Notepad.Edit.RightClick()
# need to use MenuClick rather then MenuSelect # need to use MenuClick rather then MenuSelect
app.PopupMenu.MenuClick("Select All") app.PopupMenu.MenuClick("Select All")
app.Notepad.Edit.RightClick() app.Notepad.Edit.RightClick()
app.PopupMenu.MenuClick("Copy") app.PopupMenu.MenuClick("Copy")
I could think of merging the ``RightClick()`` and ``MenuSelect()`` into one method I could think of merging the ``RightClick()`` and ``MenuSelect()`` into one method
``ContextMenuSelect()`` if that makes sense to most people. ``ContextMenuSelect()`` if that makes sense to most people.
* Added Support for Up-Down controls * Added Support for Up-Down controls
@ -491,12 +538,12 @@ Change Log
This was primarily implemented due to work I did getting the System Tray. This was primarily implemented due to work I did getting the System Tray.
* Renamed ``StatusBarWrapper.PartWidths()`` to ``PartRightEdges()`` as this * Renamed ``StatusBarWrapper.PartWidths()`` to ``PartRightEdges()`` as this
is more correct for what it returns. is more correct for what it returns.
* Changed HwndWrapper.Text() and SetText() to WindowText() and * Changed HwndWrapper.Text() and SetText() to WindowText() and
SetWindowText() respectively to try and make it clearer that it is SetWindowText() respectively to try and make it clearer that it is
the text returned by GetWindowText and not the text that is visible the text returned by GetWindowText and not the text that is visible
on the control. This change also suggested that EditWrapper.SetText() on the control. This change also suggested that EditWrapper.SetText()
be changed to SetEditText() (though this is not a hard requirement be changed to SetEditText() (though this is not a hard requirement
EditWrapper.SetText() still exists - but may be deprecated. EditWrapper.SetText() still exists - but may be deprecated.
@ -506,7 +553,7 @@ Change Log
WM_LBUTTONDOWN, WM_RBUTTONUP, etc used by Click, DoubleClick etc. WM_LBUTTONDOWN, WM_RBUTTONUP, etc used by Click, DoubleClick etc.
I also added a MenuClick method that allows you to click on menu I also added a MenuClick method that allows you to click on menu
items. This means you can now 'physically' drop menus down. items. This means you can now 'physically' drop menus down.
* Some further working with tooltips that need to be cleaned up. * Some further working with tooltips that need to be cleaned up.
@ -519,15 +566,15 @@ Change Log
app.Notepad.MenuItem("View") app.Notepad.MenuItem("View")
app.Notepad.MenuItem("View->Status Bar") app.Notepad.MenuItem("View->Status Bar")
MenuItems have various actions so for example you can use MenuItems have various actions so for example you can use
``MenuItem.IsChecked()`` to check if the menu item is checked. ``MenuItem.IsChecked()`` to check if the menu item is checked.
Among other methods there are ``Click()`` and ``Enabled()``. Among other methods there are ``Click()`` and ``Enabled()``.
* Modified the 'best match' algorithm for finding controls. * Modified the 'best match' algorithm for finding controls.
It now searches a couple of times, and tries to find the best 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 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 "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 what I want!". It is possible this change could mean you need to
use new identifiers in scripts - but in general very little modification use new identifiers in scripts - but in general very little modification
should be necessary. should be necessary.
@ -536,7 +583,7 @@ Change Log
implementation. It also had a bug for controls above the control implementation. It also had a bug for controls above the control
rather than to the left. rather than to the left.
* Added a new example scripts SaveFromInternetExplorer.py and * Added a new example scripts SaveFromInternetExplorer.py and
SaveFromFirefox.py which show automating downloading of a page SaveFromFirefox.py which show automating downloading of a page
from either of these browsers. from either of these browsers.
@ -550,25 +597,25 @@ Change Log
* Changed how windows are searched for (from application) * Changed how windows are searched for (from application)
This chage should not be a significant change for users This chage should not be a significant change for users
* Started adding unit tests (and the have already uncovered bugs * Started adding unit tests (and the have already uncovered bugs
that been fixed). They also point to areas of missing functionality that been fixed). They also point to areas of missing functionality
that will be addded with future updates that will be addded with future updates
* Changed from property access to Control attributes to function access * Changed from property access to Control attributes to function access
If your code was accessing properties of controls then this might be a If your code was accessing properties of controls then this might be a
significant change! The main reasons for doing this were due to the significant change! The main reasons for doing this were due to the
inheritability of properties (or lack there-of!) and the additional inheritability of properties (or lack there-of!) and the additional
scafolding that was required to define them all. scafolding that was required to define them all.
* Updated the ``DialogWrapper.MenuSelect()`` method to notify the parent * Updated the ``DialogWrapper.MenuSelect()`` method to notify the parent
that it needs to initialize the menu's before it retrieves the items that it needs to initialize the menu's before it retrieves the items
* Added functionality to associate 'non-text' controls with the 'text' * Added functionality to associate 'non-text' controls with the 'text'
control closest to them. This allows controls to be referenced by:: control closest to them. This allows controls to be referenced by::
app.dlg.<Nearby_text><Window_class> app.dlg.<Nearby_text><Window_class>
e.g. to reference the "Footer" edit control in the Page Setup dialog e.g. to reference the "Footer" edit control in the Page Setup dialog
you could use:: you could use::
app.PageSetup.FooterEdit app.PageSetup.FooterEdit
@ -578,8 +625,8 @@ Change Log
* Did some more cleanup (fixing pylint warnings) but still not finished * Did some more cleanup (fixing pylint warnings) but still not finished
* Added some better support for .NET controls (not to be considered final) * Added some better support for .NET controls (not to be considered final)
0.1.3 Many changes, few visible 0.1.3 Many changes, few visible
@ -590,11 +637,11 @@ Change Log
* Ran pychecker and pylint and fixed some errors/warning * Ran pychecker and pylint and fixed some errors/warning
* changed :: * changed ::
_connect, _start, _window, _control, _write _connect, _start, _window, _control, _write
respectively to :: respectively to ::
connect_, start_, window_, connect_, write_ connect_, start_, window_, connect_, write_
If you forget to change ``_window``, ``_connect`` and ``_start`` then you will probably get the following error. :: If you forget to change ``_window``, ``_connect`` and ``_start`` then you will probably get the following error. ::
@ -608,8 +655,8 @@ Change Log
* Refactored some of the methods in common_controls * Refactored some of the methods in common_controls
* Refactored how FriendlyClassName is discovered (and still not really happy! * Refactored how FriendlyClassName is discovered (and still not really happy!
0.1.2 Add Readme and rollup various changes 0.1.2 Add Readme and rollup various changes
------------------------------------------------ ------------------------------------------------
15-Jan-2006 15-Jan-2006
@ -625,7 +672,7 @@ Change Log
* Added section to save the document as UTF-8 in MinimalNotepadTest * Added section to save the document as UTF-8 in MinimalNotepadTest
* Fixed EscapeSpecials and UnEscapeSpecials in XMLHelpers * Fixed EscapeSpecials and UnEscapeSpecials in XMLHelpers
* Made sure that overly large bitmaps do not break XML writing * Made sure that overly large bitmaps do not break XML writing
0.1.1 Minor bug fix release 0.1.1 Minor bug fix release
------------------------------------------------ ------------------------------------------------