使用Python写iOS自动化测试

用Python实现控制手机,并获取手机的游戏截图,然后根据你的屏幕尺寸来计算你的按压屏幕时间,再通过模拟用户点击实现自动玩转《跳一跳》小游戏,轻松得到高分。

使用Python写iOS自动化测试

写在之前

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脚本了,推荐工具(纯粹个人喜好,大神用记事本也能写)
QQ20180124-145935

新建一个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左右(请耐心等待...)

2018-01-24-17_05_33

自动删除短信

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)