Updated documentation for upcoming release
This commit is contained in:
parent
4ee85bcad7
commit
89fac02f13
@ -1,206 +1,225 @@
|
|||||||
|
0.3.4 Fixed issue with latest ctypes, updated print_control_identifiers()
|
||||||
|
------------------------------------------------------------------
|
||||||
|
XX-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.
|
||||||
|
|
||||||
0.3.3 Added some methods, and fixed some small bugs
|
0.3.3 Added some methods, and fixed some small bugs
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
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
|
||||||
they will take either the slowest or fastest of the new/current
|
they will take either the slowest or fastest of the new/current
|
||||||
setting rather then blindly setting to the new value.
|
setting rather then blindly setting to the new value.
|
||||||
|
|
||||||
* Fixed some hidden bugs with HwndWrapper.CloseClick()
|
* Fixed some hidden bugs with HwndWrapper.CloseClick()
|
||||||
|
|
||||||
* Fixed a bug in setup.py that would raise an error when no
|
* Fixed a bug in setup.py that would raise an error when no
|
||||||
argument was specified
|
argument was specified
|
||||||
|
|
||||||
* 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!.
|
||||||
|
|
||||||
|
|
||||||
0.3.2 Fixed setup.py and some typos
|
0.3.2 Fixed setup.py and some typos
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
31-Mar-2006
|
31-Mar-2006
|
||||||
|
|
||||||
* Fixed the spelling of Stefaan Himpe's name
|
* Fixed the spelling of Stefaan Himpe's name
|
||||||
|
|
||||||
* Fixed setup.py which was working for creating a distribution but
|
* Fixed setup.py which was working for creating a distribution but
|
||||||
not for installing it (again thanks to Stefaan for pointing it out!)
|
not for installing it (again thanks to Stefaan for pointing it out!)
|
||||||
|
|
||||||
|
|
||||||
0.3.1 Performance tune-ups
|
0.3.1 Performance tune-ups
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
30-Mar-2006
|
30-Mar-2006
|
||||||
|
|
||||||
* Change calculation of distance in findbestmatch.GetNonTextControlName()
|
* Change calculation of distance in findbestmatch.GetNonTextControlName()
|
||||||
so that it does not need to square or get the square root to
|
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
|
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
|
|
||||||
avoid compiling the regular expression for window that is being
|
|
||||||
tested (Thanks to Stefaan Himpe)
|
|
||||||
|
|
||||||
* Made it easier to add your own control tests by adding a file
|
|
||||||
extra_tests.py which needs to export a ModifyRegisteredTests() method.
|
|
||||||
Also cleaned up the code a little.
|
|
||||||
|
|
||||||
* 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
|
* Compiled regular expression patterns before doing the match to
|
||||||
to avoid having to match against all classes constantly.
|
avoid compiling the regular expression for window that is being
|
||||||
|
tested (Thanks to Stefaan Himpe)
|
||||||
|
|
||||||
* Changed default timeout in SendMessageTimeout to .001 seconds from .4
|
* Made it easier to add your own control tests by adding a file
|
||||||
seconds this results in a significant speedup. Will need to make this
|
extra_tests.py which needs to export a ModifyRegisteredTests() method.
|
||||||
value modifiable via the timing module/routine.
|
Also cleaned up the code a little.
|
||||||
|
|
||||||
* WaitNot was raising an error if the control was not found - it should
|
* Updated notepad_fast.py to make it easier to profile (adde a method)
|
||||||
have returned (i.e. success - control is not in any particular state
|
|
||||||
because it does not exist!).
|
|
||||||
|
|
||||||
* Added ListViewWrapper.Deselect() per Chistophe Keller's suggestion.
|
* Changed WrapHandle to use a cache for classes it has matched - this is
|
||||||
While I was at it I added a check on the item value passed in and added
|
to avoid having to match against all classes constantly.
|
||||||
a call to WaitGuiIdle(self) so that the control has a chance to process
|
|
||||||
the message.
|
* Changed default timeout in 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!).
|
||||||
|
|
||||||
|
* 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
|
||||||
|
a call to WaitGuiIdle(self) so that the control has a chance to process
|
||||||
|
the message.
|
||||||
|
|
||||||
|
* Changed doc templates and moved dependencies into pywinauto
|
||||||
|
subversion to ensure that all files were availabe at www.openqa.org and
|
||||||
|
that they are not broken when viewed there.
|
||||||
|
|
||||||
|
* Moved all timing information into the timings.Timings class. There are
|
||||||
|
some simple methods for changing the timings.
|
||||||
|
|
||||||
* Changed doc templates and moved dependencies into pywinauto
|
|
||||||
subversion to ensure that all files were availabe at www.openqa.org and
|
|
||||||
that they are not broken when viewed there.
|
|
||||||
|
|
||||||
* Moved all timing information into the timings.Timings class. There are
|
|
||||||
some simple methods for changing the timings.
|
|
||||||
|
|
||||||
|
|
||||||
0.3.0 Added Application data - now useful for localization testing
|
0.3.0 Added Application data - now useful for localization testing
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
20-Mar-2006
|
20-Mar-2006
|
||||||
|
|
||||||
* Added automatic Application data collection which can be used when
|
* Added automatic Application data collection which can be used when
|
||||||
running the same test on a different spoken language version. Support
|
running the same test on a different spoken language version. Support
|
||||||
is still preliminary and is expected to change. Please treat as early
|
is still preliminary and is expected to change. Please treat as early
|
||||||
Alpha.
|
Alpha.
|
||||||
|
|
||||||
If you have a different language version of Windows then you can try
|
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
|
this out by running the notepad_fast.py example with the langauge
|
||||||
argument e.g. ::
|
argument e.g. ::
|
||||||
|
|
||||||
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.
|
||||||
Previously you needed to write code like ::
|
Previously you needed to write code like ::
|
||||||
|
|
||||||
app = Application().connect_(title = 'Find')
|
app = Application().connect_(title = 'Find')
|
||||||
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::
|
||||||
|
|
||||||
app = Application.connect(title = 'Find')
|
app = Application.connect(title = 'Find')
|
||||||
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()
|
||||||
app.Find.Close.Click()
|
app.Find.Close.Click()
|
||||||
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
|
||||||
was not in the foreground. (it now makes the window foreground as well
|
was not in the foreground. (it now makes the window foreground as well
|
||||||
as giving it focus). This overcomes a restriction in Windows where
|
as giving it focus). This overcomes a restriction in Windows where
|
||||||
you can only change the foreground window if you own the foreground
|
you can only change the foreground window if you own the foreground
|
||||||
window.
|
window.
|
||||||
|
|
||||||
* Changed some 2.4'isms that an anonymous commenter left on my blog :-)
|
* Changed some 2.4'isms that an anonymous commenter left on my blog :-)
|
||||||
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.
|
||||||
|
|
||||||
* Fixed Bug 1452832 where clipboard was not closed in clipboard.GetData()
|
* Fixed Bug 1452832 where clipboard was not closed in clipboard.GetData()
|
||||||
|
|
||||||
* Added more unit tests now up to 248 from 207
|
* Added more unit tests now up to 248 from 207
|
||||||
|
|
||||||
|
|
||||||
0.2.5 More refactoring, more tests
|
0.2.5 More refactoring, more tests
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
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.
|
|
||||||
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.
|
|
||||||
|
|
||||||
* Slightly modified timeout waits for control resolution so that a timed
|
|
||||||
function more accurately follows the timeout value specified.
|
|
||||||
|
|
||||||
* Added 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")
|
|
||||||
|
|
||||||
* Updated the examples to follow changes to the code - and to make them a little
|
|
||||||
more robust.
|
|
||||||
|
|
||||||
* Added a new Controls Overview document page which lists all the actions on
|
* Added application.WindowSpecification.Wait() and WaitNot() methods.
|
||||||
all controls.
|
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
|
||||||
* Added more unit tests now up to 207 from 134 (added 68 tests)
|
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.
|
||||||
|
|
||||||
|
* Slightly modified timeout waits for control resolution so that a timed
|
||||||
|
function more accurately follows the timeout value specified.
|
||||||
|
|
||||||
|
* Added 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")
|
||||||
|
|
||||||
|
* Updated the examples to follow changes to the code - and to make them a little
|
||||||
|
more robust.
|
||||||
|
|
||||||
|
* Added a new Controls Overview document page which lists all the actions on
|
||||||
|
all controls.
|
||||||
|
|
||||||
|
* Added more unit tests now up to 207 from 134 (added 68 tests)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -208,122 +227,122 @@
|
|||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
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.
|
|
||||||
This closest text control will normally be the static/label associated
|
|
||||||
with the control. For example in Notepad, Format->Font dialog, the 1st
|
|
||||||
combobox can be refered to as "FontComboBox" rather than "ComboBox1"
|
|
||||||
|
|
||||||
* Added a new control wrapper - ``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
|
* Allow access to non text controls using the closest Text control.
|
||||||
the X and Y coordinates swapped.
|
This closest text control will normally be the static/label associated
|
||||||
|
with the control. For example in Notepad, Format->Font dialog, the 1st
|
||||||
|
combobox can be refered to as "FontComboBox" rather than "ComboBox1"
|
||||||
|
|
||||||
* Added new MenuItem and Menu classes that are to the most part hidden
|
* Added a new control wrapper - ``PopupMenuWrapper`` for context menu's
|
||||||
but you can get a menu item by doing ::
|
You can now work easily with context menu's
|
||||||
|
e.g. ::
|
||||||
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.
|
app.Notepad.Edit.RightClick()
|
||||||
It now searches a couple of times, and tries to find the best
|
# need to use MenuClick rather then MenuSelect
|
||||||
fit for the text passed to it. The idea here is to make it more
|
app.PopupMenu.MenuClick("Select All")
|
||||||
"Select what I want - not that other thing that looks a bit like
|
app.Notepad.Edit.RightClick()
|
||||||
what I want!". It is possible this change could mean you need to
|
app.PopupMenu.MenuClick("Copy")
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
||||||
0.2.0 Significant refactoring
|
0.2.0 Significant refactoring
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
06-Feb-2006
|
06-Feb-2006
|
||||||
|
|
||||||
* 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
|
|
||||||
that been fixed). They also point to areas of missing functionality
|
|
||||||
that will be addded with future updates
|
|
||||||
|
|
||||||
* Changed from property access to Control attributes to function access
|
|
||||||
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
|
|
||||||
inheritability of properties (or lack there-of!) and the additional
|
|
||||||
scafolding that was required to define them all.
|
|
||||||
|
|
||||||
* Updated the ``DialogWrapper.MenuSelect()`` method to notify the parent
|
|
||||||
that it needs to initialize the menu's before it retrieves the items
|
|
||||||
|
|
||||||
* Added functionality to associate 'non-text' controls with the 'text'
|
|
||||||
control closest to them. This allows controls to be referenced by::
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
* Added a MoveWindow method to HwndWrapper
|
|
||||||
|
|
||||||
* Did some more cleanup (fixing pylint warnings) but still not finished
|
|
||||||
|
|
||||||
* Added some better support for .NET controls (not to be considered final)
|
* Started adding unit tests (and the have already uncovered bugs
|
||||||
|
that been fixed). They also point to areas of missing functionality
|
||||||
|
that will be addded with future updates
|
||||||
|
|
||||||
|
* Changed from property access to Control attributes to function access
|
||||||
|
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
|
||||||
|
inheritability of properties (or lack there-of!) and the additional
|
||||||
|
scafolding that was required to define them all.
|
||||||
|
|
||||||
|
* Updated the ``DialogWrapper.MenuSelect()`` method to notify the parent
|
||||||
|
that it needs to initialize the menu's before it retrieves the items
|
||||||
|
|
||||||
|
* Added functionality to associate 'non-text' controls with the 'text'
|
||||||
|
control closest to them. This allows controls to be referenced by::
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
* Added a MoveWindow method to HwndWrapper
|
||||||
|
|
||||||
|
* Did some more cleanup (fixing pylint warnings) but still not finished
|
||||||
|
|
||||||
|
* Added some better support for .NET controls (not to be considered final)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -332,52 +351,52 @@
|
|||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
15-Jan-2006
|
15-Jan-2006
|
||||||
|
|
||||||
* Wrote doc strings for all modules, classes and functions
|
* Wrote doc strings for all modules, classes and functions
|
||||||
* 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. ::
|
||||||
|
|
||||||
TypeError: '_DynamicAttributes' object is not callable
|
TypeError: '_DynamicAttributes' object is not callable
|
||||||
|
|
||||||
* pywinauto is now a package name - you need to import it or its modules
|
* pywinauto is now a package name - you need to import it or its modules
|
||||||
* Changes to the code to deal with pywinauto package name
|
* Changes to the code to deal with pywinauto package name
|
||||||
* Fixed searching for windows if a Parent is passed in
|
* Fixed searching for windows if a Parent is passed in
|
||||||
* Added Index to retrieved MenuItem dictionary
|
* Added Index to retrieved MenuItem dictionary
|
||||||
* Added a check to ensure that a windows Handle is a valid window
|
* Added a check to ensure that a windows Handle is a valid window
|
||||||
* 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
|
||||||
|
|
||||||
* Updated Readme (original readme was incorrect)
|
* Updated Readme (original readme was incorrect)
|
||||||
* Added clipboard module
|
* Added clipboard module
|
||||||
* Fixed DrawOutline part of tests.__init__.print_bugs
|
* Fixed DrawOutline part of tests.__init__.print_bugs
|
||||||
* Added a NotifyParent to HwndWrapper
|
* Added a NotifyParent to HwndWrapper
|
||||||
* Make sure that HwndWrapper.ref is initialized to None
|
* Make sure that HwndWrapper.ref is initialized to None
|
||||||
* Refactored some methods of ComboBox and ListBox
|
* Refactored some methods of ComboBox and ListBox
|
||||||
* Updated Combo/ListBox selection methods
|
* Updated Combo/ListBox selection methods
|
||||||
* Removed hardcoded paths from test_application.py
|
* Removed hardcoded paths from test_application.py
|
||||||
* 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
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
12-Jan-2006
|
12-Jan-2006
|
||||||
|
|
||||||
* Fixed some minor bugs discovered after release
|
* Fixed some minor bugs discovered after release
|
||||||
|
|
||||||
0.1.0 Initial Release
|
0.1.0 Initial Release
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
|
@ -47,7 +47,7 @@ one of the following:
|
|||||||
:path: The path of the executable of the process (``GetModuleFileNameEx``
|
:path: The path of the executable of the process (``GetModuleFileNameEx``
|
||||||
is used to find the path of each process and compared against
|
is used to find the path of each process and compared against
|
||||||
the value passed in) e.g.
|
the value passed in) e.g.
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
app = Application()
|
app = Application()
|
||||||
@ -60,6 +60,16 @@ passed to the ``findwindows.find_windows()`` function. e.g. ::
|
|||||||
app.connect_(title_re = ".*Notepad", class_name = "Notepad")
|
app.connect_(title_re = ".*Notepad", class_name = "Notepad")
|
||||||
|
|
||||||
|
|
||||||
|
**Note**: I have since added static methods Application.start() and
|
||||||
|
Application.connect() these can be used the same as above - except that
|
||||||
|
you no longer need to instantiate an Application object first.
|
||||||
|
|
||||||
|
**Note2**: The application has to be ready before you can use connect*().
|
||||||
|
There is no timeout or retries like there is when finding the application
|
||||||
|
after start*(). So if you start the application outside of pywinauto you
|
||||||
|
need to either sleep or program a wait loop to wait until the application
|
||||||
|
has fully started.
|
||||||
|
|
||||||
|
|
||||||
How to sepcify a dialog of the application
|
How to sepcify a dialog of the application
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
@ -102,6 +112,12 @@ module select the dialog you want. Once you have the handle you need
|
|||||||
then use ::
|
then use ::
|
||||||
|
|
||||||
Application.window_(handle = win)
|
Application.window_(handle = win)
|
||||||
|
|
||||||
|
**Note**: If the title of the dialog is very long - then attribute access
|
||||||
|
might be very long to type, in those cases it is usually easier to use::
|
||||||
|
|
||||||
|
app.window_(title_re = ".*Part of Title.*")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
How to specify a control on a dialog
|
How to specify a control on a dialog
|
||||||
@ -131,9 +147,6 @@ the contol. And append the friendly class. So the list becomes
|
|||||||
|
|
||||||
Once a set of identifiers has been created for all controls in the dialog
|
Once a set of identifiers has been created for all controls in the dialog
|
||||||
we disambiguate them.
|
we disambiguate them.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use the `WindowSpecification.print_control_identifiers()` method
|
use the `WindowSpecification.print_control_identifiers()` method
|
||||||
|
|
||||||
@ -262,7 +275,6 @@ To see an example of this see ``examples\MiscExamples.py.GetInfo()``
|
|||||||
|
|
||||||
How to deal with controls that do not respond as expected (e.g. OwnerDraw Controls)
|
How to deal with controls that do not respond as expected (e.g. OwnerDraw Controls)
|
||||||
------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------
|
||||||
|
|
||||||
Some controls (especially Ownerdrawn controls) do not respond to events as
|
Some controls (especially Ownerdrawn controls) do not respond to events as
|
||||||
expected. For example if you look at any HLP file and go to the Index Tab (click
|
expected. For example if you look at any HLP file and go to the Index Tab (click
|
||||||
'Search' button) you will see a listbox. Running Spy or Winspector on this
|
'Search' button) you will see a listbox. Running Spy or Winspector on this
|
||||||
@ -317,7 +329,6 @@ Edit control above the list, and you CAN get the text of the item from there e.g
|
|||||||
|
|
||||||
How to Access the System Tray (aka SysTray, aka 'Notification Area')
|
How to Access the System Tray (aka SysTray, aka 'Notification Area')
|
||||||
------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------
|
||||||
|
|
||||||
Near the clock are icons representing running applications, this area is
|
Near the clock are icons representing running applications, this area is
|
||||||
normally referred to as the "System Tray". There are actually many different
|
normally referred to as the "System Tray". There are actually many different
|
||||||
windows/controls in this area. The control that contains the icons is actually
|
windows/controls in this area. The control that contains the icons is actually
|
||||||
|
@ -23,4 +23,4 @@ Python package for automating GUI manipulation on Windows
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
__revision__ = "$Revision$"
|
__revision__ = "$Revision$"
|
||||||
__version__ = "0.3.3"
|
__version__ = "0.3.4"
|
Loading…
Reference in New Issue
Block a user