• 使用Python开发IOS程序

    2019-06-17 18:13:56
    2019独角兽企业重金招聘Python工程师标准>>> ...

    对,你没有看错,就是使用Python开发iOS程序!

    我们见过使用JS、Lua、Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个,我后面会解释。

    那么,怎么用Python开发iOS程序呢?其实我们最主要解决的就是下面几件事情:

    1. 在iOS App中安装Python解释器。

    2. 搭建Python和objc通信的桥梁。

    3. 如何配置工程并开发。

    如果不使用UIKit这些,那么就要使用OpenGL ES这些了,这种方式,主要是用于开发游戏的,我们这里不涉及这些。

    当然,以下所有内容都是在一台已经安装了Xcode的Mac上进行的。

    在iOS App中安装Python解释器

    Python-iOS-support

    pybee开源了一个可以嵌入到iOS工程中的Python编译脚本,具体位置在这:

    https://github.com/pybee/Python-iOS-supp...

    默认是使用Python 3.4.2,编译x86_64、i386、ARMv7、ARMv7s、ARM64共5个版本,然后打成一个臃肿包,可选framework或者.a。

    如果真的要用于生产环境的话,只要把Makefile中的

    TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.i386 iphoneos.armv7 iphoneos.armv7s iphoneos.arm64

    修改为:

    TARGETS-iOS=iphoneos.armv7 iphoneos.arm64

    我们只需要支持ARMv7和ARM64即可,ARMv7s可以兼容ARMv7,所以可以让包小一些。

    作者提供的已经编译好的包里面,主要有两种版本:

    • Python 3.4.x

    • Python 3.5.x

    按照作者的说法,Python版本是可以更换的,但是我尝试过,我将最新版本的Python 2.7.11放进去,是无法编译成功的。

    有一些人提到了这个,但是作者还是建议使用3.4.x或者3.5.x版本,2.7x版本他已经不再支持了。

    修改Python版本的地方在:

    PYTHON_VERSION=3.4.2

    替换为其他版本即可。

    编译

    切到Python-iOS-support目录,设置编译参数,直接编译。我们这只需要iOS版本,所以直接make iOS即可。

    编译成功之后,会在build目录上生成Python.frameworkOpenSSL.framework

    18203236_ntmw.jpg

    如果编译出,或者不想烦这个事情的,可以直接下载编译好的版本:

    https://github.com/pybee/Python-iOS-supp...

    搭建Python和objc通信的桥梁

    rubicon-objc是一个连接Python和objc的桥梁。

    首先,我们需要安装一下:

    pip install rubicon-objc

    那么,它有什么用呢,这就有意思了,我们来看一下它是这么写的。

    这块的内容,前提条件是你要懂点iOS。

    #!/usr/bin/python# -*- coding: utf-8 -*-from ctypes import cdllfrom ctypes import utilfrom rubicon.objc import ObjCClass, objc_method# 载入Foundation框架cdll.LoadLibrary(util.find_library('Foundation'))# 获取NSArray类NSArray = ObjCClass("NSArray")# 等同于 # NSArray *myArray = [NSArray arrayWithObjects:@"ok", @"ok1", @"ok2", nil]myArray = NSArray.arrayWithObjects_("ok", "ok1", "ok2", None)print myArray.countprint myArray.indexOfObject_("ok2")

    输出结果是:

    18203236_rZd6.jpg

    是不是很好玩!

    调用objc的方式和以前objc直接的写法很像,只是有一些需要改变,比如:

    • 方法名不使用:,而是使用_

    • 多参数需要使用Python的方式,比如objc里面的方法是:

    /**objc:**/- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
    /**Python**/array. writeToURL_atomically_(url, atomically)
    • 不能使用nil,Python里面使用None代替。

    • 等等。

    具体用法大家可以自行探究一下。

    如何配置工程并开发

    创建工程

    Python所需要的工程和直接用Xcode创建的不太一样,手动改写的话,还比较麻烦,所以我们直接用模板工具生成。

    cookiecutter是一个可以在模板中快速创建工程的一个工具,Python-iOS-templatepybee开源的一个使用Python开发iOS工程的模板。

    首先,我们需要安装cookiecutter,直接使用pip安装即可:

    pip install cookiecutter

    安装好后,直接使用cookiecutter命令创建工程:

    cookiecutter https://github.com/pybee/Python-iOS-template

    18203236_iRUx.jpg

    建好的工程目录结构如下:

    18203237_UyzS.jpg

    app目录是放置我们创建的python文件的地方。
    app_packages目录是放三方包的地方,等同于我们在电脑端的site_packages文件夹。

    工程里面可以同时存在objc文件和python文件,两者可以各自运行,并不冲突。

    完善工程

    Talk is cheap, show me the code.

    不得不承认,rubicon-objc几乎没有文档。

    我在github上找到一个项目,iOS-Python-Project。这是使用rubicon-objc开发的一个Python-iOS工程,但是很可惜的是,我这边运行出错。

    我借鉴了iOS-Python-Project,修改了一个可以运行的工程,有兴趣的可以去下载一下。

    https://github.com/Forkong/python-iOS

    工程里面并没有集成Python.frameworkOpenSSL.framework,因为这两个framework太大了,clone下来的时间会很长,所以不如直接在Github上下载编译好的framework,地址在这边:

    https://github.com/pybee/Python-iOS-supp...

    下好了之后,framework一般放置于根目录下面,相对于我这个demo,那么放置的目录就是python-iOS/,和apptest.xcodeproj同级。

    这个demo运行起来大概是这个样子:

    18203237_HkTV.jpg

    demo中只修改了rootViewController的背景,然后在上面添加了一个label。

    当然,它还能做很多事情,怎么做,我也不知道。

    它的文档太少了,我甚至不知道怎么才能使用CGRect,因为它不是一个类,我无法import进来。

    总结

    开头我提到为什么很少有人会使用Python去开发iOS程序(软件),我个人认为主要有以下几个原因:

    1. IDE的支持 - 如果你已经在我的demo上写了几行,你会发现,没有任何objc库的提示。本来我们objc这门语言就是写法很长很详细的,要想直接手写出整个方法名,那真是X了?了。

    2. 系统库 - 一般来说,iOS程序一般至少都要有几个页面的,那么UIKit基本就是我们必须的,除非你想使用OpenGL ES画,或者直接HTML等。而要用到UIKit,肯定要写一堆是Python但是完全像objc的代码,因为那方法名就是这么定义的。这样写太累了,不如直接用objc写。

    3. Python解释器过大 - 我生成的只有ARMv7和ARM64的Python.framework就已经有20M+了,再加上好几M的OpenSSL.framework,这得多大。即使打到生产包里面,我相信估计也有10M~20M了,相比较而言,lua的解释器就只有200k。

    4. 技术支持 - 连我们上面说到的rubicon都没有文档,万一出事了,找谁解决?社区上也没几个人这么干,提问的话,又有几个人可以帮助你。Ruby可以用RubyMotion来开发iOS,但是它还是有一些人用的。

    在文章最后,我只想说:

    虽然Python不适合开发iOS程序,但是,很好玩啊。

    这就够了。

    我们给App做hotfix的时候,如果不算HTML方案的话,主要有两种,一种是lua的wax,还有一种是js的JSPatch。

    lua写patch的时候也具有上面的1、2两个缺点,但是补丁这种东西本来就很短,稍微写点也无妨。

    或许,你可以试试使用Python给你的App做hotfix。


    转载于:https://my.oschina.net/ShangGuanchen/blog/661956

    展开全文
  • IOS开发消息推送 APNS python 源码, 纯自己实现协议, 无需安装额外库 代码简洁, 用户可以自己随意修改使用, 无需安装其他库, 直接发消息, 指定自己的证书即可. 找了很多代码,都不好使, 自己写的
  • 使用Python开发iOS程序

    2019-04-20 11:17:45
    对,你没有看错,就是使用Python开发iOS...我们见过使用JS、Lua、Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回答。 那么,怎么用Python开发iOS程...
        

    博文地址:http://ifujun.com/shi-yong-pythonkai-fa-...

    对,你没有看错,就是使用Python开发iOS程序!

    我们见过使用JS、Lua、Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回答。

    那么,怎么用Python开发iOS程序呢?其实我们最主要解决的就是下面几件事情:

    1. 在iOS App中安装Python解释器。

    2. 搭建Python和objc通信的桥梁。

    3. 如何配置工程并开发。

    如果不使用UIKit这些,那么就要使用OpenGL ES这些了,这种方式,主要是用于开发游戏的,我们这里不涉及这些。

    当然,以下所有内容都是在一台已经安装了Xcode的Mac上进行的。

    在iOS App中安装Python解释器

    Python-iOS-support

    pybee开源了一个可以嵌入到iOS工程中的Python编译脚本,具体位置在这:

    https://github.com/pybee/Python-iOS-supp...

    默认是使用Python 3.4.2,编译x86_64、i386、ARMv7、ARMv7s、ARM64共5个版本,然后打成一个臃肿包,可选framework或者.a。

    如果真的要用于生产环境的话,只要把Makefile中的

    TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.i386 iphoneos.armv7 iphoneos.armv7s iphoneos.arm64
    

    修改为:

    TARGETS-iOS=iphoneos.armv7 iphoneos.arm64
    

    我们只需要支持ARMv7和ARM64即可,ARMv7s可以兼容ARMv7,所以可以让包小一些。

    作者提供的已经编译好的包里面,主要有两种版本:

    • Python 3.4.x

    • Python 3.5.x

    按照作者的说法,Python版本是可以更换的,但是我尝试过,我将最新版本的Python 2.7.11放进去,是无法编译成功的。

    有一些人提到了这个问题,但是作者还是建议使用3.4.x或者3.5.x版本,2.7x版本他已经不再支持了。

    修改Python版本的地方在:

    PYTHON_VERSION=3.4.2
    

    替换为其他版本即可。

    编译

    切到Python-iOS-support目录,设置编译参数,直接编译。我们这只需要iOS版本,所以直接make iOS即可。

    编译成功之后,会在build目录上生成Python.frameworkOpenSSL.framework

    如果编译出问题,或者不想烦这个事情的,可以直接下载编译好的版本:

    https://github.com/pybee/Python-iOS-supp...

    搭建Python和objc通信的桥梁

    rubicon-objc是一个连接Python和objc的桥梁。

    首先,我们需要安装一下:

    pip install rubicon-objc
    

    那么,它有什么用呢,这就有意思了,我们来看一下它是这么写的。

    这块的内容,前提条件是你要懂点iOS。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    from ctypes import cdll
    from ctypes import util
    from rubicon.objc import ObjCClass, objc_method
    # 载入Foundation框架
    cdll.LoadLibrary(util.find_library('Foundation'))
    # 获取NSArray类
    NSArray = ObjCClass("NSArray")
    # 等同于 
    # NSArray *myArray = [NSArray arrayWithObjects:@"ok", @"ok1", @"ok2", nil]
    myArray = NSArray.arrayWithObjects_("ok", "ok1", "ok2", None)
    
    print myArray.count
    print myArray.indexOfObject_("ok2")
    

    输出结果是:

    是不是很好玩!

    调用objc的方式和以前objc直接的写法很像,只是有一些需要改变,比如:

    • 方法名不使用:,而是使用_

    • 多参数需要使用Python的方式,比如objc里面的方法是:

    /**objc:**
    /- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
    /**Python**
    /array. writeToURL_atomically_(url, atomically)    
    
    • 不能使用nil,Python里面使用None代替。

    • 等等。

    具体用法大家可以自行探究一下。

    如何配置工程并开发

    创建工程

    Python所需要的工程和直接用Xcode创建的不太一样,手动改写的话,还比较麻烦,所以我们直接用模板工具生成。

    cookiecutter是一个可以在模板中快速创建工程的一个工具,Python-iOS-templatepybee开源的一个使用Python开发iOS工程的模板。

    首先,我们需要安装cookiecutter,直接使用pip安装即可:

    pip install cookiecutter
    

    安装好后,直接使用cookiecutter命令创建工程:

    cookiecutter https://github.com/pybee/Python-iOS-template
    

    建好的工程目录结构如下:

    app目录是放置我们创建的python文件的地方。
    app_packages目录是放三方包的地方,等同于我们在电脑端的site_packages文件夹。

    工程里面可以同时存在objc文件和python文件,两者可以各自运行,并不冲突。

    完善工程

    Talk is cheap, show me the code.

    不得不承认,rubicon-objc几乎没有文档。

    我在github上找到一个项目,iOS-Python-Project。这是使用rubicon-objc开发的一个Python-iOS工程,但是很可惜的是,我这边运行出错。

    我借鉴了iOS-Python-Project,修改了一个可以运行的工程,有兴趣的可以去下载一下。

    https://github.com/Forkong/python-iOS

    工程里面并没有集成Python.frameworkOpenSSL.framework,因为这两个framework太大了,clone下来的时间会很长,所以不如直接在Github上下载编译好的framework,地址在这边:

    https://github.com/pybee/Python-iOS-supp...

    下好了之后,framework一般放置于根目录下面,相对于我这个demo,那么放置的目录就是python-iOS/,和apptest.xcodeproj同级。

    这个demo运行起来大概是这个样子:

    demo中只修改了rootViewController的背景,然后在上面添加了一个label。

    当然,它还能做很多事情,怎么做,我也不知道。

    它的文档太少了,我甚至不知道怎么才能使用CGRect,因为它不是一个类,我无法import进来。

    总结

    开头我提到为什么很少有人会使用Python去开发iOS程序(软件),我个人认为主要有以下几个原因:

    1. IDE的支持 - 如果你已经在我的demo上写了几行,你会发现,没有任何objc库的提示。本来我们objc这门语言就是写法很长很详细的,要想直接手写出整个方法名,那真是X了?了。

    2. 系统库 - 一般来说,iOS程序一般至少都要有几个页面的,那么UIKit基本就是我们必须的,除非你想使用OpenGL ES画,或者直接HTML等。而要用到UIKit,肯定要写一堆是Python但是完全像objc的代码,因为那方法名就是这么定义的。这样写太累了,不如直接用objc写。

    3. Python解释器过大 - 我生成的只有ARMv7和ARM64的Python.framework就已经有20M+了,再加上好几M的OpenSSL.framework,这得多大。即使打到生产包里面,我相信估计也有10M~20M了,相比较而言,lua的解释器就只有200k。

    4. 技术支持 - 连我们上面说到的rubicon都没有文档,万一出事了,找谁解决?社区上也没几个人这么干,提问的话,又有几个人可以帮助你。Ruby可以用RubyMotion来开发iOS,但是它还是有一些人用的。

    在文章最后,我只想说:

    虽然Python不适合开发iOS程序,但是,很好玩啊。

    这就够了。

    我们给App做hotfix的时候,如果不算HTML方案的话,主要有两种,一种是lua的wax,还有一种是js的JSPatch。

    lua写patch的时候也具有上面的1、2两个缺点,但是补丁这种东西本来就很短,稍微写点也无妨。

    或许,你可以试试使用Python给你的App做hotfix。

    展开全文
  • iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗。 这个标题对我很有吸引力,曾经就有见到过在iOS平台上的python编译器(很多iOSpython的IDE,如Python3IDE),...

    在iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗。

    这个标题对我很有吸引力,曾经就有见到过在iOS平台上的python编译器(很多iOS上python的IDE,如Python3IDE),可以执行输入的python语和本地的python文件。

    当然我想要的不是像这篇文章说的用python编写一整个iOS程序,而只是在iOS应用中嵌入python文件执行非UI的逻辑,也就是说只需要在项目中嵌入一个python的编译环境。

    面对市场上这么多的iOS版python编译器,首先可以确定的是,针对iOS端的python编译库是存在的。我关心的问题是,能否支持python项目化的编译,能否导入丰富的三方库。那就动手一试咯


    小目标

    七牛的iOS平台SDK有这样一个特点,上传文件的时候需要生成token,但是生成token的逻辑在客户端的SDK中不存在,只能通过调用服务端的SDK才能获得。
    于是我们的小目标就诞生了:在iOS端上调用七牛python服务端SDK来生成token给客户端的七牛SDK使用。


    iOS的Python解释器

    针对iOS、MacOS平台,pybee开源了python支持库Python-Apple-support,这个是老版本的库Python-iOS-support.

    准备编译环境

    我这次使用的是老库中的Python3.4.2-b5版本,下载下来有两个framework,分别是OpenSSLPython。将这个两个framework拖入项目中,添加必要的lib库如图:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i677eEv4-1571197613226)(http://ojam5z7vg.bkt.clouddn.com/15359053297417.jpg)]

    在项目中创建PythonEnvironment.bundlePython.framework中的Restources文件夹内容复制进去,在初始化Python环境之前将bundle中的文件复制到指定目录作为Home路径

    设置Home路径、初始化

    设置上面准备home路径,并初始化编译环境。

    const char * frameworkPath = [[NSString stringWithFormat:@"%@/Resources",[self p_pythonFrameworkPath]] UTF8String];
    wchar_t  *pythonHome = _Py_char2wchar(frameworkPath, NULL);
    Py_SetPythonHome(pythonHome);
    
    Py_Initialize();
    PyEval_InitThreads();
    
    //在释放的时候调用
    Py_Finalize();
    

    执行Python代码、文件

    编译环境设置好之后,使用PyRun_SimpleString(python_code)便可以简单执行Python代码

    PyRun_SimpleString("print('hello world')");
    

    便可以输出hello world

    执行Python文件
    NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"py"];
        
    FILE *mainFile = fopen([scriptPath UTF8String], "r");
       
    PyRun_SimpleFile(mainFile, (char *)[[scriptPath lastPathComponent] UTF8String]);
    

    上面是执行main bundle中的Python文件方式,这种方式暂时没有找到如何调用文件中的某各类具体方法和传参。

    另外一种方式可以做到上面描述的需求,将在下一节中说明


    准备七牛Python库

    下载好的七牛SDK文件源码解压,在Xcode中创建一个bundle加入项目中,bundle中放七牛SDK的核心文件,如图:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3gkKeCdO-1571197613227)(http://ojam5z7vg.bkt.clouddn.com/15359397140219.jpg)]

    在需要使用七牛SDK之前,将此bundle中的文件拷贝到Python运行环境的home目录下

    编写token生成Python文件

    查看七牛的文档了解到生成token需要用到auth.py这个文件中的Auth类, 我们需要想办法创建一个Auth实例并传入需要的参数,再将生成的token导出来。

    首先自己创建一个iostoken.py文件,Python的文件名和方法名需要小写,类名需要大写。在iostoken.py中创建TokenForiOS

    import json
    from qiniu import Auth
    
    class TokenForiOS(object):
        
        def create_token(jsonParams):
            print(str(jsonParams))
            values = json.loads(jsonParams)
            access_key = values.get('access_key')
            secret_key = values.get('secret_key')
            #要上传的空间
            bucket_name = values.get('bucket_name')
            #上传到七牛后保存的文件名
            file_name = values.get('file_name')
            #构建鉴权对象
            q = Auth(access_key, secret_key)
            #生成上传 Token,可以指定过期时间等
            token = q.upload_token(bucket_name, file_name, 3600)
            return token
    

    上面是我使用七牛SDK中的Auth生成token的代码,类名为TokenForiOS方法名为create_token,现在需要找到合适的地方调用。

    不过在想要使用TokenForiOS类之前,需要将其加入qiniu模块的初始化__init__.py中:

    from .iostoken import TokenForiOS
    

    接下来就可以愉快地调用了

    Python.framework中有一套宏可以导入Python模块,生成实例,传参调用方法,具体使用例子见下代码块

    
    PyObject *pModule = PyImport_ImportModule([@"qiniu.iostoken" UTF8String]);//导入模块
        
    PyObject *pyClass = PyObject_GetAttrString(pModule, [@"TokenForiOS" UTF8String]);//获取类
        
    PyObject *pyInstance = PyInstanceMethod_New(pyClass); //创建实例
        
    NSMutableDictionary *params = [NSMutableDictionary new];
    [params setObject:@"123" forKey:@"access_key"];
    [params setObject:@"456" forKey:@"secret_key"];
    [params setObject:@"jake" forKey:@"bucket_name"];
    [params setObject:@"pic" forKey:@"file_name"];
        
    NSError *error = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:&error];
    NSString *paramterJsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        
    PyObject *result = NULL;
    result = PyObject_CallMethod(pyInstance, [@"create_token" UTF8String], "(s)", [paramterJsonString UTF8String] );
    
    char * resultCString = NULL;
    PyArg_Parse(result, "s", &resultCString); //将python类型的返回值转换为c
        
    NSLog(@"%s", resultCString);
    

    至此,我的小目标就完成啦。后面还有很多事情可以做,比如跑个爬虫试试,毕竟还没有尝试过网络请求。当然也还有很多坑要踩。


    总结

    使用过程中有下面几点体会

    • Python-Apple-support库的缺少文档 其实就是Python的API库
    • 设置Home目录导入模块的过程中踩了很多坑
    • 编译器对Python语法提示并不支持,难以排查写错的地方
    • framework的体积是在过大,对项目总体积影响大

    PS:在查询过程中发现了PyObjc这个项目,能够使用python通过bridge调用OC的方法从而使用Cocoa框架,实现使用python编写Cocoa GUI应用。

    PyObjC is a bridge between Python and Objective-C. It allows Python scripts to use and extend existing Objective-C class libraries; most importantly the Cocoa libraries by Apple.

    This document describes how to use Objective-C class libraries from Python scripts and how to interpret the documentation of those libraries from the point of view of a Python programmer.


    Reference

    在iOS app中运行Python文件(Swift+Objective C+Python) 带Demo

    iOS 工程中调用Python方法(带Demo)

    Embedding Python in an iPhone app

    PyObjc


    遇到图片加载不出来,请移步博客查看

    demo一下子找不到了,如果需要请留言,人数多的话,我再写一个放上来,谅解~_~

    博客地址: 冷读空间

    展开全文
  • ===========分割线===========20180121更新,升级到了Appium Desktop 1.3.1,详细更新内容见本文末,建议...要么是Appium版本旧,要么是iOS版本旧。想找一篇详细的“从入门到放弃”的教程都没有,之前搭Android环境...

    ===========分割线===========

    20180121更新,升级到了Appium Desktop 1.3.1,详细更新内容见本文末,建议阅读本文前先看最近更新的内容。

    ===========分割线===========

    百度google了一轮,最大的感触是:好多教程都不适用啊!要么是Appium版本旧,要么是iOS版本旧。想找一篇详细的“从入门到放弃”的教程都没有,之前搭Android环境的时候,能搜到很多十分详实的教程,而iOS的就有点蛋疼了。
    然而,坑还是要入的,所以,就从搭环境开始吧。

    环境搭建

    1. Xcode

    必须承认,我是Mac OS新手,有Linux的基础,用了几天Mac OS,算是基本会用了……
    本文的系统版本为Mac OS 10.12.5,由于陪测的iOS用的是10.3.2,所以Xcode必须要装上新的8.3.2(不然没有SDK),Xcode在App Store里安装就好了。

    2. Appium

    Appium向来有命令行版的和GUI版的——我选择后者,到官网下载安装最新的Appium Desktop 1.0.2的dmg,里面带了1.6.4的Appium。

    3. Appium客户端库

    Python、Ruby、Java、Javascript、PHP、C#等,任君选择,去官网下载。
    例如我用Python,就安装Appium-Python-Client,在终端运行

    4. Homebrew

    Homebrew相当于Linux下的apt-get、yum,要用它来安装node,在终端运行

    5. node

    6. appium-doctor相关

    用来检测Appium相关环境有没有装好的工具:

    7. 还有一些库

    8. WebDriverAgent相关(大坑

    iOS 10+使用的是XCUITest,Appium使用的模块是appium-xcuitest-driver,其中引用了Facebook提供的WDA方案来驱动iOS的测试。
    装Appium Desktop的时候,它里面带了一个WebDriverAgent,但是这个自带的是有问题的!会造成不能使用Inspector,卡了很久!从Facebook那里自己clone一份才是王道:

    经过了baidu和google,用以上方法解决了不能Inspect的问题。

    在使用Appium时,需要把WDA装到真机上,然后又会遇到证书的问题,我也不是很明白,总之跟provisioning profile有关。

    用Xcode打开目录下的WebDriverAgent.xcodeproj,对于WebDriverAgentLib 和 WebDriverAgentRunner,勾选“Automatically manage signing”,把Team改成公司的,Bundle Identifier改成公司的证书可以接受的名字,具体可以参考官方文档操作,不懂的找开发同学协助。


    然后就可以把WebDriverAgentLib和WebDriverAgentRunner都编译到真机运行一下了。正常来说,会在桌面生成一个没图标的WebDriverAgentRunner,点开之后不会有什么反应,这就对了。

    写测试脚本

    1. Appium server capabilities

    要让App跑起来,还需要了解Appium server capabilities,它告诉Appium服务器很多信息,例如开哪个App、手机的系统/版本、在哪台设备上跑(真机还是模拟器等)等。

    给出我用到的一些参数(in Python),其他capabilities请参考官方文档

    如果能跑起来,就是正常的,不然看一下报什么错。

    2. Inspector

    能跑起来只是第一步,更重要的是如何定位元素。

    Inspector的使用方法很简单,之前运行driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub’, desired_caps)之后,连接就已经建立好了,只需在浏览器进入http://localhost:8100/inspector即可,之后就可以使用熟悉的driver.find_element_by_xxx方法来定位元素啦。

    后记

    Selenium的坑

    后来又遇到了一点坑,例如使用send_keys方法时,报

    Message: Parameters were incorrect. We wanted {“required”:[“value”]} and you sent [“text”,”sessionId”,”id”,”value”]

    错误,google了一下发现是selenium新版导致的问题,降级后解决:

    手势操作

    由于XCUI的原因,之前的一些手势操作如swipe、pinch、TouchAction等都不能用了,可以参考这篇官方文档,使用driver.execute_script方法代替。如

    对于直接用坐标的,还要注意逻辑分辨率的问题,如iPhone 7 Plus的逻辑分辨率是414×736。

    结语

    刚接触iOS的Appium,之后肯定还会遇到问题,会继续更新本文。

    更新:最近更新到了Appium Desktop 1.1,里面带了1.6.5的Appium,使用起来暂时未发现明显区别。

    20180121更新

    最近更新了Mac OS到10.13.2,XCode到9.2,Appium Desktop到1.3.1。上文的一些步骤可以简化了。

    例如,WebDriverAgent用自带的没有问题,不需要重新clone一个。在打开WebDriverAgent.xcodeproj,成功编译运行到真机后,就可以在Appium Desktop中使用“Start Inspector Session”,填入capabilities,即可新建一个session进行inspect;或者选“Attach to Session”复用正在运行的session来inspect。如图:



    试了一下,内置的Inspector可以支持iOS和Android的App,比以前的版本好用多了。

     

    最后附上一些参考:
    1. http://www.cocoachina.com/ios/20170112/18518.html
    2. http://blog.sina.com.cn/s/blog_b5a76ebd0102wuce.html
    3. https://github.com/appium/appium/blob/master/docs/en/appium-setup/real-devices-ios.md
    4. http://blog.csdn.net/achang21/article/details/70877583
    5. https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
    6. https://github.com/appium/python-client
    7. https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/appium-bindings.md
    8. https://github.com/facebook/WebDriverAgent/issues/537
    9. https://github.com/facebook/WebDriverAgent/wiki/Using-the-Inspector

       若有权益问题联系即刻删改!!!
    展开全文
  • python ios

    2020-04-24 23:33:08
    python for ipad iphone ipod
  • Python iOS 自动打包脚本(包含上传到fir)
  • Python实现iOS自动化打包
  • Appium+Python+IOS之入门

    2019-02-13 21:28:12
    准备一个简单的APP在IOS上 编写Python脚本 启动Appium和Python脚本开始自动化测试 1. 环境搭建 详见:https://testerhome.com/topics/8375 2. 准备一个简单的APP在IOS上:...

    总体流程

    • 环境搭建

    • 准备一个简单的APP在IOS上

    • 编写Python脚本

    • 启动Appium和Python脚本开始自动化测试

    1. 环境搭建 详见:https://testerhome.com/topics/8375

    2. 准备一个简单的APP在IOS上:https://jingyan.baidu.com/article/a17d5285c9afc48099c8f279.html

        其中,过程中会产生bundle identifier

    3. 编写Python脚本(PyCharm):

    appium启动配置,参见:https://blog.csdn.net/bibi1003/article/details/85066887

    获得app元素的属性:启动appium,配置好参数,点击start inspector session-> 会出现左侧是app页面,中间和右边是对应属性栏,可获得如xpath,name等的属性值,可直接通过这些值find elements

    然后使用Python的unitest框架提供的TestSuite类及其中方法编写test cases

    # coding=utf-8
    
    from appium import webdriver
    import time
    import unittest
    
    
    class Tests(unittest.TestCase):
        #启动app    
        def setUp(self):
            desired_caps = {}
            desired_caps['platformName'] = 'ios'  # 设备系统
            desired_caps['platformVersion'] = '12.0.1'  # 设备系统版本
            desired_caps['deviceName'] = 'iphone XR'  # 设备名称
            desired_caps['bundleId'] = 'Y.TestProduct'  # 测试app包名
            desired_caps['udid'] = 'B7416A87-6C4A-476E-BF03-4EAD8A272304'
            desired_caps['automationName'] = 'XCUITest'  # 测试appActivity
            self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    
        #定义多个test cases,比如查看页面元素
        def testCase1_findElements(self):
            driver = self.driver
            textWorld = driver.find_element_by_xpath('//XCUIElementTypeStaticText[@name="world"]').text
            textaaa = driver.find_element_by_xpath('//XCUIElementTypeApplication[@name="TestProduct"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeTextField')
            time.sleep(2)
            assert textWorld=="world", print('no word of world')
        
        #比如点击按钮,页面会有元素改变
        def testCase2_ButtonChange(self):
            driver = self.driver
    
            # Click the button to change the content of the label and the text
            button = driver.find_element_by_xpath('//XCUIElementTypeButton[@name="Button"]')
            button.click()
            time.sleep(2)
            textWorld = driver.find_element_by_xpath('//XCUIElementTypeStaticText[@name="world"]').text
            textaaa = driver.find_element_by_xpath('//XCUIElementTypeApplication[@name="TestProduct"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeTextField')
    
            # 添加断言,若label和text没有被改变或正确地被改变,则打印错误信息try:
            assert  textWorld == 'changed label', print('The label has not been changed by button')
    
        def tearDown(self):
            self.driver.quit()
    
    
    if __name__ == '__main__':
        suite = unittest.TestSuite()
        suite.addTest(Tests('testCase1_findElements'))
        suite.addTest(Tests('testCase2_ButtonChange'))
        unittest.TextTestRunner(verbosity=2).run(suite) 
        #一种简单打印测试报告的方式,执行数,成功数,失败数

    4. 启动Appoium和Python脚本开始自动化测试

    启动安装的app Appium->运行python脚本,simulator模拟器会被启动,会有测试结果在PyCharm中输出。

    展开全文
  • pythonios自动化测试项目 地址https://github.com/openatx/facebook-wda 和UIAutomator2同一个作者代码差不多 目前支持版本比较多。
  • iOS-Python-Project-用 Python 开发 iOS 应用的实例
  • 导言:前面写了Appium环境的搭建,想必木有太大的问题,现在整理下如何编写Python + appium + iOS自动化脚本 121.官方文档必须得看熟悉了,不懂的可以看官方文档,或者加入阳台测试群进行咨询Python Appium官网文档...
  • #encode:utf-8 import APNSWrapper import binascii deviceToken = binascii.unhexlify('2cd40912550d672f9489056c200a23e4bd298ef665807760c51d66bfce9f2d7d') # create wrapper wrapper = APNSWrapper.APNSNoti
  • 本文一个运行于iphone的python解释器的例子,版本为python2.7,由于主要是为了说明如何初始化python解释器,运行python脚本,例子中的界面比较简单,一个输入栏用于输入python脚,一个输出栏用于显示运行的结果。...
  • 点击上方“iOS开发”,选择“置顶公众号”关键时刻,第一时间送达!可能是最简单的iOS自动化打包方式:无需手动配置证书,无需填写配置文件名称,更无需配置Bundle Id...
  • 用来测试iOSpython 服务器的代码 双方收发 图片 文字 数字 类型这几种常用的也基本够用了。   1. 发送数据到服务器 UIImage *image = [UIImage imageNamed: @"/tmp/000.png"]; NSData *...
  • #coding=utf8 import csv import os import sys ''' Author:ewang Data:2017/07/18 该模块的主要功能函数: 读取csv中的数据到内存中 readDataToList():把csv中的数据,数据项以字典类型存储在列表中。...
  • 在用python做脚本的时候,需要操作到iOS打包出来的ipa文件的plist文件。 解决方案 第三方库:plistlib 插件 1、先写入本地再读取 # 读写文件 fp = open("1.plist", 'w') # 直接写入字符串 fp....
  • python能开发ios与安卓吗? python能开发ios与安卓,用Python写安卓APP肯定不是最好的选择,但是肯定是一个很偷懒的选择 我们使用kivy开发安卓APP,Kivy是一套专门用...
  • 最近开始学习移动端UI自动化,由于项目人员有限,尽可能采用通用的框架,调研发现目前同时支持Android/iOS的有2种较优选择,分别是Appium和Macaca,实践过程中发现Macaca对iOS支持比Appium友好些(主要是Appium上对...
1 2 3 4 5 ... 20
收藏数 67,701
精华内容 27,080
热门标签