我们公司有台测试 mac 笔记本,需要长时间登录 qq.但是由于一些异常问题,导致这个 qq 经常掉线.所以想写一个小脚本来定时自动化登录 qq.
最开始的想法是使用 appium,但是看了官方文档,也没找到可入手的 demo.
某天无意中看了一篇爱奇艺 mac 应用自动化帖子 (原帖地址找不到了),提到了 ATOMac 框架,打算尝试使用下.
ATOMacc 是一个支持在 mac 上做自动化的 python 库,GitHub 地址如下:
https://github.com/pyatom/pyatom
从介绍上来看是一个 python 类库,可以操作 mac os 系统
Python3
pip3 install git+https://github.com/pyatom/pyatom/
因为在 mac 系统上操作每一个应用,都需要 bundle id,类似 iOS 自动化的 bundle id.
需要如下几步,查找某个应用的 bundle id,以 QQ 应用为例
在 “安全性与隐私” 中辅助功能勾选 “iterm 和 pycharm”
bundle_id = 'com.tencent.qq'
atomac.launchAppByBundleId(bundle_id)
ato = atomac.getAppRefByBundleId(bundle_id)
print(ato)
需要安装 xcode 工具,并且打开 “Accessibility Inspector”
选择 mac 上的进程 “qq”
选择 “Inspector” 按钮查询元素
ATOMac 库使用的元素属性均在其属性名(通过 Accessibility Inspector 查到)前面加 AX,且首字母大写,如下所示
ATOMac | Accessibility Inspector |
---|---|
AXRole | Role |
AXPosition | Position |
AXRoleDescription | Type |
AXValue | Value |
window = automator.windows()[0]
#findFirstR,递归查找,返回第一个匹配的元素(当查找的元素Parent非标准窗口时使用)
dt = cur_win.findFirstR(AXRole='AXRadioButton', AXTitle='地图')
dt_position = dt.AXPosition
dt_size = dt.AXSize
dt.clickMouseButtonLeft(dt_position)
s1.sendKeys('7983')
s1.sendKeys([BACKSPACE])
s1.sendKeys([RETURN])
这一段脚本很简单,跟使用 atx 差不多.其实很多自动化框架的 api 方法都大同小异.
def qq_login():
atomac.launchAppByBundleId(bundle_id)
ato = atomac.getAppRefByBundleId(bundle_id)
sleep(5)
cur_win = ato.windows()[0]
dt_image = cur_win.findFirstR(AXRole='AXImage')
attr = dt_image.getAttributes()
dt_pwd = cur_win.findFirstR(AXRole='AXTextField',AXSubrole='AXSecureTextField')
dt_pwd.sendKeys(pwd)
dt_login = cur_win.findFirstR(AXRole='AXCheckBox')
dt_login.sendKeys([RETURN])
sleep(5)
print('login success!')
ATOMac 比较使用测试 mac 上的应用,比如跨平台的 electron 应用.
ATOMac 应该可以替代 appium 测试 mac 上的应用,appium 在测试 mac os 系统在官方文档中资料有限.
ATOMac 不需要启动服务,直接调用系统函数进行自动化,速度很快.
ATOMac 也适用于写一些自动化运维小工具,比如自动化签到、自动化启动应用.
官方文档
https://pypi.org/project/atomic/0.7.2/
ATOMac - 基于 Python 的 Mac 应用 Ui 自动化库
https://www.jianshu.com/p/a36cd892adc1