1. 简介
在编写自动化测试脚本时,常常需要对窗口进行查找、遍历和点击操作。Python是一种非常流行的编程语言,而pywin32是它的一个重要模块,提供了对Windows操作系统的访问。本文将介绍如何使用Python和pywin32实现窗口查找、遍历和点击操作的示例代码。
2. 安装pywin32模块
在使用pywin32模块之前,我们需要先安装它。在Windows中,可以通过pip来安装:
pip install pywin32
3. 查找窗口
在进行窗口遍历和点击操作前,需要先定位到需要操作的窗口。pywin32提供了一系列函数来获取窗口句柄,并且可以根据窗口标题、类名和父窗口句柄等信息来查找窗口。下面是一个查找窗口的示例代码:
import win32gui
# 定义回调函数,用于查找窗口
def find_window_handle(hwnd, window_list):
window_list.append(hwnd)
return True
def find_window_by_title(title):
window_list = []
win32gui.EnumWindows(find_window_handle, window_list)
for hwnd in window_list:
if title in win32gui.GetWindowText(hwnd):
return hwnd
return None
def find_window_by_class(classname):
window_list = []
win32gui.EnumWindows(find_window_handle, window_list)
for hwnd in window_list:
if win32gui.GetClassName(hwnd) == classname:
return hwnd
return None
title = "计算器"
hwnd = find_window_by_title(title)
if hwnd:
print(f"找到窗口:{title}")
else:
print(f"未找到窗口:{title}")
上面的代码通过枚举所有窗口,然后调用回调函数来获取所有窗口的句柄。在回调函数中,将窗口句柄添加到一个列表中,最终返回True。查找窗口时,遍历所有窗口句柄,根据窗口标题或类名来查找目标窗口。如果找到了目标窗口,返回它的句柄。如果没有找到,返回None。
4. 遍历窗口子控件
在查找到目标窗口后,需要遍历它的所有子控件,以便在后续的操作中获取它们的句柄。pywin32提供了一系列函数来获取窗口的子控件,包括获取指定窗口的第一个子控件、获取下一个兄弟控件等。下面是一个遍历窗口子控件的示例代码:
import win32gui
import win32api
def get_child_windows(hwnd):
if not hwnd:
return []
hwnd_list = []
win32gui.EnumChildWindows(hwnd, lambda hwnd, param: param.append(hwnd), hwnd_list)
return hwnd_list
def get_classname_by_hwnd(hwnd):
return win32gui.GetClassName(hwnd)
def get_window_text_by_hwnd(hwnd):
length = win32gui.GetWindowTextLength(hwnd)
buf = win32api.PyMakeBuffer(length+1)
win32gui.GetWindowText(hwnd, buf, length+1)
return buf.value.decode("gbk")
if hwnd:
child_hwnd_list = get_child_windows(hwnd)
for child_hwnd in child_hwnd_list:
classname = get_classname_by_hwnd(child_hwnd)
text = get_window_text_by_hwnd(child_hwnd)
print(f"子控件,句柄:{child_hwnd} 类名:{classname} 文本:{text}")
上面的代码中,get_child_windows函数用来获取指定窗口的所有子控件句柄,它通过调用EnumChildWindows函数实现。EnumChildWindows函数接受三个参数,第一个参数是需要枚举子控件的父窗口句柄,第二个参数是一个回调函数,用来处理每个找到的子控件,第三个参数指向一个传递给回调函数的参数。在回调函数中,将子控件句柄添加到一个列表中,最终返回True。get_classname_by_hwnd函数用来获取指定窗口的类名,get_window_text_by_hwnd函数用来获取指定窗口的文本信息。
5. 点击窗口控件
在遍历到需要进行操作的窗口子控件后,可以通过模拟鼠标点击事件来实现对控件的自动化操作。pywin32提供了一些函数来模拟鼠标事件,如鼠标左键按下、鼠标左键抬起等。下面是一个点击按钮的示例代码:
import win32api
import win32con
def click_button_by_hwnd(hwnd):
left, top, right, bottom = win32gui.GetClientRect(hwnd)
x = left + int((right - left) / 2)
y = top + int((bottom - top) / 2)
win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, 1, win32api.MAKELONG(x, y))
win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, win32api.MAKELONG(x, y))
if hwnd:
child_hwnd_list = get_child_windows(hwnd)
for child_hwnd in child_hwnd_list:
classname = get_classname_by_hwnd(child_hwnd)
if classname == "Button":
click_button_by_hwnd(child_hwnd)
上面的代码中,click_button_by_hwnd函数用来模拟点击指定句柄的按钮控件。首先调用GetClientRect函数来获取按钮控件的坐标范围,并计算出按钮的中心坐标。然后依次调用SendMessage函数来发送鼠标左键按下、抬起等事件,从而完成对按钮的自动化点击操作。
6. 总结
本文介绍了使用Python和pywin32模块实现窗口查找、遍历和点击的示例代码。通过使用pywin32提供的函数,可以方便地实现自动化测试脚本中对Windows窗口的操作。读者可以根据自己的需求,进一步扩展上面的示例代码,实现更多的自动化操作。