Various minor changes
This commit is contained in:
parent
95b24c4d14
commit
9dd4006085
@ -1,6 +1,6 @@
|
|||||||
0.3.5 Moved to Metaclass control wrapping
|
0.3.5 Moved to Metaclass control wrapping
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
XX-May-2006
|
24-May-2006
|
||||||
* Moved to a metaclass implementation of control finding. This
|
* Moved to a metaclass implementation of control finding. This
|
||||||
removes some cyclic importing that had to be worked around and
|
removes some cyclic importing that had to be worked around and
|
||||||
other then metaclass magic makes the code a bit simpler.
|
other then metaclass magic makes the code a bit simpler.
|
||||||
@ -15,9 +15,13 @@ XX-May-2006
|
|||||||
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
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
0.3.4 Fixed issue with latest ctypes, speed gains, other changes
|
0.3.4 Fixed issue with latest ctypes, speed gains, other changes
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
|
@ -23,7 +23,7 @@ Python package for automating GUI manipulation on Windows
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
__revision__ = "$Revision$"
|
__revision__ = "$Revision$"
|
||||||
__version__ = "0.3.4"
|
__version__ = "0.3.5"
|
||||||
|
|
||||||
import findwindows
|
import findwindows
|
||||||
WindowAmbiguousError = findwindows.WindowAmbiguousError
|
WindowAmbiguousError = findwindows.WindowAmbiguousError
|
||||||
|
@ -515,22 +515,8 @@ class WindowSpecification(object):
|
|||||||
# warnings.warn(wait_method_deprecation, DeprecationWarning)
|
# warnings.warn(wait_method_deprecation, DeprecationWarning)
|
||||||
# self.WaitNot('exists', timeout, retry_interval)
|
# self.WaitNot('exists', timeout, retry_interval)
|
||||||
|
|
||||||
def PrintControlIdentifiers(self):
|
def _ctrl_identifiers(self):
|
||||||
"""Prints the 'identifiers'
|
|
||||||
|
|
||||||
If you pass in a control then it just prints the identifiers
|
|
||||||
for that control
|
|
||||||
|
|
||||||
If you pass in a dialog then it prints the identiferis for all
|
|
||||||
controls in the dialog
|
|
||||||
|
|
||||||
:Note: The identifiers printed by this method have not been made
|
|
||||||
unique. So if you have 2 edit boxes, they will both have "Edit"
|
|
||||||
listed in their identifiers. In reality though the first one
|
|
||||||
can be refered to as "Edit", "Edit0", "Edit1" and the 2nd
|
|
||||||
should be refered to as "Edit2".
|
|
||||||
|
|
||||||
"""
|
|
||||||
ctrls = _resolve_control(
|
ctrls = _resolve_control(
|
||||||
self.criteria)
|
self.criteria)
|
||||||
|
|
||||||
@ -553,6 +539,49 @@ class WindowSpecification(object):
|
|||||||
for name, ctrl in name_control_map.items():
|
for name, ctrl in name_control_map.items():
|
||||||
control_name_map.setdefault(ctrl, []).append(name)
|
control_name_map.setdefault(ctrl, []).append(name)
|
||||||
|
|
||||||
|
return control_name_map
|
||||||
|
|
||||||
|
def PrintControlIdentifiers(self):
|
||||||
|
"""Prints the 'identifiers'
|
||||||
|
|
||||||
|
If you pass in a control then it just prints the identifiers
|
||||||
|
for that control
|
||||||
|
|
||||||
|
If you pass in a dialog then it prints the identiferis for all
|
||||||
|
controls in the dialog
|
||||||
|
|
||||||
|
:Note: The identifiers printed by this method have not been made
|
||||||
|
unique. So if you have 2 edit boxes, they will both have "Edit"
|
||||||
|
listed in their identifiers. In reality though the first one
|
||||||
|
can be refered to as "Edit", "Edit0", "Edit1" and the 2nd
|
||||||
|
should be refered to as "Edit2".
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
#name_control_map = self._ctrl_identifiers()
|
||||||
|
ctrls = _resolve_control(
|
||||||
|
self.criteria)
|
||||||
|
|
||||||
|
if ctrls[-1].IsDialog():
|
||||||
|
# dialog controls are all the control on the dialog
|
||||||
|
dialog_controls = ctrls[-1].Children()
|
||||||
|
|
||||||
|
ctrls_to_print = dialog_controls[:]
|
||||||
|
# filter out hidden controls
|
||||||
|
ctrls_to_print = [ctrl for ctrl in ctrls_to_print if ctrl.IsVisible()]
|
||||||
|
else:
|
||||||
|
dialog_controls = ctrls[-1].TopLevelParent().Children()
|
||||||
|
ctrls_to_print = [ctrls[-1]]
|
||||||
|
|
||||||
|
# build the list of disambiguated list of control names
|
||||||
|
name_control_map = findbestmatch.build_unique_dict(dialog_controls)
|
||||||
|
|
||||||
|
# swap it around so that we are mapped off the controls
|
||||||
|
control_name_map = {}
|
||||||
|
for name, ctrl in name_control_map.items():
|
||||||
|
#print name, ctrl
|
||||||
|
control_name_map.setdefault(ctrl, []).append(name)
|
||||||
|
|
||||||
print "Control Identifiers:"
|
print "Control Identifiers:"
|
||||||
for ctrl in ctrls_to_print:
|
for ctrl in ctrls_to_print:
|
||||||
|
|
||||||
@ -1029,7 +1058,7 @@ class Application(object):
|
|||||||
#raise AppNotConnected(
|
#raise AppNotConnected(
|
||||||
# "Please use start_ or connect_ before trying anything else")
|
# "Please use start_ or connect_ before trying anything else")
|
||||||
win_spec = WindowSpecification(self, kwargs)
|
win_spec = WindowSpecification(self, kwargs)
|
||||||
self.process = win_spec.ctrl_().ProcessID()
|
self.process = win_spec.WrapperObject().ProcessID()
|
||||||
# add the restriction for this particular process
|
# add the restriction for this particular process
|
||||||
else:
|
else:
|
||||||
kwargs['process'] = self.process
|
kwargs['process'] = self.process
|
||||||
|
@ -244,6 +244,36 @@ class ListViewWrapper(HwndWrapper.HwndWrapper):
|
|||||||
"Return a list of all the column widths"
|
"Return a list of all the column widths"
|
||||||
return [col['width'] for col in self.Columns()]
|
return [col['width'] for col in self.Columns()]
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
def GetItemRect(self, item_index):
|
||||||
|
"Return the bounding rectangle of the list view item"
|
||||||
|
# set up a memory block in the remote application
|
||||||
|
remote_mem = _RemoteMemoryBlock(self)
|
||||||
|
rect = win32structures.RECT()
|
||||||
|
|
||||||
|
rect.left = win32defines.LVIR_SELECTBOUNDS
|
||||||
|
|
||||||
|
# Write the local RECT structure to the remote memory block
|
||||||
|
remote_mem.Write(rect)
|
||||||
|
|
||||||
|
# Fill in the requested item
|
||||||
|
retval = self.SendMessage(
|
||||||
|
win32defines.LVM_GETITEMRECT,
|
||||||
|
item_index,
|
||||||
|
remote_mem)
|
||||||
|
|
||||||
|
# if it succeeded
|
||||||
|
if not retval:
|
||||||
|
del remote_mem
|
||||||
|
raise RuntimeError("Did not succeed in getting rectable")
|
||||||
|
|
||||||
|
rect = remote_mem.Read(rect)
|
||||||
|
|
||||||
|
del remote_mem
|
||||||
|
|
||||||
|
return rect
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
def GetItem(self, item_index, subitem_index = 0):
|
def GetItem(self, item_index, subitem_index = 0):
|
||||||
"Return the item of the list view"
|
"Return the item of the list view"
|
||||||
@ -1795,15 +1825,18 @@ class UpDownWrapper(HwndWrapper.HwndWrapper):
|
|||||||
#HwndWrapper.HwndWrapper.__init__(self, hwnd)
|
#HwndWrapper.HwndWrapper.__init__(self, hwnd)
|
||||||
super(UpDownWrapper, self).__init__(hwnd)
|
super(UpDownWrapper, self).__init__(hwnd)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------
|
||||||
def GetValue(self):
|
def GetValue(self):
|
||||||
"Get the current value of the UpDown control"
|
"Get the current value of the UpDown control"
|
||||||
pos = self.SendMessage(win32defines.UDM_GETPOS)
|
pos = self.SendMessage(win32defines.UDM_GETPOS)
|
||||||
return win32functions.LoWord(pos)
|
return win32functions.LoWord(pos)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------
|
||||||
def GetBase(self):
|
def GetBase(self):
|
||||||
"Get the base the UpDown control (either 10 or 16)"
|
"Get the base the UpDown control (either 10 or 16)"
|
||||||
return self.SendMessage(win32defines.UDM_GETBASE)
|
return self.SendMessage(win32defines.UDM_GETBASE)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------
|
||||||
def GetRange(self):
|
def GetRange(self):
|
||||||
"Return the lower, upper range of the up down control"
|
"Return the lower, upper range of the up down control"
|
||||||
updown_range = self.SendMessage(win32defines.UDM_GETRANGE)
|
updown_range = self.SendMessage(win32defines.UDM_GETRANGE)
|
||||||
@ -1813,6 +1846,7 @@ class UpDownWrapper(HwndWrapper.HwndWrapper):
|
|||||||
)
|
)
|
||||||
return updown_range
|
return updown_range
|
||||||
|
|
||||||
|
#----------------------------------------------------------------
|
||||||
def GetBuddyControl(self):
|
def GetBuddyControl(self):
|
||||||
"Get the buddy control of the updown control"
|
"Get the buddy control of the updown control"
|
||||||
#from wraphandle import WrapHandle
|
#from wraphandle import WrapHandle
|
||||||
@ -1820,6 +1854,7 @@ class UpDownWrapper(HwndWrapper.HwndWrapper):
|
|||||||
buddy_handle = self.SendMessage(win32defines.UDM_GETBUDDY)
|
buddy_handle = self.SendMessage(win32defines.UDM_GETBUDDY)
|
||||||
return HwndWrapper.HwndWrapper(buddy_handle)
|
return HwndWrapper.HwndWrapper(buddy_handle)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------
|
||||||
def SetValue(self, new_pos):
|
def SetValue(self, new_pos):
|
||||||
"Set the value of the of the UpDown control to some integer value"
|
"Set the value of the of the UpDown control to some integer value"
|
||||||
self.SendMessageTimeout(
|
self.SendMessageTimeout(
|
||||||
@ -1828,6 +1863,7 @@ class UpDownWrapper(HwndWrapper.HwndWrapper):
|
|||||||
win32functions.WaitGuiThreadIdle(self)
|
win32functions.WaitGuiThreadIdle(self)
|
||||||
time.sleep(Timings.after_updownchange_wait)
|
time.sleep(Timings.after_updownchange_wait)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------
|
||||||
def Increment(self):
|
def Increment(self):
|
||||||
"Increment the number in the UpDown control by one"
|
"Increment the number in the UpDown control by one"
|
||||||
# hmmm - VM_SCROLL and UDN_DELTAPOS don't seem to be working for me :-(
|
# hmmm - VM_SCROLL and UDN_DELTAPOS don't seem to be working for me :-(
|
||||||
@ -1837,6 +1873,7 @@ class UpDownWrapper(HwndWrapper.HwndWrapper):
|
|||||||
win32functions.WaitGuiThreadIdle(self)
|
win32functions.WaitGuiThreadIdle(self)
|
||||||
time.sleep(Timings.after_updownchange_wait)
|
time.sleep(Timings.after_updownchange_wait)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------
|
||||||
def Decrement(self):
|
def Decrement(self):
|
||||||
"Decrement the number in the UpDown control by one"
|
"Decrement the number in the UpDown control by one"
|
||||||
self.SetValue(self.GetValue() - 1)
|
self.SetValue(self.GetValue() - 1)
|
||||||
@ -1852,6 +1889,29 @@ class TrackbarWrapper(HwndWrapper.HwndWrapper):
|
|||||||
friendlyclassname = "Trackbar"
|
friendlyclassname = "Trackbar"
|
||||||
windowclasses = ["msctls_trackbar", ]
|
windowclasses = ["msctls_trackbar", ]
|
||||||
|
|
||||||
|
#
|
||||||
|
# #----------------------------------------------------------------
|
||||||
|
# def GetNumTicks(self):
|
||||||
|
# return self.SendMessage(win32defines.TBM_GETNUMTICS)
|
||||||
|
#
|
||||||
|
# #----------------------------------------------------------------
|
||||||
|
# def GetPos(self):
|
||||||
|
# return self.SendMessage(win32defines.TBM_GETPOS)
|
||||||
|
#
|
||||||
|
# #----------------------------------------------------------------
|
||||||
|
# def GetRangeMax(self):
|
||||||
|
# return self.SendMessage(win32defines.TBM_GETRANGEMAX)
|
||||||
|
#
|
||||||
|
# #----------------------------------------------------------------
|
||||||
|
# def GetRangeMin(self):
|
||||||
|
# return self.SendMessage(win32defines.TBM_GETRANGEMIN)
|
||||||
|
#
|
||||||
|
# #----------------------------------------------------------------
|
||||||
|
# def GetToolTipsControl(self):
|
||||||
|
# "Return teh tooltip control associated with this control"
|
||||||
|
# return ToolTipsWrapper(self.SendMessage(win32defines.TBM_GETTOOLTIPS))
|
||||||
|
|
||||||
|
|
||||||
#====================================================================
|
#====================================================================
|
||||||
class AnimationWrapper(HwndWrapper.HwndWrapper):
|
class AnimationWrapper(HwndWrapper.HwndWrapper):
|
||||||
"Class that wraps Windows Animation common control "
|
"Class that wraps Windows Animation common control "
|
||||||
|
@ -139,15 +139,15 @@ def find_windows(class_name = None,
|
|||||||
|
|
||||||
# if the ctrl_index has been specified then just return
|
# if the ctrl_index has been specified then just return
|
||||||
# that control
|
# that control
|
||||||
if ctrl_index:
|
if ctrl_index is not None:
|
||||||
return [windows[ctrl_index]]
|
return [windows[ctrl_index]]
|
||||||
|
|
||||||
|
|
||||||
if class_name is not None and windows:
|
if class_name is not None and windows:
|
||||||
windows = [win for win in windows
|
windows = [win for win in windows
|
||||||
if class_name == handleprops.classname(win)]
|
if class_name == handleprops.classname(win)]
|
||||||
|
|
||||||
if class_name_re is not None and windows:
|
if class_name_re is not None and windows:
|
||||||
class_name_regex = re.compile(class_name_re)
|
class_name_regex = re.compile(class_name_re)
|
||||||
windows = [win for win in windows
|
windows = [win for win in windows
|
||||||
if class_name_regex.match(handleprops.classname(win))]
|
if class_name_regex.match(handleprops.classname(win))]
|
||||||
@ -160,7 +160,7 @@ def find_windows(class_name = None,
|
|||||||
windows = [win for win in windows
|
windows = [win for win in windows
|
||||||
if title == handleprops.text(win)]
|
if title == handleprops.text(win)]
|
||||||
|
|
||||||
elif title_re is not None and windows:
|
elif title_re is not None and windows:
|
||||||
title_regex = re.compile(title_re)
|
title_regex = re.compile(title_re)
|
||||||
windows = [win for win in windows
|
windows = [win for win in windows
|
||||||
if title_regex.match(handleprops.text(win))]
|
if title_regex.match(handleprops.text(win))]
|
||||||
@ -171,7 +171,7 @@ def find_windows(class_name = None,
|
|||||||
if enabled_only and windows:
|
if enabled_only and windows:
|
||||||
windows = [win for win in windows if handleprops.isenabled(win)]
|
windows = [win for win in windows if handleprops.isenabled(win)]
|
||||||
|
|
||||||
if best_match is not None and windows:
|
if best_match is not None and windows:
|
||||||
from controls import WrapHandle
|
from controls import WrapHandle
|
||||||
windows = [WrapHandle(win) for win in windows]
|
windows = [WrapHandle(win) for win in windows]
|
||||||
windows = findbestmatch.find_best_control_matches(
|
windows = findbestmatch.find_best_control_matches(
|
||||||
|
Loading…
Reference in New Issue
Block a user