Makima - 基于Python实现的跨平台PC端应用自动化测试框架

Python
Mac/Winodows
hank.huang · 2022年10月31日 · 8459 次阅读 · 5 条评论

背景

Makima 是一个基于 Accessibility Api 实现的跨平台 (Mac/Windows)桌面端自动化测试框架,借助开源框架 Ctype(Win)/pyobjc(Mac) 实现了对系统底层 Api 的访问。

安装

pip install makima==0.1.9

元素定位工具

对于 Mac

Accessibility Inspector:Xcode -> 打开 Developer Tools

使用 “Accessibility Inspector” 可以查找到 App 对应的元素属性

对于 Windows

下载 inspect.exe

使用 “inspect.exe” 可以查找到 App 对应的元素属性

使用

启动应用程序并通过窗口名称获取到 UI 对象

对于 Mac: Caculator = initialize_app_ref_for_mac("Caculator")

对于 Windows: Caculator = initialize_app_ref_for_win("Caculator")

App 窗口本身就是一个 UIElementRef 对象,而每个元素也都是一个 UIElementRef 对象。你可以通过 UIElementRef 来调用各种查找或者是点击的方法

鼠标事件:

UIElementRef 对象支持单击、双击、长按

例如: Caculator.find_element_by_wait(acc_name = "Input phone number",0).click() or Caculator.find_element_by_wait(acc_name = "Input phone number",0).doubleClick()

输入事件:

UIElementRef 对象支持输入和清除

(目前输入是将文本写入剪贴板,然后执行 Ctrl C + Ctrl V,清除是 Ctrl + A 全选后,按 Delete... 没办法中文输入太难搞了,为了实现支持中文输入只能先这样搞,有更好的 idea 欢迎提出来)

例如: Caculator.find_element_by_wait(acc_name = "Input phone number",0).input_text("188888")Caculator.find_element_by_wait(acc_name = "Input phone number",0).clear()

查找元素

对于 Mac:

'''
支持的查找方式:
identifier = identifier
help = help
title = title
role_description = role description
role = role name
sub_role = Subrole
value = value

'''

Caculator.find_element_by_wait(self, timeout=5000, use_re=False, **query)

timeout 是一个可选参数,默认值为 5000,即 5 秒

use_re 是一个可选参数,默认值为 False,若传 True 则表示开启正则表达式匹配

e.g Caculator.find_element_by_wait(help=".*Start.*")

query 是一个必备参数,可以同时使用多个 query 来进行查找

e.g Caculator.find_element_by_wait(help="auto", role="AXRadioButton")

对于 Windows:

'''
支持的查找方式:
automation_id=automation id
acc_description = acc description
acc_name=acc name
acc_role_name=role name
acc_value=acc value
class_name=class name
control_type=control type
full_description=full description
'''

Caculator.find_element_by_wait(self, timeout=5000, use_re=False, **query)

timeout 是一个可选参数,默认值为 5000,即 5 秒

use_re 是一个可选参数,默认值为 False,若传 True 则表示开启正则表达式匹配
例如 Caculator.find_element_by_wait(acc_name=".Start.")

query 是一个必备参数,可以同时使用多个 query 来进行查找

例如 Caculator.find_element_by_wait(acc_name="auto", class_name="UIItemsView")

`

通用操作

支持鼠标事件、组合键盘事件:

对于 Windows:

模拟打开 Windows 界面进行搜索并按回车键启动程序
win_keyboard.send(win_keyboard.codes.LEFT_WIN)
win_keyboard.copy_text(app_name)
time.sleep(1)
win_keyboard.send(win_keyboard.codes.CONTROL.modify(win_keyboard.codes.KEY_V), delay=1)
time.sleep(1)
win_keyboard.send(win_keyboard.codes.RETURN)

对于 Mac:

模拟 ctrl c + ctrl v

combination_key_operation(KeyCodes.kVK_ANSI_V, Quartz.kCGEventFlagMaskCommand)

可以传入至多三个按键

评论列表
hank.huang 发表于 2023年05月11日

@aa17620915891 @pennycxl 不好意思啊,最近比较忙,问题已修复。这个 issue 主要是缘于某次更新的时候 不小心加了一个 kmeans_run() 的调用,在 kmeans_run 这个 py 文件内。目前已移除

不知名测试 发表于 2023年04月21日

E TypeError: kmeans_run() missing 1 required positional argument: 'path'
你这个问题解决了嘛

pennycxl 发表于 2023年03月09日

kmeans_run()
E TypeError: kmeans_run() missing 1 required positional argument: 'path'
这里路径怎么不存在的?

hank.huang 发表于 2023年02月20日
不知名测试 发表于 2023年01月31日

git 地址给一下老哥