客户端程序自动化测试客户端程序自动化测试 图片对象判断图片对象判断-pywinauto获取图片坐获取图片坐
标,标,PIL实现图片对比实现图片对比
本文主要参考以下博文,感谢其作者的总结分享。
https://www.cnblogs.com/ybcao/p/5463030.html
https://www.cnblogs.com/fnng/p/4881102.html
背景:背景:
做CS架构的客户端应用程序UI自动化测试时,需要用图标的状态来判断程序运行的结果。图标的控件类型为Image。所以需
要通过判断图标所在的图片来实现自动化用例中的断言。
解决方案:解决方案:
首先,需要定位到目标控件的坐标,然后截图,再将截图与期望图片进行比较。
这里主要需要解决的3个点:
获取图片控件坐标
截图
比较图片
经过查询,python系现有模块中pywinauto、Pillow模块即可实现上述功能。
其中pywinauto可以获取控件坐标,Pillow模块可以根据坐标截图,并比较指定图片。
pywinauto实现指定控件的坐标获取实现指定控件的坐标获取
这里主要利用pywinauto框架提供print_control_identifiers()方法,该方法将输出应用程序的控件信息,默认输出到标准输出
中,但为了对其处理,重定向标准输出,使得控件信息写入到指定列表内。
import sys
# TempStdoutArea对象为为重定向标准输出准备的空间,以列表形式存在
class TempStdoutArea:
def __init__(self):
self.buffer = [] def write(self, *args, **kwargs):
self.buffer.append(args)
# 实现获取指定控件坐标的对象
class GetControlCoord:
# app为 pywinauto框架实例化的Application对象
def __init__(self, app):
self.app = app
# 获取指定控件坐标的方法,control参数传入指定控件
def get_coord(self, control):
# 重定向标准输出,将原本的标准输出信息写入自定义的空间内,以获取控件信息
stdout = sys.stdout
sys.stdout = TempStdoutArea()
# pywinauto框架提供的print_control_identifiers()方法,可以打印出应用程序的控件信息,其中就包含控件坐标
self.app.print_control_identifiers()
# 将控件信息转移到control_identifiers,并还原标准输出
control_identifiers, sys.stdout = sys.stdout, stdout
#print(control_identifiers.buffer)
all_coord = [] # 遍历控件信息,获取指定控件的坐标
for a_control_identifier in control_identifiers.buffer:
#print(a_control_identifier)
#print(a_control_identifier[0])
a_control_identifier = a_control_identifier[0]
if a_control_identifier.find(control) > -1:
#print(a_control_identifier)
a_coord = [] str_coord = a_control_identifier[a_control_identifier.find('(')+1 : a_control_identifier.find(')')].split(',')
#print(str_coord)
for i in str_coord:
num = int(i.strip()[1:])
a_coord.append(num)
all_coord.append(a_coord)
return all_coord
评论10