我们公司有台测试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