部分接口已经过期,请参考最新的文档 https://testerhome.com/topics/9854
这天万里无云,PM 指数 50 以下,正式写文章的好日子。ATX 群里一直都有人说需要一篇 iOS 操作的接口列表,被我拖延到了现在,快过年了,坚决不能拖延到年后。
接口手册按照我以前的风格肯定是写到 Github 的 README 里面的,但是这样有个坏处,就是看不到浏览数,也没法评论,修改起来也不是很方便。最头疼的是贴图不方便。所以最终决定把接口手册放到 Testerhome 上,一来可以帮 testerhome 导入点流量,另外该要的功能也都有了。
为了方便快速书写,用到了一些简称。比如 ATX 代表 AutomatorX,WDA 代表 WebDriverAgent
环境搭建部分可以独立成章,但文章我不想主要介绍这个,所以都只是简单的提了下,通过提到的线索你依然可以搭建起来环境。
主要部分还是介绍接口,而且接口会根据 Github 上的代码变更随时更新。
ATX(AutomatorX 的简称)的安装不看文档也可以,反正也不难,两个命令就装好了
pip install --pre --upgrade atx
pip install opencv_python
为了方便调用 WDA,于是写了一个纯 Python 的 WDA 客户端facebook-wda,如果有些接口下面的文章没有提到,在该项目的 README,或者代码中或许可以发现一些彩蛋。
如果连接的是真机的话,还需要通过 iproxy 将手机监听的 8100 端口转发到本地来。
这里假设你启动的 WDA 的地址是http://localhost:8100
import atx
d = atx.connect("http://localhost:8100")
后面的接口都会默认你已经有d
这个变量了
需要知道应用的 bundleId,可以通过ideviceinstaller -l
查到。
d.start_app('com.apple.Health') # 启动默认的健康程序
d.stop_app()
屏幕大小,这里是实际显示的大小。截图是多大,返回的就是多大
dis = d.display
print dis.width, dis.height
截图
image = d.screenshot() # 返回PIL图片
image.save("screen.png") # 保存成文件,这个是PIL的基础用法。其他的什么旋转,抠图,还有很多
坐标点击
d.click(20, 30)
滑动
d.swipe(300, 400, 300, 100, 1.0) # 从(300, 400)滑动到 (300, 100) 时间1.0s (默认0.2s)
其他
d.home() # 点击Home键
浏览器打开 WDA 的 inspector 窗口
右上角的用户图标,我们可以根据 Class,Name,Label 来定位
# 根据所有属性定位
elem = d(class_name="Button", name="profile", label="profile")
# 使用下标定位,界面上的第2个Button(下标是从0开始的)
elem = d(class_name="Button", index=1)
elem = d(class_name="Button")[1] # 跟上面的命令等价
xpath 有很多的规则,我用的很少,欢迎高手留言补充。这种操作比较慢,但是功能强大
elem = d(xpath="//Button")
elem.exists # 判断控件是否存在
len(elem) # 返回符合条件元素的个数
elem.click() # 等待并点击
elem.click(timeout=5.0) # 5s之内还有出现符合条件的元素,直接跑异常。timeout目前默认都是90s
elem.wait(timeout=5) # 等待目标的出现
elem.tap_hold(2) # 长按2s
# elem.swipe('up') # 这个接口目前没有了,有待更新
elem.bounds # 返回namedtuple,这个坐标体系还需要乘以 d.scale 才能转化成ATX的坐标体系。
# Returns
# Rect(x=279, y=29, width=25, height=25)
# 获取元素的属性
elem.class_name
elem.text # 这个跟inspector中的Name一个意思
elem.value
elem.enabled # 是否启用
elem.displayed # 这个还真的很少用
刚才的应用进入到用户界面,点击 Edit,会进入到这个界面,正好可以演示下怎么输入这个功能
用 inspector 可以看到元素的结构是这个样子的
为了确保不被所谓的联想字符,自动修正所干扰,打开输入法设置界面,将所谓的联想输入都关闭掉。
是否支持中文呢?刚试了下,竟然支持(自己都觉得惊讶)
为了找到输入框,不得不用复杂的 xpath 了,xpath 的使用我参考了这篇文章http://www.cnblogs.com/songshu120/p/5182043.html
elem = d(xpath="//Cell[@label='First Name']/TextField")
elem.set_text("James") # 设置文本
elem.value # 获取刚刚输入的文本
elem.clear_text() # 清空刚刚输入的文本
除了这种方法还有另外一种方法
elem.click() # 使输入框处于激活状态
d.type("James")
d.type("\b\b") # 删除两个字符
s(text="Vitals").scroll() # scroll to visible
s(text="Login").scroll().click() # 滑到到该元素,然后点击
s(text="Hello").scroll(direction="right", timeout=5.0) # 指定滑动的方向向右,方向有4个up | down | left | right
# 有点尴尬了,我也不记得下面两个是干什么用的了
s(text="Hello").scroll(text="World")
s(text="Hello").scroll(text_contains="World")
目前封装的一般般,但也可以酬和着用
d.session.alert.text # 当前弹出框的文本
d.session.alert.accept() # 点击弹出框的确认
d.session.alert.dismiss() # 点击弹出框的取消
真是多呀,写了这么久。不幸的是还是没有写完。ATX 还有图像识别这一块,篇幅差不多也可以写跟这篇一样多了。先写这么多吧,累死我了,打游戏去了。