0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Appium +iOS自动化测试教程(实践、总结 、踩坑)

Testin云测 来源:Testin云测 2024-11-11 09:42 次阅读

一、前言

项目闲置下来了,终于抽空有时间搞自动化了,看了下网上的教程基本通篇都是android自动化的介绍 ,ios自动化方面的内容网上简介的少之可怜。由于本人对ios自动化也是第一次做,甚至对苹果电脑的使用都不太熟悉,花了大概一周时间粗略的看下ios开发知识,网上随手下载的来源于这两本《iOS开发从入门到精通.pdf》、《iOS开发指南:从零基础到App上架.pdf 》、至于Mac笔记本的学习完全是边使用边查询操作 ;本文完全秉着指导小白操作的流程带你一步一步搭建IOS自动化测试环境

二、iOS 自动化相关框架介绍

自动化测试类工具 随着移动互联网的兴起,APP 测试的越来越被重视!Android 系统因为自己的开源性,测试工具和测试方法比较广为流传,但是 iOS 系统的私密性,导致很多测试的执行都有点麻烦。

为了帮助大家更好的执行 iOS APP 的测试,以下为大家收集了非常全面的 iOS 测试工具,涵盖各大领域,希望各位能有所认识

三、自动化测试类工具

1. UIAutomation

UIAutomation 是苹果提供的UI 自动化测试框架,使用 JavaScript 编写。

基于 UIAutomation 有扩展型的工具框架和驱动型的框架。扩展型框架以 JavaScript 扩展库方法提供了很多好用 js 工具,注入式的框架通常会提供一些 Lib 或者是 Framework,要求测试人员在待测应用的代码工程中导入这些内容,框架可以通过他们完成对 app 的驱动。

驱动型 UI Automation 在自动化测试底层使用了 UI Automation 库,通过 TCP 通信的方式驱动 UI Automation 来完成自动化测试,通过这种方式,编辑脚本的语言不再局限于 JavaScript。

这个工具在 iOS UI 自动化测试中使用非常广泛。

具体参考资料:https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UIAutomation.html

2.XCTest

XCTest 是苹果在 iOS 7 和 Xcode5 引入的一个简单而强大的测试框架,集成在 Xcode 中,用来编写测试代码。它提供了各个层次的测试。

XCTest 测试编写起来非常简单,并且遵循 xUnit 风格。

Xcode 在创建工程时,会默认使用 XCTest,并且默认创建了Unit Test(单元测试)和UI Test(界面测试)两个 Target,其中 Unit Test 主要用于测试代码的大部分基本功能,比如绝大多数 Model 的类和方法测试,业务逻辑测试,网络接口调用测试等等。

UI Test 一般会考虑到用户的交互流程,模拟用户的交互操作,利用 XCTest 的 UI 记录特性来获取界面上的一些列视图元素和操作事件,然后在测试方法中触发事件。

所以这是一个可以提供各个层次的测试的框架,比如单元测试,自动化测试,性能测试等。

具体参考资料:

https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/01-introduction.html

3. KIF

KIF 是 Keep It Functional 项目的缩写,是一款iOS app 功能性测试框架,来自 Square,该测试框架只支持 iOS。

所有测试使用 Objective-C 语言编写,对测试人员来讲,需要熟练的掌握 Objective-C 语言 , 对苹果开发者来说非常容易上手,更是一款开发者广为推荐的测试工具。

KIF 使用未公开的 Apple API(私有 API),这对于测试目的而言是安全的,基于第三方 iOS UI 的单元测试框架,所以可以做项目的单元测试,也可以做 UI 集成测试。但缺点是运行较慢。

具体参考资料:https://github.com/kif-framework/KIF

4. Frank

Frank 是 iOS 开发环境下一款实现自动测试的工具,Xcode 环境下开发完成后,通过 Frank 实现结构化的测试用例,其底层语言为 Ruby,作为一款开源的 iOS 测试工具,在国外已经有广泛的应用。

但是国内相关资料却比较少。其最大的优点是允许我们用熟悉的自然语言实现实际的操作逻辑。

它提供了针对 iOS 平台的功能测试能力,可以模拟用户的操作对应用程序进行黑盒测试,并且使用 Cucumber 编写测试用例,使测试用例如同自然语言一样描述功能需求,让测试以“可执行的文档”的形式成为业务客户与交付团队之间的桥梁。

优点:测试场景是在 Cucumber 的帮助下,用可理解的英语句子写的,还有活跃的社区支持,以及不断扩大中的库。

缺点:对手势的支持有限,所以在设备上运行测试有点难。

具体参考资料:https://www.testingwithfrank.com/

5. Calabash-iOS

Calabash 是一个适用于 iOS 和 Android 开发者的跨平台 app 测试框架,可用来测试屏幕截图、手势和实际功能代码。

Calabash 开源免费并支持 Cucumber 语言,Cucumber 能让你用自然的英语语言表述 app 的行为,实现 BDD(Behavior Driven Development,行为驱动开发)。

而 Calabash-iOS 就是一个基于 Calabash 的 iOS 的功能、自动化测试框架。

优点:

有大型社区支持;

列表项简单,类似英语表述的测试语句支持在屏幕上的所有动作,如滑动,缩放,旋转,敲击等。

缺点:

测试步骤失败后,将跳过所有的后续步骤,这可能会导致错过更严重的产品问题。

测试耗费时间,因为它总是默认先安装 app,需要 Calabash 框架安装在 iOS 的 ipa 文件中, 因此测试人员必须要有 iOS 的 app 源码。

除了 Ruby,对其他语言不友好

具体资料获取路径:https://github.com/calabash/calabash-ios

6. Subliminal

Subliminal 是另一款与 XCTest 集成的框架,也是个不错 iOS 集成测试框架。

与 KIF 不同的是,它基于 UIAutomation 编写,对开发者隐藏 UIAutomation 中一些复杂的细节。可惜近几年没有更新了,若能支持 swift 就好了。

具体资料获取路径:https://github.com/Diaoul/subliminal

7. Kiwi

Kiwi 是对 XCTest 的一个完整替代,使用 xSpec 风格编写测试。Kiwi 带有自己的一套工具集,包括 expectations、mocks、stubs,甚至还支持异步测试。

它是一个适用于 iOS 开发的 Behavior Driven Development(BDD)库,有着非常漂亮的语法。

优点在于其简洁的接口和可用性,易于设置和使用,可以写出结构性强易读测试,非常适合新手开发者。

Kiwi 也是使用 Objective-C 语言编写,易于 iOS 开发人员上手。

具体资料获取路径:https://github.com/kiwi-bdd/Kiwi8. Appium

Appium 是一个开源的、跨平台的自动化测试工具,支持 iOS、Android 和 FirefoxOS 平台。

通过 Appium,开发者无需重新编译 app 或者做任何调整,就可以测试移动应用,可以使测试代码访问后端 API 和数据库。

它是通过驱动苹果的 UIAutomation 框架来实现的 iOS 平台支持。

开发者可以使用 WebDriver 兼容的任何语言编写测试脚本,如 Ruby,C#,Java, JS,OC, PHP,Python,Perl 和 Clojure 语言。

具体资料获取路径:http://appium.io/

内测发布工具

1. fir.im

为开发者提供测试应用极速发布,应用崩溃实时分析、用户反馈收集等一系列开发测试效率工具服务,帮助开发者将更多精力放在产品的开发与应用的优化上。

2. 蒲公英

『蒲公英』是专为 iOS、Android 开发者提供的免费用应用内测、托管的平台,旨在解决开发者将应用分发给内测用户时的繁杂、低效的问题。

3. TestFlight

TestFlight 是苹果提供的应用测试工具,允许开发者邀请用户对应用的预发布版本进行测试,从而在应用正式发布至 App Store 前收集用户反馈。

以上常用框架介绍完了,本篇幅主要以appium进行实践讲解

Appium驱动IOS测试原理

XCUITest是苹果开发的一个做IOS自动化测试的框架,需要了解些Swift等iOS编程知识WebDriverAgent是Facebook开发的一个iOS自动化测试工具,先来看下面的这张原理图:

2beae13e-904d-11ef-a511-92fbcf53809c.png

WDA在Client创建了一个Server,在手机端安装了一个叫作WebDriverAgentRunner 的一个应用;这个应用会接收来自 Server 的指令,并连接底层的 XCTest.framwork,让 XCTest.framwork 调用苹果API来操作手机进行自动化

而appium是把WebDriverAgentRunner 给集成进去了,因此实现了appium的跨平台能力

2bf888ca-904d-11ef-a511-92fbcf53809c.png

通过上图我们了解到 Appium 很粗暴的把整个 WebDriverAgent 直接集成到自己的项目里,然后通信机制就走 WebDriverAgent,Appium 其实就提供了一个 Client 端的作用。所以 iOS 9.3 系统之后自动化测试核心是 WebDriverAgent,Appium 就提供了一个 Client 端来写脚本和发送指令。

Appium 自动化架构模式可以用一个抽象的架构表示,就是下面这样的:

2c130308-904d-11ef-a511-92fbcf53809c.png

从图中可以看出:

Client 端是 Appium 之前本身提供的;

Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整个集成进来,Instruments 是为了支持 iOS 9.3 之前的系统)

最右边是一个手机

之前 Server 是和 bootstrap.jar 通信,这里 WebDriverAgent 提供了 WebDriverAgentRunner (类似 bootstrap.jar 的功能),WebDriverAgent与之通信;

WebDriverAgentRunner 是一个应用,Client 和 server 运行了之后,WebDriverAgentRunner 会被装到手机上,这个应用会接收来自 Server 的指令,并连接底层的 XCTest.framwork,并告诉 XCTest.framwork 操作手机进行自动化。

关于 WebDriverAgent

FaceBook 出品:

实现了一个 server,通过 server 可以远程控制 iOS 设备:启动应用、关闭应用、点击、滚动等操作;

通过连接 XCTest.framework 调用苹果的 API 执行动作;

支持多个设备同时进行自动化;

Appium、Macaca 已经集成。

但是 WebDriverAgent 仅仅只提供了一个 server(和 inspect 进行元素定位),并没有像 Appium 一样提供 java 或 python 的 Client 端去写脚本,脚本执行的时候发送指令给 server,然后去运行。WebDriverAgent 要求你自己去实现 Client 端,即拿 Java/ Python 的 WebDriver 库进行封装,然后发送指令。所以 WebDriverAgent 其实就类似于 Appium server,就只是一个 server。

基础环境搭建

基础环境:一台苹果笔记本、一个iphone手机

基础环境

MacBook Pro: 10.15.7

Macbook Pro(做 iOS 测试,Mac 是绕不开的,我们依赖的软件环境需要运行在 Mac 上,必须要有一台 Mac 本(很贵),得攒银子咬牙买一台 ~,我用的公司分配的测试本)。

iphone真机:iPhone 8 Plus 14.4

iPhone、iPad:既然测试 iOS 软件,那 iPhone 和 iPad 也自然不用多说了,虽然 Xcode 里有虚拟机,但是实际测试还是以真机为准。本文也主要以真机为准

appium:1.20.2

appium原理

Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。Appium对IOS系统的支持得益于Dan Cuellar’s对于IOS自动化的研究。Appium也集成了Selendroid,来支持老android版本。

Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言,更可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架。如果只使用Apple的UIAutomation,我们只能用javascript来编写测试用例,而且只能用Instruction来运行测试用例。同样,如果只使用Google的UIAutomation,我们就只能用java来编写测试用例。Appium实现了真正的跨平台自动化测试。

appium选择了client-server的设计模式。只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的,这就是appium及webdriver如何做到支持多语言的;

Appium优点

开源

跨架构:Native App、Hybird App、Web App

跨设备:Android、iOS、Firefox OS

不依赖源码

使用任何 WebDriver 兼容的语言来编写测试用例。比如 Java, Objective-C, JavaScript with Node.js (in both callback and yield-based flavours), PHP, Python, Ruby, C#, Clojure, 或者 Perl.

不需要重新编译APP

支持IOS手机录制视频

Appium理念

你无需为了自动化,而重新编译或者修改你的应用。

你不必局限于某种语言或者框架来写和运行测试脚本。

一个移动自动化的框架不应该在接口上重复造轮子。(移动自动化的接口应该统一)

无论是精神上,还是名义上,都必须开源。

Appium 在 iOS 下工具的变革:

iOS 9 之前一直以 instruments 下的 UIAutomation为驱动底层技术(弊端由于 instruments 的限制,单台 mac 只能对应单台设备);

iOS 9.3 时代推出 XCUITest 工具,用以替代 UIAutomation;

iOS 10 时代苹果直接废弃了 UIAutomation、Facebook 推出 WebDriverAgent(实现的 server 能够支持单台 mac 对应多个设备);

Appium 在iOS 9.3 后全面采用 WebDriverAgent 的方案。

xcode: 12.4

MacBook appstore应用商店搜索下载即可

安装内容

前提环境:

python , selenium , setuptools、pip

通用环境:

Homebrew ,Node & NPM ,Carthage ,Appium ,python-client ,Appium-Doctor , ios-deploy , ideviceinstaller & libimobiledevice , ios_webkit_debug_proxy , authroize-ios

IOS环境:

xCode , Command Line Tools

前提环境

python

此处使用python3 , 官网下载https://www.python.org/ 一步下一步安装即可

selenium

终端输入: pip install Selenium 安装最新版本的selenium。pip install Selenium 如需安装指定的版本,则pip install Selenium==版本号。

setuptools、pip

下载setuptools

https://pypi.python.org/pypi/setuptools 、https://pypi.python.org/pypi/pip

打开cmd 进入setuptools解压目录,输入:python setup.py install

进入pip解压目录,输入:python setup.py install

安装好后,打开终端,输入pip,如提示不是内部命令,则将python安装目录下Scripts目录添加到环境变量Path中。

通用环境

Homebrew

Homebrew是一个包管理软件,它可以使我们更容易地安装其他一些软件

/usr/bin/ruby-e"$(curl–fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"

覆盖安装:

/usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"brew-v//检查homebrew是否安装 brewlist//查看已安装列表 brewupdate//更新Homebrew

如果安装失败:

可以打开网址:http://vip.ytesting.com/q.do?a&id=ff80808172521d8201726a74986f0880 将其内容保存为homebrew.txt,

然后终端输入:

/usr/bin/rubyhomebrew.txt

注意:此步骤还顺带安装了Xcode命令行工具(xcode-commaindline-tools)。

检查homebrew是否安装

终端输入安装:

Node & NPM

Node是一个javascript运行时环境,npm是节点包管理器。我们需要这些,因为Appium是一个节点应用程序。

node-v重新安装:brewreinstallnodenpmconfigsetregistryhttps://registry.npm.taobao.org/

默认的npm源再国内都很慢,安装好node之后需要重新配置一个国内源 (非必须)

在终端中,输入以下命令(此命令也将安装npm):

brewinstallnode

查看node版本

Carthage

Carthage项目依赖管理, 类似于 java 的 maven;主要是 WebDriverAgent 使用,WebDriverAgent 是用它做项目依赖的

brewinstallcarthage

更新carthage : rew upgrade carthage

重新安装 : brew reinstall carthage2. 安装完成后检查一下是否安装成功

carthageversion//打印出版本号即表示安装成功

终端输入:

Appium

Appium是一个用于本地、混合和移动web应用程序的开源测试自动化框架。它使用WebDriver协议驱动iOS、Android和Windows mobile应用程序。

安装 Appium(二选1) ;

两者基本没什么区别:非要说区别的话 ,方式1 安装版本较稳定 方式2则版本最新

方式1:安装桌面版 appium-server(推荐)桌面版包含了appium-server,同时也包含一个元素定位器,建议安装桌面版。

方式2:安装 appium-server 版

npminstall-gappium

默认安装最新的版本,如果想安装指定的版本:

npminstall-gappium@1.7.2

卸载 Appium:

npmuninstall-gappium npmcacheclean--forceappium-v

启动appium服务

appium& [1]965$[Appium]WelcometoAppiumv1.9.1 [Appium]AppiumRESThttpinterfacelistenerstartedon0.0.0.0:4723

安装完成之后输入appium -v,显示版本号表示appium server安装成功

终端安装server版输入

python-client

下载python-client

gitclonegit@github.com:appium/python-client.git

安装python-client

cdpython-client#进入python-client目录 pythonsetup.pyinstall#安装python-client

Appium-Doctor

2c26d6d0-904d-11ef-a511-92fbcf53809c.png

检查appium安装是否成功的工具集指令

npminstallappium-doctor-gappium-doctor--ios

备注:necessary dependcies 必须全部是对勾状态 ,可选部分依赖可以不用全部安装

检查 iOS环境是否安装成功

安装 appium-doctor

ios-deploy

ios-deploy 一个不需要用Xcode安装和调试应用的命令行工具。需要一个有效的开发者证书,需要 Xcode 7以上的版本。终端输入命令进行安装:

brewinstallios-deploy#安装命令 brewreinstallios-deploy#重新安装 brewupgradeios-deploy#更新命令

常用命令如下:

ios-deploy-c#查看当前链接的设备 ios-deploy--[xxx.app]#安装APP ios-deploy--id[udid]--uninstall_only--bundle_id[bundleId]#卸载应用 ios-deploy--id[udid]--list_bundle_id#查看所有应用 ios-deploy--id[udid]--exists--bundle_id#查看应用是否安装

ideviceinstaller & libimobiledevice

ios-deploy、ideviceinstaller 类似 android 的 adb;是 Appium 底层用到的工具之一,用于获取 iOS 设备信息

brewinstallideviceinstaller#用于查看bundleid brewreinstallideviceinstaller#重新安装brewinstalllibimobiledevice--HEAD#安装最新的更新 brewreinstalllibimobiledevice#重新安装

其常用命令如下:

idevice_id-l#显示当前所连接设备的udid instruments-sdevices#列出所有设备,包括真机、模拟器、macideviceinstaller-u[udid]-i[xxx.ipa]#xxx.ipa为应用在本地的路径ideviceinstaller-u[udid]-U[bundleId]ideviceinstaller-u[udid]-l#查看设备安装的第三方应用 ideviceinstaller-u[udid]-l-olist_user#同上,查看设备安装的第三方应用 ideviceinstaller-u[udid]-l-olist_system#查看设备安装的系统应用 ideviceinstaller-u[udid]-l-olist_all#查看设备安装的所有应用ideviceinfo-u[udid]#获取设备信息 ideviceinfo-u[udid]-kDeviceName#获取设备名称同命令 idevicenameidevicename#同上 ideviceinfo-u[udid]-kProductVersion#获取设备版本10.3.3 ideviceinfo-u[udid]-kProductType#获取设备类型iPhone8,1 ideviceinfo-u[udid]-kProductName#获取设备系统名称idevicesyslog#屏幕上即可看见手机上所有的日志 idevicesyslog>>iphone.log&#重定向日志到文件中idevicecrashreport#参数可设置具体文件存放位置idevicescreenshot#获取当前截屏,效率比appium截屏高10倍ideviceinfo#获取设备所有信息 idevicesyslog#获取设备日志 idevicecrashreport-etest#获取设备 crashlog,test是文件夹需新建 idevicediagnostics#管理设备状态-重启、关机、睡眠等idevicediagnosticsrestart

重启

其他系统文件信息

截屏

获取手机端崩溃报告

查看手机实时日志

获取设备信息

查看设备已安装的应用

卸载应用

安装应用

查看当前所连接的设备

ideviceinstaller 是一个与iOS设备的installation_proxy交互的工具,允许安装、升级、卸载、存档、还原和列举已安装或存档的app。此工具用于在真机上运行测试,默认是都安装的。

libimobiledevice 是一个跨平台的软件库 ;不依赖任何已有的私有库,不需要越狱。应用软件可以通过这个开发包轻松访问设备的文件系统、获取设备信息,备份和恢复设备,管理 SpringBoard 图标,管理已安装应用,获取通讯录、日程、备注和书签等信息

ios_webkit_debug_proxy

Appium使用ios_webkit_debug_proxy这个工具在真机上访问web view。即混合应用的测试 ;在终端中,运行以下命令:

brewinstallios-webkit-debug-proxy#安装命令 brewreinstallios-webkit-debug-proxy#重新安装

附:

iOS WebKit Debug Proxy的原理是在本地起了一个代理做WebInspector到WebKit远程调试的协议转发。

authroize-ios

iOS 授权工具,主要用于模拟器中一些权限的授权;

npminstall-gauthroze-iossudoauthroze-ios sudoauthroze-ios

iOS 环境

Xcode

安装Xcode和模拟器 :

启动Mac应用程序商店并下载/安装Xcode(Version 13.1)。安装之后,启动Xcode并选择 Xcode > Preferences > Components 来安装可能想要测试的模拟器。

安装Command Line Tools

默认是不会安装Command Line Tools的,Command Line Tools是在Xcode中的一款工具,可以在命令行中运行C程序。为了配置appium环境,我们需要安装Xcode Command Line Tools。

官网下载

方法一:

xcode-select--install#查看是否安装 xcode-select:error:commandlinetoolsarealreadyinstalled,use"SoftwareUpdate"to install updates(错误:命令行工具已经安装,请使用“软件更新”安装更新)

方法二:

打开Xcode,创建一个新的项目,在OSX下面选择Application,如果右侧出现Command line tool图 标,表示已经安装成功。

方法三:

打开XCode 新建工程,如果安装了,在新建窗口可以看到

xcodebuild-version

如果已经安装过xcode,appium-doctor提示未安装,则运行命令即可:

sudoxcode-select-r

附录:

xcrunsimctllist|grep'(Booted)'#查看已启动的模拟器udid instruments-sdevices#列出所有设备,包括真机、模拟器、mac #录像功能 xrecord--quicktime--list xrecord--quicktime--name="iPhone"--out="/Users/yong/video/iphone.mp4"--force

安装完成后,在终端中输入以下命令来查看安装版本:

下载完成后,双击已下载的 .dmg 进行安装

检验 Command Line Tools 是否安装成功

至此iOS环境搭建完毕!!!只适用于模拟器,真机的话还需要配置。

iOS 真机调试环境配置

前面我们知道WebDriverAgent是集成Appium测试ios应用的桥梁 (表现形式上:是安装在ios设备上的一个应用),WebDriverAgent 先前是一个独立的项目需要自己从github下载进行编译执行 ,在后来appium已经强行将其绑定在其组件中也就是说当你安装好appium时,WebDriverAgent也自动帮忙将其安装好,只需要手动修改部分内容,重新编译打包即可运行。

方式一:WebDriverAgent通过下载源码进行安装

不推荐通过此种方式安装,该方式先前是为老版本ios 9.4 之前的版本沿用 ,且 github上的源码已经距离现在两年多没有更新了,为避免不必要的问题。尽可能不要使用此种方式

安装webdriverAgent

(1) 在github上下载最新webdriverAgent代码

gitclonehttps://github.com/facebook/WebDriverAgent

(2)下载依赖

cd/Users/yourname/WebDriverAgent mkdir-pResources/WebDriverAgent.bundle sh./Scripts/bootstrap.sh

该脚本会使用Carthage下载所有的依赖,使用npm打包响应的js文件。执行完成后,直接双击打开WebDriverAgent.xcodeproj这个文件。

配置webdriverAgent

配置WebDriverAgentLib,选择开发者账号

2c4382bc-904d-11ef-a511-92fbcf53809c.png

配置WebDriverAgentRunner,选择开发者账号

2c5ef9f2-904d-11ef-a511-92fbcf53809c.png

连接并选择自己的ios设备,运行

2c729ae8-904d-11ef-a511-92fbcf53809c.png

2c91b068-904d-11ef-a511-92fbcf53809c.png

2cae473c-904d-11ef-a511-92fbcf53809c.png

运行成功后,iphone手机上会新建一个无图标的WebDriverAgent的应用,自动打开后马上又返回桌面

2cdbf7ea-904d-11ef-a511-92fbcf53809c.png

而在xcode控制台会打印如下日志:

2cf3bbfa-904d-11ef-a511-92fbcf53809c.png

里面有IP地址与端口


在网址上输入http://(ip地址):(端口号)/status,如果网页上返回一些json格式的数据,说明运行成功http://10.0.223.58:8100/status,有些iphone手机通过手机的IP和端口号还不能访问,此时需要将手机的端口转发到mac上

iproxy 8100 8100 # iproxy 8300 8100

执行命令后,通过访问 http://localhost:8100/ status来验证, 如果网页上返回一些json格式的数据,说明运行成功

2d229678-904d-11ef-a511-92fbcf53809c.png

而如果是想查看UI的图层,则可访问http://localhost:8100/inspector,方便书写测试用例

2d580eac-904d-11ef-a511-92fbcf53809c.png

备注:

通常来说为了持续集成,自动化会比较好一些,我们不必每次都通过这种方式来启动xcode、WebDriverAgent,这种方式只在第1次搭建环境时运行即可,我们可以在自动化脚本中加入如下代码,这样只要在以后启动appium后,运行自动化脚本,就会直接启动WebDriverAgent

desiredCapabilities.setCapability("useNewWDA", true);

如果xcode在先启动wda,而代码中又用此行代码,运行时xcode中会显示执行失败,报出冲突的错误哦,所以后期只在代码中启动WebDriverAgent即可,不再需要用xcode启动

精简过程如下:

2d7f5fb6-904d-11ef-a511-92fbcf53809c.png

方式二:WebDriverAgent通过集成appium进行安装

命令行安装:命令行安装的appium一般安装在/usr/local/bin/appium下,

WebDriverAgent将会在路径:/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/ 下

桌面版安装:WebDriverAgent的路径是:ls /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent

以上两种方式都可以在对应目录看到 WebDriverAgent.xcodeproj 工程,右键选择用xcode打开 ;在 “Signing&Capabilities” 下将 WebDriverAgentLib 和 WebDriverAgentRunner设置成 “Automatically manage signing” 并在 “Team” 中选择你的开发团队

2da07278-904d-11ef-a511-92fbcf53809c.png

新用户第一次需要创建Team团队

2dbeb4b8-904d-11ef-a511-92fbcf53809c.png

2de4a498-904d-11ef-a511-92fbcf53809c.png

2e079d18-904d-11ef-a511-92fbcf53809c.png

2e1a97b0-904d-11ef-a511-92fbcf53809c.png

2e2e7f0a-904d-11ef-a511-92fbcf53809c.png

剩下操作步骤和方式一种第3步一样, 不在此列出 ;

IOS自动化-WebDriverAgent-APPIUM框架原理

WebDriverAgent是Facebook开发的基于XCTest.framework的开源项目,实现了在iOS上支持WebDriver协议的服务,可以用来启动/终止APP,点击/滑动页面。

webdriver协议是一套基于HTTP协议的JSON格式规范,协议规定了不同操作对应的格式。之所以需要这层协议,是因为iOS、Android、浏览器等都有自己的UI交互方式,通过这层”驱动层“屏蔽各平台的差异,就可以通过相同的方式进行自动化的UI操作,做网络爬虫常用的selenium是浏览器上实现webdriver的驱动,而WebDriverAgent则是iOS上实现webdriver的驱动。

Appium客户端

在iOS上的客户端实际上就是使用了WebDriverAgent,作为实现webdriver协议的驱动层。

Appium服务端

Appium的服务端是一个桌面应用,用于和客户端通信,启动Appium的服务端之后,会在电脑上启动一个默认端口号是4723的HTTP服务。当我们编写完脚本执行时,脚本代码会被转换为webdriver协议的JSON数据,通过HTTP请求发送到电脑的4723端口。Appium服务端将脚本的执行请求下发给客户端(请求客户端的6100端口),客户端同样使用webdriver协议响应

利用Appium-Python-Client进行iOS的自动化测试

配置 appium 工具

运行 Appium-Desktop

2e5b2230-904d-11ef-a511-92fbcf53809c.png

开启start server

2e67adb6-904d-11ef-a511-92fbcf53809c.png

点击start new session并且在Desired Capabilities 中输入相关的参数后点击Start Session

2e8287f8-904d-11ef-a511-92fbcf53809c.png

运行成功后,会弹出一个控制界面,在该界面中可以控制手机上正在运行的程序

2e92c046-904d-11ef-a511-92fbcf53809c.png

开始自动化测试

打开下载后的appiumSimpleDemo文件,打开appiumSimpleDemo.xcodepro程序,配置下TARGET的签名

在appiumSimpleDemo的根目录执行编译指令,编译出一个app文件xcodebuild -sdk iphoneos -target appiumSimpleDemo -configuration Release,编译成功后app文件的地址会打印在命令行中 ;此处直接使用 xcode进行编译也可以 ,怎么方便怎么来

2eaa3852-904d-11ef-a511-92fbcf53809c.png

执行appiumSimpleDemo.py 文件路径如下:/Users/jx/PycharmProjects/53ui_ios/venv/bin/python /Users/jx/appiumSimpleDemo/appiumSimpleDemo.py

2ebfb3d0-904d-11ef-a511-92fbcf53809c.png

源码如下:

importunittest importos fromappiumimportwebdriver fromtimeimportsleep classappiumSimpleTezt(unittest.TestCase): defsetUp(self): app_path='/Users/jx/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app' app=os.path.abspath(app_path) self.driver=webdriver.Remote( command_executor='http://127.0.0.1:4723/wd/hub', desired_capabilities={ 'app':app, 'platformName':'iOS', 'platformVersion':'14.4', 'deviceName':'iPhone8plus', 'bundleId':'com.yongapps.app', 'udid':'4c7a46cee7f512ff1463eb3b09dc5329e779355c' } ) deftest_push_view(self): next_view_button=self.driver.find_element_by_accessibility_id("entrynextview") next_view_button.click() sleep(2) back_view_button=self.driver.find_element_by_accessibility_id("Back") back_view_button.click() deftearDown(self): sleep(1) #self.driver.quit() if__name__=='__main__': suite=unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt) unittest.TextTestRunner(verbosity=2).run(suite)

踩坑笔记

问题1:如果安装 carthage出现以下错误:

Error:Anunexpectederroroccurredduringthebrewlinkstep Theformulabuilt,butisnotsymlinkedinto/usr/local Permissiondenied@dir_s_mkdir-/usr/local/Frameworks Error:Permissiondenied@dir_s_mkdir-/usr/local/Frameworks

原因是carthage已经安装,但是没有 link 到 brew,还有就是文件夹权限问题,在终端输入:

MacBook-pro~%sudomkdir/usr/local/Frameworks MacBook-pro~%sudochown$(whoami):admin/usr/local/Frameworks MacBook-pro~%brrewlinkcarthage

问题2:安装 libimobiledevice & ideviceinstaller 遇到:“invalid active developer path”

运行:

MacBook-pro~%xcode-select--install MacBook-pro~%sudoxcode-select-r

可能出现的问题

dyld:Librarynotloaded:/usr/local/opt/openssl/lib/libssl.1.0.0.dylibReferencedfrom: /usr/local/opt/libimobiledevice/lib/libimobiledevice.6.dylibReason:imagenotfound

如果遇到如上错误,则先卸载ideviceinstaller 和 libimobiledevice

MacBook-pro~%brewuninstallideviceinstaller MacBook-pro~%brewuninstalllibimobiledevice

然后再重安装即可

问题3:ios-webkit-debug-proxy 安装遇到 The following directories are not writable by your user:

详细错误提示:

Thefollowingdirectoriesarenotwritablebyyouruser: /usr/local/share/man/man5 /usr/local/share/man/man7

解决方法:因为是该目录无权限无法写入的问题,所以直接sudo给上权限就可以了,然后再使用安装命令就可以了,示例如下图:

2eea37c2-904d-11ef-a511-92fbcf53809c.png

问题4:xcode-select --install命令行安装提示 Xcode alone is not sufficient on Sierra.

Error:XcodealoneisnotsufficientonSierra. InstalltheCommandLineTools: xcode-select--install

解决方案:Mac最新场景下安装Xcode时已经没有Command Line了,需要单独安装。根据提示在使用命令xcode-select --install` 安装时最后结果是不能安装该软件。需要安装如上所示

问题5:方式一 安装WebDriverAgent 执行 ./Scripts/bootsrap.sh 出错如下

2f230854-904d-11ef-a511-92fbcf53809c.png

安装最后我们可以看到部分依赖安装需要安装 Carthage 这个东西,如果没注意的话就会造成 RoutingHTTPServer 部分文件缺失,后面 build 就会报错 。

2f421208-904d-11ef-a511-92fbcf53809c.png

2f5d339e-904d-11ef-a511-92fbcf53809c.png

通过命令 brew install carthage 安装后再执行 ./Scripts/bootstrap.sh 即可。

根据 WebDriverAgent 官网提供的步骤,将参数替换为我们真机的参数后在真机上尝试build 。

2f7134f2-904d-11ef-a511-92fbcf53809c.png

执行完命令后可能会出现如下报错

2f894ccc-904d-11ef-a511-92fbcf53809c.png

从报错信息来看,缺少 development team,那么我们回到 Xcode,将 Automatically manage signing 进行勾选后选择一个 Team,注意要进入 WebDriverAgentRunner 中进行设置 。设置好之后又会出现报错

这个报错信息就和我们之前提到的一样,bundle indentifler 不唯一,保险起见,这里将项目中所有的 Targets 都进行了修改

修改好之后我们再次 build,之前的问题解决了,不幸的是 build 又 fail 了,又出现了新的报错:

2fb57e14-904d-11ef-a511-92fbcf53809c.png

解决办法:

没错,我们在报错出双击,进入到报错代码处,将 assign 改为 strong 后再次 build :

2fc7fc06-904d-11ef-a511-92fbcf53809c.png

Build succeeded !!!老泪纵横…

最终,再执行

最后踩坑:build成功后,ios真机上没有安装WDA这个问题困扰了我一个星期,然后最后我把ios设备名改成英文后安装成功了。。。

终于在 iOS 真机上看到了 WDA 的身影

2fe65b56-904d-11ef-a511-92fbcf53809c.png

问题6:执行 ./Scripts/bootstrap.sh ERROR in ./js/app.js 报错 出错如下

3002cd54-904d-11ef-a511-92fbcf53809c.png

301f227e-904d-11ef-a511-92fbcf53809c.png

303d23fa-904d-11ef-a511-92fbcf53809c.png

问题7: 执行时候报 xcodebuild failed with code 65 错误

30554368-904d-11ef-a511-92fbcf53809c.png

307d621c-904d-11ef-a511-92fbcf53809c.png

问题8: 个人证书调试失败

Failed to register bundle identifier.The app identifier "com.facebook.WebDriverAgentRunner" cannot be registered to your development team because it is not available. Change your bundle identifier to a unique string to try again.

需要手动更改目标的bundle id,方法是进入“Build Settings”选项,更改“Product bundle Identifier”的值使Xcode将接受,默认为com.facebook.WebDriverAgentRunner,你需要改成不一样的,如:io.automation.WebDriverAgentRunner (此处必须修改为和你在苹果开发者后台申请的bundle Id 一样 )

309eded8-904d-11ef-a511-92fbcf53809c.png

返回 “Signing&Capabilities” 选项,看到对于文件WebDriverAgentRunner的配置文件已经创建成功了

30d483bc-904d-11ef-a511-92fbcf53809c.png

310a51ae-904d-11ef-a511-92fbcf53809c.png

问题9: 解决警告问题

解决方案如下:

312f8a00-904d-11ef-a511-92fbcf53809c.png

问题10: 将WDA安装到被测手机上,安装失败 ,提示如下

报错: error:Noprofilesfor'io.uitest.WebDriverAgentRunner.xctrunner'werefound:Xcodecouldn'tfindanyiOSAppDevelopmentprovisioningprofilesmatching'io.uitest.WebDriverAgentRunner.xctrunner'.Automaticsigningisdisabledandunabletogenerateaprofile.Toenableautomaticsigning,pass-allowProvisioningUpdatestoxcodebuild.(intarget'WebDriverAgentRunner'fromproject'WebDriverAgent')

报这个错是因为没有接入相关的设备到MAC上,只要设备接入,并通过XCode菜单:Product->Destnation->"Select Devices"选中要连接的设备就行。

解决方案:

XCode:Product->Destination->"Select your iphone"

314ce262-904d-11ef-a511-92fbcf53809c.png

Product->Scheme->"Select WebDriverAgentRunner"

31711290-904d-11ef-a511-92fbcf53809c.png

Product -> Test

31983b36-904d-11ef-a511-92fbcf53809c.png

注意:运行Test之前,手机先解锁再通过USB线连接到电脑。

问题10: 解决Product -> Test报错问题,如下所示

31bfe140-904d-11ef-a511-92fbcf53809c.png

/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeprojUser-suppliedCFBundleIdentifiervalue'com.facebook.wda.lib'intheInfo.plistmustbethesameasthePRODUCT_BUNDLE_IDENTIFIERbuildsettingvalue'com.facebook.WebDriverAgentLib'.

解决方案:

31deaee0-904d-11ef-a511-92fbcf53809c.png

运行报错:

/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h9:'CocoaAsyncSocket/GCDAsyncSocket.h'filenotfound

解决:进入appium-webdriveragent目录,重新执行:

MacBook-pro%cd/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent MacBook-proappium-webdriveragent%sh./Scripts/bootstrap.sh

31f288ac-904d-11ef-a511-92fbcf53809c.png

再次执行Product -> Test,弹出密钥授权弹窗,输入密钥(多次输入密钥,直到弹窗消失)

最后报错:Command CodeSign failed with a nonzero exit code解决方案---通过终端命令:

MacBook-proappium-webdriveragent%xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination'id=000-000080E'test

执行中会弹出密钥弹窗,多次输入密钥,直到弹窗消失

最后机上可以看到一个没有图标的 WebDriverAgentRunner.app 应用,进入设置 -》通用 -》设备管理 -》点击 开发者app下面的证书 -》点击“第一个蓝色字体信任按钮” -》点击信任,再重新执行项目即可正常连接xcode点击直接运行:

32166664-904d-11ef-a511-92fbcf53809c.png

再次报错:

/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeprojUser-suppliedCFBundleIdentifiervalue'com.facebook.wda.runner'intheInfo.plistmustbethesameasthePRODUCT_BUNDLE_IDENTIFIERbuildsettingvalue'io.uitest.WebDriverAgentRunner'.

解决方案:

32393d42-904d-11ef-a511-92fbcf53809c.png

最终看到这样输出就是成功了:

TestSuite‘Alltests’startedat2017-01-231512.585 TestSuite‘WebDriverAgentRunner.xctest’startedat2017-01-231512.586 TestSuite‘UITestingUITests’startedat2017-01-231512.587 TestCase‘-[UITestingUITeststestRunner]’started. t=0.00sStartTestat2017-01-231512.588 t=0.00sSetUp

备注:

xxx.app为 Xcode 编译后的应用安装包路径

xxx.ipa为应用在本地的路径

问题11: wda安装成功了,但是 验证时访问无结果

解决方案:

有些国产的iPhone机器通过手机的IP和端口还不能访问,此时需要将手机的端口转发到Mac上。

使用--HEAD安装最新版本

$brewinstalllibimobiledevice--HEAD$iproxy81008100

这时通过访问http://localhost:8100/status确认WDA是否运行成功。

此时你应该可以看到有返回信息,只不过返回的sessionID 为空 ,此处如果有问题见问题12

问题12: Appium 重签名后的 wda 正常启动了,但是没有返回 sessionID

wda 的日志如下:

TestSuite'WebDriverAgentRunner.xctest'startedat2020-06-121528.188 TestSuite'UITestingUITests'startedat2020-06-121528.188 2020-06-121528.215329+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardAutocorrection )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.221426+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardPrediction )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.222215+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardShowPredictionBar )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.224043+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( DidShowGestureKeyboardIntroduction )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess TestCase'-[UITestingUITeststestRunner]'started. t=0.00sStartTestat2020-06-121528.224 t=0.00sSetUp 2020-06-121528.230656+0800WebDriverAgentRunner-Runner[616:123635]BuiltatJun1220201529 2020-06-121528.238785+0800WebDriverAgentRunner-Runner[616:123635]ServerURLHere->http://172.18.62.8:8100<-ServerURLHere 2020-06-12 1528.239467+0800 WebDriverAgentRunner-Runner[616:123836] Using singleton test manager

使用 postman 发送请求,返回的 sessionID 为 null,但是 xcode 的控制台没有报任何错误

325a061c-904d-11ef-a511-92fbcf53809c.png

启动应用程序直接返回 400

3273ce9e-904d-11ef-a511-92fbcf53809c.png

此问题坑爹至极 ,网上搜索了众多内容都没有此问题的答案 ;但是有人在testhome上已经提出了这个问题但是至今没有人回复答案 ;

解决方案:

安装usbmuxd

brewinstallusbmuxd

iproxy该工具会将设备上的端口号映射到电脑上的某一个端口

32954c68-904d-11ef-a511-92fbcf53809c.png

最后使用iproxy 进行端口转发的时候, 一定跟上指定的设备id

即: iproxy local_port device_port -u udid

问题13:解决 XCUITest iproxy exited with code 208

命令行执行

ps-ax|grep-**i**"iproxy"|grep-vgrep|awk'{print"kill-9"$1}'|sh

问题14:每次测试应用都需要启动 WebDriverAgent , 修改使用脚本方式自动运行

#解锁keychain,以便可以正常的签名应用, PASSWORD="YourPassword" securityunlock-keychain-p$PASSWORD~/Library/Keychains/login.keychain #获取设备的UDID,用到了之前的libimobiledevice UDID=$(idevice_id-l|head-n1) #真机运行测试 xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination"id=$UDID"test #模拟器运行测试 #xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination"platform=iOSSimulator,name=iPhoneX"test

脚本运行完成后,同样手机/模拟器上会出现一个无图标的 WebDriverAgent 应用,启动之后,马上又返回到桌面。此时终端会输出 IP 地址和端口。

附录

1. 关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系

考虑到想要将待测试应用安装到真机 ,首先绕不过去的必须得申请证书,申请证书之前又必须得要开发者账号,以上都具备了开始按步骤申请Certificate、Provisioning Profile、App ID ;可是即使你申请成功,难免对以上三者之间关系感到懵逼,以下对三者之间关系进行简介说明,帮助理清之间的脉络关系

开发者账号类型

32b1e080-904d-11ef-a511-92fbcf53809c.png

概念介绍

如果你拥有一个开发者账户的话,在iOS Dev Center打开Certificates, Indentifiers & Profiles,你就可以看到如下的列表:

32d705e0-904d-11ef-a511-92fbcf53809c.png

Profile Portal改版有一段时间了,改版之后的结构比以前更清晰明了,易于理解和管理。

上面的列表就包含了开发、调试和发布iOS应用程序所需的所有内容:Certificates、Identifiers、Devices、Provisioning Profiles。下面将一一解释这几个东东。

Certificate

证书是用来给应用程序签名的,只有经过签名的应用程序才能保证他的来源是可信任的,并且代码是完整的, 未经修改的。在Xcode Build Setting的Code Signing Identity中,你可以设置用于为代码签名的证书。

众所周知,我们申请一个Certificate之前,需要先申请一个Certificate Signing Request (CSR) 文件,而这个过程中实际上是生成了一对公钥和私钥,保存在你Mac的Keychain中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。如下图所示,在你Mac的keychain的login中存储着相关的公钥和私钥,而证书中包含了公钥。你只能用私钥来进行签名,所以如果没有了私钥,就意味着你不能进行签名了,所以就无法使用这个证书了,此时你只能revoke之前的证书再申请一个。因此在申请完证书时,最好导出并保存好你的私钥。当你想与其他人或其他设备共享证书时,把私钥传给它就可以了。私钥保存在你的Mac中,而苹果生成的Certificate中包含了公钥。当你用自己的私钥对代码签名后,苹果就可以用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等。

3302ccca-904d-11ef-a511-92fbcf53809c.png

证书主要分为两类:Development和Production,Development证书用来开发和调试应用程序,Production主要用来分发应用程序(根据证书种类有不同作用),下面是证书的分类信息:(括号内为证书有效期)

(注:不同类型的开发者账户所能创建的证书种类不同,关于开发者账户的对比和InHouse证书相关的内容,请见我的另一篇文章)

有一些类型的证书我没有使用过,所以也不了解具体的作用。

App ID

App ID用于标识一个或者一组App,App ID应该是和Xcode中的Bundle ID是一致的或者匹配的。App ID主要有以下两种:

每创建一个App ID,我们都可以设置该App ID所使用的APP Services,也就是其所使用的额外服务。每种额外服务都有着不同的要求,例如,如果要使用Apple Push Notification Services,则必须是一个explicit App ID,以便能唯一标识一个应用程序。下面是目前所有可选的服务和相应的配置要求。

33185dc4-904d-11ef-a511-92fbcf53809c.png

如果你的App使用上述的任何一种service,就要按照要求去配置。

Device

Device最简单了,就是iOS设备。Devices中包含了该账户中所有可用于开发和测试的设备。每台设备使用UDID来唯一标识。

每个账户中的设备数量限制是100个。Disable 一台设备也不会增加名额,只能在membership year 开始的时候才能通过删除设备来增加名额。

Provisioning Profile

一个Provisioning Profile文件包含了上述的所有内容:证书、App ID、设备。

试想一下,如果我们要打包或者在真机上运行一个应用程序,我们首先需要证书来进行签名,用来标识这个应用程序是合法的、安全的、完整的等等;然后需要指明它的App ID,并且验证Bundle ID是否与其一致;再次,如果是真机调试,需要确认这台设备能否用来运行程序。而Provisioning Profile就把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用,这样我们只要在不同的情况下选择不同的profile文件就可以了。而且这个Provisioning Profile文件会在打包时嵌入.ipa的包里。

例如,如下图所示,一个用于Development的Provisioning Profile中包含了该Provisioning Profile对应的App ID,可使用的证书和设备。这意味着使用这个Provisioning Profile打包程序必须拥有相应的证书,并且是将App ID对应的程序运行到Devices中包含的设备上去。

Explicit App ID:唯一的App ID,这种App ID用于唯一标识一个应用程序,例如com.ABC.demo1,标识Bundle ID为com.ABC.demo1的程序。

Wildcard App ID:通配符App ID,用于标识一组应用程序。例如*可以表示所有应用程序,而com.ABC.*可以表示以com.ABC开头的所有应用程序。

In-House and Ad Hoc (3年):用来发布In-House和AdHoc的应用程序。

MDM CSR

Push Production (1年):用来在发布版本中使用Apple Push Notification。

Pass Type ID Certificate

Website Push ID Certificate

App Development (1年):用来开发和真机调试应用程序。

Push Development (1年):用来调试Apple Push Notification

Development

Production

App Store :用来发布提交App Store的应用程序。

33383702-904d-11ef-a511-92fbcf53809c.png

如上所述,在一台设备上运行应用程序的过程如下:

334f1468-904d-11ef-a511-92fbcf53809c.png

与证书一样,Provisioning Profile也分为Development和Distribution两种:

(注:前面提到不同账户类型所能创建的证书种类不同,显然Profile文件的种类是和你所能创建的证书种类相关的)

Development (1年)

Distribution (1年)

In House

Ad Hoc

App Store

In House 与Ad Hoc的不同之处在于:In House没有设备数量限制,而Ad Hoc是用来测试用的,Ad Hoc的包只能运行在该账户内已登记的可用设备上,显然是有最多100个设备的数量限制。所以这两种Provisioning Profile文件的区别就在于其中的设备限制不一样而已,而他们所使用的Certificate是相同的。

开发/发布流程

了解了上面的概念,再来看开发及发布流程就非常简单了,而且相信你不用看教程也能一步步完成所有的操作了。

开发/真机调试流程

根据上面的介绍,可以知道进行Development主要有以下几个步骤:

申请证书

加入设备

生成Provisioning Profile

设置Xcode Code Sign Identifer

事实上第三步通常是不需要的,因为我们通常都是用Xcode生成和管理的iOS Team Provisioning Profile来进行开发,因为它非常方便,所以不需要自己手动生成Provisioning Profile。

iOS Team Provisioning Profile是第一次使用Xcode添加设备时,Xcode自动生成的,它包含了Xcode生成的一个Wildcard App ID(*,匹配所有应用程序),账户里面所有的Devices和所有Development Certificates,如下图所示。因此,team中的所有成员都可以使用这个iOS Team Provisioning Profile在team中的所有设备上调试所有的应用程序。并且当有新设备添加进来时,Xcode会更新这个文件。

336c710c-904d-11ef-a511-92fbcf53809c.png

发布流程

网上有很多关于发布App Store的流程,我就不缀述了,不过根据上面的概念介绍,不管是App Store、In-House还是Ad-Hoc,打包流程都是差不多的,都包括了以下几个关键步骤:

创建发布证书

创建App ID

创建对应的Provisioning Profile文件

设备Bundle ID和App ID一致

设置Xcode Code Sign Identifer,选择合适的Profile和证书进行签名,打包

2. WebDriverAgent 整体框架设计

3382f2f6-904d-11ef-a511-92fbcf53809c.png

GitHub的描述:

WebDriverAgentisaWebDriverserverimplementationforiOSthatcanbeusedtoremotecontroliOSdevices.Itallowsyoutolaunch&killapplications,tap&scrollviewsorconfirmviewpresenceonascreen.Thismakesitaperfecttoolforapplicationend-to-endtestingorgeneralpurposedeviceautomation.ItworksbylinkingXCTest.frameworkandcallingApple'sAPItoexecutecommandsdirectlyonadevice.WebDriverAgentisdevelopedandusedatFacebookforend-to-endtestingandissuccessfullyadoptedbyAppium.

WebDriverAgent在iOS端实现了一个WebDriverServer,可用于远程控制iOS设备。它允许您启动和终止应用程序,点击和滚动视图或确认屏幕上的视图状态。这使其成为应用端到端测试或通用设备自动化的完美工具。它通过链接XCTest.framework和调用Apple的API来直接在设备上执行命令。WebDriverAgent在Facebook上开发并用于端到端测试,并被Appium成功采用。特性:

适用于设备和模拟器

实现大部分WebDriver规范

实现Mobile JSON Wire Protocol Spec的一部分

USB支持设备

具有友好用户界面的Inspector 端点,用于检查当前设备状态

易于开发,因为它可以通过Xcode直接启动和调试

尚不支持,但与tvOS和OSX一起使用

WDA Client

WDA Client是基于WebDriverAgent实现的WDA的客户端。

我们在 iOS 设备上启动了 WDA 的服务端。为了运行 Mac OS 上的脚本,我们需要在 Mac OS 上安装 WDA 客户端。

facebook-wda 就是 WDA 的 Python 客户端库,通过直接构造HTTP请求直接跟WebDriverAgent通信。

#安装WDApython客户端 pip3install--prefacebook-wda

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 自动化测试
    +关注

    关注

    0

    文章

    202

    浏览量

    26884
  • iOS
    iOS
    +关注

    关注

    8

    文章

    3393

    浏览量

    150377

原文标题:Appium +iOS 自动化测试全网最全教程(实践、总结 、踩坑)

文章出处:【微信号:TestinChina,微信公众号:Testin云测】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OPhone自动化测试技术概述

    本文将对OPhone平台上可采用的几种自动化测试技术进行介绍,并对每种技术的优缺点做简要的总结。OPhone台除了为应用程序开发提供丰富的API外,也为开展自动化
    发表于 05-06 08:58

    Linux学习过程过的与如何解决

    Linux记录记录Linux学习过程过的与如何解决1解决方法:F10进入BIOS使能
    发表于 11-04 08:44

    软件自动化测试方案的效益分析

    首先对手工测试自动化测试进行比较,然后提出自动化测试方案选择需要考虑的方面,并结合工作实践,给
    发表于 03-01 15:05 14次下载

    基于Web的自动化测试框架的研究

    根据web系统测试的特点,为提高软件测试自动化脚本的可重用性,结合在实际项目中软件自动化测试实践
    发表于 11-07 15:58 0次下载
    基于Web的<b class='flag-5'>自动化</b><b class='flag-5'>测试</b>框架的研究

    自动化测试系统的最佳实践指南秘籍

    自动化测试系统的最佳实践指南秘籍 ,学习资料。
    发表于 03-21 16:02 0次下载

    SaaS产品自动化测试实例分析

    【摘要】本文讲述某个企业级SaaS产品自动化测试项目的实践过程。文章介绍了项目遇到的挑战、应对策略和实施过程,最后总结了企业级SaaS产品给自动化
    发表于 09-28 15:54 1次下载
    SaaS产品<b class='flag-5'>自动化</b><b class='flag-5'>测试</b>实例分析

    Android 手机自动化测试工具有哪几种

    Android 手机自动化测试工具有哪几种:Monkey是Android SDK自带的测试工具.MonkeyRunner也是Android SDK提供的测试工具。Instrumenta
    的头像 发表于 02-06 15:35 1.1w次阅读

    ATE自动化测试系统是什么_ATE自动化测试系统介绍

    本文首先介绍了ATE自动化测试系统发展线路,其次阐述了ATE自动化测试系统的作用及原理、特点、优势,最后介绍了ATE自动化
    发表于 05-23 16:47 3.2w次阅读

    嵌入式Linux记录

    Linux记录记录Linux学习过程过的与如何解决1解决方法:F10进入BIOS使能
    发表于 11-01 17:21 10次下载
    嵌入式Linux<b class='flag-5'>踩</b><b class='flag-5'>坑</b>记录

    STM32CubeIDE+FREERTOS记录

    STM32CubeIDE+FREERTOS记录
    发表于 12-05 18:06 15次下载
    STM32CubeIDE+FREERTOS<b class='flag-5'>踩</b><b class='flag-5'>坑</b>记录

    什么是自动化测试框架

    自动化测试框架,即是应用于自动化测试所用的框架。按照框架的定义,自动化测试框架要么是提供可重用的
    发表于 04-18 14:44 870次阅读

    python自动化测试攻城记

    本文介绍实施自动化测试需要具备的技能及具体实践流程。
    的头像 发表于 08-16 11:39 1002次阅读
    python<b class='flag-5'>自动化</b><b class='flag-5'>测试</b>攻城记

    推挽电路的,你过没?

    推挽电路的,你过没?
    的头像 发表于 11-24 16:25 1047次阅读
    推挽电路的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b>过没?

    电源测试怎么自动化?电源模块自动化测试系统如何实现?

    纳米软件在电测行业深耕十余年,在行业的大背景下,为了进一步完善自动化测试,开发出了新的智能的电源模块自动化测试系统ATECLOUD-POW
    的头像 发表于 12-15 14:40 798次阅读
    电源<b class='flag-5'>测试</b>怎么<b class='flag-5'>自动化</b>?电源模块<b class='flag-5'>自动化</b><b class='flag-5'>测试</b>系统如何实现?

    自动化仿真系统搭建实践

    今天我们分享TIAV17+PLCSIM+PS+SIMIT:自动化仿真系统搭建实践
    的头像 发表于 01-04 11:28 1901次阅读
    <b class='flag-5'>自动化</b>仿真系统搭建<b class='flag-5'>实践</b>