GitHub - RockFeng0/uiwpfdriver: windows UI自动化测试的进阶,封装了最新的muiapy项目工程源码,采用简单的RPC原理,支持python等其他语言的调用

痛点

  • muiapy项目,在Windows窗口自动化中,相对底层一些,需要大量编码,为此,再次封装了一下
  • 解决了ironpython项目的语言限制,打包并分装了项目,编写 Window UI的自动化测试脚本,开源采用了三种方式: 命令行、交互、socket(简单RPC)
  • 建议采用RPC模式, 打开 uiwpfdriver.exe服务器,监听localhost:5820,然后按照约定的格式写出请求,加密成base64,发送即可


uiwpfdriver 的几种使用方式

命令行模式

  • 特点是 简单易用
  • 在release_version中,下载 command_line_version 的最新版本
# 用法
import base64,json,os,subprocess

request = {'req': {
                 'action': 'StartApplication', 
                 'args': (r'D:\auto\python\uiwpfdriver\test_app\npp.5.7.Installer.exe',), 
                 'kwargs': {}
                 }
        }
bstr = base64.b64encode(json.dumps(request))
subp = subprocess.Popen(["uiwpfdriver.exe",bstr],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
result = subp.stdout.readline().split("TestResultForWpfAction->")[-1]
print json.loads(base64.b64decode(result))

#控制台输出
#    {u'resp': {u'globals': {u'CURRENT_HANDLE': 0}, u'result': True, u'errmsg': u''}}

交互模式

  • 特点是,UI的自动化,跟用户可以交互,如下git
  • 在release_version中,下载 interaction_version 的最新版本

RPC远程调用模式, 进阶编程

  • 特点 是, ironpython环境下的,muiapy工程项目和封装的action,可以使用其他语言的编程,进行远程调用,达到MFC 或者 WPF 的windows窗口的UI自动化
  • 在release_version中,下载 interaction_version 的最新版本
  • ** 注意,执行脚本前,先双击打开uiwpfdriver.exe **
import base64,json,os,subprocess

request = {'req': {
                 'action': 'StartApplication', 
                 'args': (r'D:\auto\python\uiwpfdriver\test_app\npp.5.7.Installer.exe',), 
                 'kwargs': {}
                 }
        }
bstr = base64.b64encode(json.dumps(request))

ADDR = ("127.0.0.1", 5820)
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(ADDR)
# 注意 RockEND,是结束标志
End = base64.b64encode("RockEND")
# 发送调用请求
sock.sendall(bstr+End)
# 接受结果
result=sock.recv(8192)
print json.loads(base64.b64decode(result[:result.find(End)]))

#控制台输出
#    {u'resp': {u'globals': {u'CURRENT_HANDLE': 0}, u'result': True, u'errmsg': u''}}


约定的全局参数

只有三个: index、 timeout、identifications

参数名 描述 值或值类型
identifications 属性键值对 ClassName、ConTrolType、AutomationId、Name等,用于标识和寻找元素,默认为空值,使用UiSpy工具查看
timeout 超时时间 默认10秒
index 标识元素 数字

约定的请求数据格式

  • action -> UI执行的动作,参见后面的 API
  • args -> action的参数,依据API的顺序传递
  • kwargs -> 参见 全局参数
# 数据请求格式,
'{
	"req": {
		"action": "",
		"args": [],
		"kwargs": {
			
		}
	}
}'

示例,如下:

'{
	"req": {
		"action": "TypeInWin",
		"args": ["hello uiwpfdriver"],
		"kwargs": {
			"index": 0,
			"identifications": {
				"AutomationId": "1019"
			},
			"timeout": 10
		}
	}
}'

约定的响应数据的格式

  • globals -> 使用action中 SetVar设置的全局变量
  • result -> 执行action的操作结果
  • errmsg -> 错误信息
'{
	"resp": {
		"globals": {
			
		},
		"result": true,
		"errmsg": ""
	}
}'

操作(Actions API)

带有【窗口】标记的,要配合全局参数使用

Actions API 参数 返回值 描述
Check 点击复选框【窗口】
CheckOff 不勾选复选框【窗口】
CheckOn 勾选复选框【窗口】
ClickWin 点击【窗口】的按钮
CloseWin 关闭指定【窗口】
ExpandOff 关闭组合框【窗口】
ExpandOn 展开组合框【窗口】
GetTextDocumentAttribute attr 获取文本组件的指定
的attr属性值【窗口】
SwitchToWindow win_title_name 所有焦点切换到指定
window标题的【窗口】
SwitchToDefaultWindow 切换回默认【窗口】
ScrollTo Horizon=-1, 滚动滚动条至指定位
vertical=-1 置【窗口】取值0至100
SelectItem 展开组合框后或列表框
选择指定选项【窗口】
SetWinStat value->min/max/normal 设置窗口状态【窗口】
StartAppliaction app_path 打开指定应用
TimeSleep seconds 睡眠
TypeInWin value 输入【窗口】
SetVar name ,value 设置变量
IsContentElement True/False 是否容器类【窗口】
IsControlElement True/False 是否控制类【窗口】
IsEnabled True/False 是否可控【窗口】
IsExists True/False 是否存在【窗口】
IsKeyboardFocusable True/False 是否键盘焦点【窗口】
IsOffscreen True/False 是否超出屏幕【窗口】
IsPassword True/False 是否密码【窗口】
MouseDrag X1,Y1,X2,Y2 鼠标拖拽坐标1
至坐标2【窗口】
MouseDoubleClick X,Y 鼠标双击x,y或者
元素【窗口】
MouseClick X,Y 左键点击x,y
或者元素【窗口】
MousePressButton X,Y 鼠标按住元素【窗口】
如果指定了x,y坐标
那么按住x,y
MouseMove X,Y 光标移动至【窗口】
如果指定了x,y坐标
那么移动至x,y
MouseDragTo X,Y 拖拽至坐标【窗口】
AcceleratorKey string (模型不适用)获取该值
AccessKey string (模型不适用)获取该值
AutomationId string (模型不适用)获取该值
BoundingRectangle string (模型不适用)获取该值
ClassName string (模型不适用)获取该值
ClickablePoint string (模型不适用)获取该值
ControlType string (模型不适用)获取该值
Culture string (模型不适用)获取该值
HasKeyboardFocus string (模型不适用)获取该值
HelpText string (模型不适用)获取该值
LabeledBy string (模型不适用)获取该值
LocalizedControlType string (模型不适用)获取该值
Name string (模型不适用)获取该值
ProcessId string (模型不适用)获取该值
RuntimeId string (模型不适用)获取该值

muia底层封装实现

Microsoft WPF UiAutomation的封装,参见: muiapy项目