使用Python写iOS自动化测试
用Python实现控制手机,并获取手机的游戏截图,然后根据你的屏幕尺寸来计算你的按压屏幕时间,再通过模拟用户点击实现自动玩转《跳一跳》小游戏,轻松得到高分。
写在之前
Xcode 7之前,苹果任然保留着automation
这个简单上手的自动化测试工具,自需要录制脚本即可,在Xocde 7之后,随着UnitTests加入Xcode之后,这个一个功能就被关闭了,因为UnitTests更强大。前段时间微信的新版本中加入了小程序游戏《跳一跳》,在朋友圈中大火之后,随之就出现了Android和iOS的《跳一跳辅助工具》,偶然了解了一下,发现是通过一个叫《WebDriverAgent》和《wda》的Python库来实现控制手机,并获取手机的游戏截图,然后根据你的屏幕尺寸来计算你的按压屏幕时间,再通过模拟用户点击实现自动玩转《跳一跳》小游戏,轻松得到高分。当然,我关注的点并不是通过这个工具能让自己在朋友圈排到第一名,而是前面提到的《WebDriverAgent》和《wda》。
《WebDriverAgent》和《wda》
WebDriverAgent
通过在手机上运行一个Test程序,实现用脚本控制手机,几乎能完成日常的所有操作。
wda
wda是一个基于WebDriverAgent的Python库,通过它,我们可以编写python脚本来实现控制手机自动的去做一些事情。
设备要求:iOS 9.3+
iOS真机如何安装WebDriverAgent
安装Python3
通过Python3 wda
$ pip3 install --pre facebook-wda
WebDriverAgent成功安装到设备上之后,在运行WebDriverAgent的Test时,会在Xcode的控制台有设备的ip地址输出
WebDriverAgentRunner-Runner[9045:786041] ServerURLHere->http://192.168.2.100:8100<-ServerURLHere
这个时候就可以来写python脚本了,推荐工具(纯粹个人喜好,大神用记事本也能写)
新建一个xxxx.py的文件,选择运行环境为之前安装的Python3(现行版本应该是3.6.4)
导入头文件
import time
import wda
通过wda获取全局的客户端对象
c = wda.Client()
声明main方法和打开app
def main():
# 打开测试APP
with c.session('需要启动App的Bundle identifier') as s:
# 此时的s就是当前打开app的回话对象,我们可以通过它来操作app的内容
# 具体的语法可以在wda的README.md里面找到,这里就不说了
...控制脚本内容
if __name__ == '__main__':
main()
贴上一些最近写的自动化测试脚本
登录
#是否登录判断(我这里就是已能否找到内容为‘跳过活动页面’的UI为判断)
if s(name = u'跳过活动页面').exists:
#该UI存在,没有登录
###登录操作
s(name=u'跳过活动页面').tap()
# 点击充值按钮,APP登录判断后自动进入登录页面
s(name=u'充值').tap()
# 进入登录页面,输入用户名
s(type='TextField').set_text('username'+'\n')
# 输入用户密码
s(type='SecureTextField').set_text('password'+'\n')
# 点击输入完成
s(name=u'完成').tap()
# 点击登录
s(name=u'登录').tap()
# 点击以后再设置手势密码
s(name=u'以后再设置~').tap()
# 点击公告弹窗我知道了
s(name=u'知道了').tap()
# 点击投资进入主页
s(name=u'投资').tap()
模拟充值
# 点击充值按钮
s(name=u'充值').tap()
# # 输入充值金额
s(type='TextField').set_text('100')
# # 点击充值金额输入完成
s(name=u'完成').tap()
# # 点击确认充值
s(name=u'确认充值').tap()
time.sleep(3);
# # 返回取消充值
s(name=u'返回').tap()
s(name=u'确定').tap()
# 返回
s.tap_hold(20, 40, 0.2)
模拟计算收益计算器
s(name=u'抵押标').tap()
s.tap_hold(100, 200, 0.2)
s(className = 'Button',index = 3,name='').tap()
# 输入不同金额,等待3秒,再清空输入框
s(type='TextField').set_text('100')
time.sleep(3)
s(type='TextField').set_text('\b\b\b')
s(type='TextField').set_text('500')
time.sleep(3)
s(type='TextField').set_text('\b\b\b')
s(type='TextField').set_text('1000')
time.sleep(3)
s(type='TextField').set_text('\b\b\b\b')
s(type='TextField').set_text('2000')
time.sleep(3)
s(type='TextField').set_text('\b\b\b\b')
s(type='TextField').set_text('5000')
time.sleep(3)
s(type='TextField').set_text('\b\b\b\b')
s(type='TextField').set_text('10000')
time.sleep(3)
s(type='TextField').set_text('\b\b\b\b\b')
s(type='TextField').set_text('100000')
time.sleep(3)
模拟投标
#进入标列表
s(name=u'抵押标').tap()
#选择一个标
s.tap_hold(100, 100, 0.2)
#点去投资按钮
s(name=u'去投资').tap()
#输入投资金额
s(type='TextField').set_text('100')
#收起键盘
s(name='完成').tap()
#点击投资按钮
s(className = 'Button',name=u'投资').tap()
#点击确认投资按钮
s.tap(s.window_size().width/2,s.window_size().height*0.69)
#等待投资结果(5秒)
time.sleep(5)
#判断是否已完成投标
if s(name = u'您已投标完成').exists:
print('投标成功!!!')
else:
print('投标失败!!!')
# s(name=u'完成').tap()
#s(className = 'DeformationButton',index = 0).tap()
s.tap(s.window_size().width/2,s.window_size().height*0.69)
# 返回
s.tap_hold(20, 40, 0.2)
# 返回
s.tap_hold(20, 40, 0.2)
动图比较大,3M左右(请耐心等待...)
自动删除短信
iOS无法一次性删除全部短信,垃圾短信太多删除太烦?python来解放双手.
import os
import shutil
import time
import wda
c = wda.Client();
with c.session('com.apple.MobileSMS') as s:
#循环删除
while (1>0):
#左滑
s.swipe(300,300,100,300,0.5)
#点击删除
s.tap_hold(c.session().window_size().width*3-20, 900, 0.2)