IOS + Appium自动化教程

前言

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

以下内容参考了如下网站:

  • appium英文官方:https://appium.io/docs/en/drivers/ios-xcuitest/index.html

  • appium使用问题集锦: Appium Discuss (需要:kx上网)

  • facebook-wda源码:GitHub - kwmgenius/facebook-wda: Facebook WebDriverAgent Python Client Library (not official)

  • TestHome社区:重签名后的 wda 正常启动了,但是没有返回 sessionID · TesterHome

  • WebDriverAgent for ios: https://docs.katalon.com/katalon-studio/docs/installing-webdriveragent-for-ios-devices.html (需要:kx上网)

  • Appium XCUITest Driver Setup: Appium XCUITest Driver Setup - Tutorial (需要:kx上网)

  • stackoverflow中文社区:https://www.soinside.com/

  • 简书:mac下配置Appium和WebDriverAgent: mac下配置Appium和WebDriverAgent - 简书

  • ATX ATX 文档 - iOS 真机如何安装 WebDriverAgent :https://testerhome.com/topics/7220

  • Mac OS安装appium: https://www.techaheadcorp.com/blog/how-to-install-appium-on-mac/

  • 初识 iOS 自动化测试框架 WebDriverAgent : https://www.cnblogs.com/zgq123456/p/9979280.html

  • openatx/facebook-wda安装教程:https://github.com/openatx/facebook-wda/blob/master/README.md (需要kx上网)

  • 如何设置和自定义WebDriverAgent服务器: https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/wda-custom-server.md

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 记录特性来获取界面上的一些列视图元素和操作事件,然后在测试方法中触发事件。

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

具体参考资料:

About Testing with Xcode

3. KIF

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

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

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

具体参考资料:GitHub - kif-framework/KIF: Keep It Functional - An iOS Functional Testing Framework

4. Frank

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

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

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

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

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

具体参考资料:App Development Ireland - App Developers Dublin

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,对其他语言不友好

具体资料获取路径:GitHub - calabash/calabash-ios: Calabash for iOS

6. Subliminal

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

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

具体资料获取路径:GitHub - Diaoul/subliminal: Subtitles, faster than your thoughts

7. Kiwi

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

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

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

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

具体资料获取路径:GitHub - kiwi-bdd/Kiwi: Simple BDD for iOS
8. Appium

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

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

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

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

具体资料获取路径:Redirecting

内测发布工具

1. fir.im

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

2. 蒲公英

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

3. TestFlight

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

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

Appium驱动IOS测试原理

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

    image.png

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

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

    image.png

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

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

image.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

    1. 下载setuptools

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

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

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

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

通用环境

  • Homebrew

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

    1. 终端输入安装:
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">/usr/bin/ruby -e <span style="color:#a31515">"$(curl –fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</span> 
    </code></span></span>

    覆盖安装:

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">/usr/bin/ruby -e <span style="color:#a31515">"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</span>
    </code></span></span>
    1. 检查homebrew是否安装
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-cpp">brew -v   	<span style="color:#008000">//检查homebrew是否安装</span>
    brew list   <span style="color:#008000">//查看已安装列表</span>
    brew update <span style="color:#008000">//更新Homebrew</span>
    </code></span></span>

    如果安装失败:

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

    2. 然后终端输入:

      <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">/usr/bin/ruby homebrew.txt
      </code></span></span>

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

  • Node & NPM

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

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

      <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#0000ff">brew </span><span style="color:#0000ff">install </span>node
      </code></span></span>
    2. 查看node版本

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-undefined">node -v
    </code></span></span>
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-undefined">重新安装: 
    </code></span></span>
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#0000ff">brew </span>reinstall node
    </code></span></span>
    1. 默认的npm源再国内都很慢,安装好node之后需要重新配置一个国内源 (非必须)
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">npm config <span style="color:#0000ff">set</span> registry https://registry.npm.taobao.org/
    </code></span></span>
  • Carthage

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

    1. 终端输入:
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#0000ff">brew </span><span style="color:#0000ff">install </span>carthage
    </code></span></span>

    更新carthage : rew upgrade carthage

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

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-cpp">   carthage version <span style="color:#008000">//打印出版本号即表示安装成功</span>
    </code></span></span>
  • Appium

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

    安装 Appium(二选1) ;

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

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

    image.png

    方式2:安装 appium-server 版

    1. 终端安装server版输入
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm">npm <span style="color:#0000ff">install </span>-g appium
    </code></span></span>

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

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">npm install -g appium<span style="color:#0000ff">@1</span>.7.2
    </code></span></span>

    卸载 Appium:

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">npm uninstall -g appium
    npm cache clean <span style="color:#ff0000">--force</span>
    </code></span></span>
    1. 安装完成之后输入appium -v,显示版本号表示appium server安装成功
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-undefined">appium -v 
    </code></span></span>

    启动appium服务

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-scss">appium &<span style="color:#2b91af">[1]</span> <span style="color:#880000">965</span>$ <span style="color:#2b91af">[Appium]</span> Welcome to Appium v1<span style="color:#880000">.9</span><span style="color:#880000">.1</span>
    <span style="color:#2b91af">[Appium]</span> Appium <span style="color:#a31515">REST</span> http interface listener started on <span style="color:#880000">0.0</span><span style="color:#880000">.0</span><span style="color:#880000">.0</span>:<span style="color:#880000">4723</span>
    </code></span></span>
  • python-client

    1. 下载python-client

      <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">git <span style="color:#0000ff">clone</span> git@github.com:appium/python-client.git
      </code></span></span>
    2. 安装python-client

      <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash"><span style="color:#0000ff">cd</span> python-client <span style="color:#008000"># 进入python-client目录</span>
      python setup.py install <span style="color:#008000"># 安装python-client</span>
      </code></span></span>
  • Appium-Doctor

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

    1. 安装 appium-doctor
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm">npm <span style="color:#0000ff">install </span>appium-doctor -g
    </code></span></span>
    1. 检查 iOS环境是否安装成功
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">appium-doctor <span style="color:#ff0000">--ios</span>
    </code></span></span>

    image.png

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

  • ios-deploy

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

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#0000ff">brew </span><span style="color:#0000ff">install </span>ios-deploy <span style="color:#008000"># 安装命令</span>
    <span style="color:#0000ff">brew </span>reinstall ios-deploy <span style="color:#008000"># 重新安装</span>
    <span style="color:#0000ff">brew </span>upgrade ios-deploy <span style="color:#008000"># 更新命令</span>
    </code></span></span>

    常用命令如下:

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">ios-deploy -c # 查看当前链接的设备
    ios-deploy --<span style="color:#2b91af">[xxx.app]</span> # 安装APP
    ios-deploy <span style="color:#ff0000">--id</span> <span style="color:#2b91af">[udid]</span> <span style="color:#ff0000">--uninstall_only</span> <span style="color:#ff0000">--bundle_id</span> <span style="color:#2b91af">[bundleId]</span> # 卸载应用
    ios-deploy <span style="color:#ff0000">--id</span> <span style="color:#2b91af">[udid]</span> <span style="color:#ff0000">--list_bundle_id</span> # 查看所有应用
    ios-deploy <span style="color:#ff0000">--id</span> <span style="color:#2b91af">[udid]</span> <span style="color:#ff0000">--exists</span> <span style="color:#ff0000">--bundle_id</span> # 查看应用是否安装
    </code></span></span>
  • ideviceinstaller & libimobiledevice

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

    1. libimobiledevice 是一个跨平台的软件库 ; 不依赖任何已有的私有库,不需要越狱。应用软件可以通过这个开发包轻松访问设备的文件系统、获取设备信息,备份和恢复设备,管理 SpringBoard 图标,管理已安装应用,获取通讯录、日程、备注和书签等信息
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#0000ff">brew </span><span style="color:#0000ff">install </span>ideviceinstaller <span style="color:#008000"># 用于查看bundleid</span>
    <span style="color:#0000ff">brew </span>reinstall ideviceinstaller <span style="color:#008000"># 重新安装</span>
    </code></span></span>
    1. ideviceinstaller 是一个与iOS设备的installation_proxy交互的工具,允许安装、升级、卸载、存档、还原和列举已安装或存档的app。此工具用于在真机上运行测试,默认是都安装的。
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#0000ff">brew </span><span style="color:#0000ff">install </span>libimobiledevice --HEAD <span style="color:#008000"># 安装最新的更新</span>
    <span style="color:#0000ff">brew </span>reinstall libimobiledevice <span style="color:#008000"># 重新安装</span>
    </code></span></span>

    其常用命令如下:

    • 查看当前所连接的设备
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">idevice_id -l <span style="color:#008000"># 显示当前所连接设备的 udid</span>
    instruments -s devices <span style="color:#008000"># 列出所有设备,包括真机、模拟器、mac</span>
    1.查看模拟器的udid用的xcrun instruments -sxcrun simctl list2.启动这个模拟器:xcrun instruments -w <span style="color:#a31515">'B39EC2FF-8A8B-4BFF-AFA4-7875904A9EB8'</span>3.在这个模拟器安装路径下的APPxcrun simctl install B39EC2FF-8A8B-4BFF-AFA4-7875904A9EB8 /Users/brian/Desktop/TPPortal.app4.卸载这个模拟器中的APPxcrun simctl uninstall B39EC2FF-8A8B-4BFF-AFA4-7875904A9EB8 com.cntaiping.portalQingyunTest5、启动模拟器上的APPxcrun simctl launch B39EC2FF-8A8B-4BFF-AFA4-7875904A9EB8 com.cntaiping.portalQingyunTest6.不启动 Xcode 该如何开启 iOS 模拟器?/Applications/Xcode.app/Contents/Developer/Applications/Simulator7.ios app 包查看包名(Bundle identifier)打开plist编辑器,open打开解压后的安装包中的info.plist文件 ,查看plist中的Bundle identifier。</code></span></span>
    • 安装应用
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">ideviceinstaller -u <span style="color:#2b91af">[udid]</span> -<span style="color:#0000ff">i</span> <span style="color:#2b91af">[xxx.ipa]</span> # xxx<span style="color:#880000">.ipa</span> 为应用在本地的路径
    </code></span></span>
    • 卸载应用
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">ideviceinstaller -u <span style="color:#2b91af">[udid]</span> -U <span style="color:#2b91af">[bundleId]</span>
    </code></span></span>
    • 查看设备已安装的应用
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">ideviceinstaller -u [udid] -l <span style="color:#008000"># 查看设备安装的第三方应用</span>
    ideviceinstaller -u [udid] -l -o list_user <span style="color:#008000"># 同上,查看设备安装的第三方应用</span>
    ideviceinstaller -u [udid] -l -o list_system <span style="color:#008000"># 查看设备安装的系统应用</span>
    ideviceinstaller -u [udid] -l -o list_all <span style="color:#008000"># 查看设备安装的所有应用</span>
    </code></span></span>
    • 获取设备信息
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">ideviceinfo -u [udid] <span style="color:#008000"># 获取设备信息</span>
    ideviceinfo -u [udid] -k DeviceName <span style="color:#008000"># 获取设备名称 同命令 </span>
    idevicenameidevicename <span style="color:#008000"># 同上</span>
    ideviceinfo -u [udid] -k ProductVersion <span style="color:#008000"># 获取设备版本 10.3.3</span>
    ideviceinfo -u [udid] -k ProductType <span style="color:#008000"># 获取设备类型 iPhone 8,1</span>
    ideviceinfo -u [udid] -k ProductName <span style="color:#008000"># 获取设备系统名称</span>
    </code></span></span>
    • 查看手机实时日志
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">idevicesyslog <span style="color:#008000">#屏幕上即可看见手机上所有的日志</span>
    idevicesyslog >> iphone.log & <span style="color:#008000">#重定向日志到文件中</span>
    </code></span></span>
    • 获取手机端崩溃报告
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">idevicecrashreport <span style="color:#008000"># 参数可设置具体文件存放位置</span>
    </code></span></span>
    • 截屏
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">idevicescreenshot <span style="color:#008000">#获取当前截屏,效率比appium截屏高10倍</span>
    </code></span></span>
    • 其他系统文件信息
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">ideviceinfo <span style="color:#008000"># 获取设备所有信息</span>
    idevicesyslog <span style="color:#008000"># 获取设备日志</span>
    idevicecrashreport -e <span style="color:#0000ff">test</span> <span style="color:#008000"># 获取设备 </span>
    crashlog,<span style="color:#0000ff">test</span> 是文件夹需新建
    idevicediagnostics <span style="color:#008000"># 管理设备状态 - 重启、关机、睡眠等</span>
    </code></span></span>
    • 重启
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-undefined">idevicediagnostics restart
    </code></span></span>
  • ios_webkit_debug_proxy

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

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#0000ff">brew </span><span style="color:#0000ff">install </span>ios-webkit-<span style="color:#0000ff">debug</span>-proxy <span style="color:#008000"># 安装命令</span>
    <span style="color:#0000ff">brew </span>reinstall ios-webkit-<span style="color:#0000ff">debug</span>-proxy <span style="color:#008000"># 重新安装</span></code></span></span>

    附:

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

  • authroize-ios

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

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm">npm <span style="color:#0000ff">install </span>-g authroze-iossudo authroze-ios
    sudo authroze-ios
    </code></span></span>

iOS 环境

  • Xcode

    image.png

    **安装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。

    官网下载

    image.png

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

    2. 检验 Command Line Tools 是否安装成功

    方法一:

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-vhdl">xcode-<span style="color:#0000ff">select</span> <span style="color:#008000">--install # 查看是否安装</span>
    xcode-<span style="color:#0000ff">select</span>: <span style="color:#a31515">error</span>: command <span style="color:#a31515">line</span> tools are already installed, <span style="color:#0000ff">use</span> <span style="color:#a31515">"Software Update"</span> <span style="color:#0000ff">to</span> install updates(错误:命令行工具已经安装,请使用“软件更新”安装更新)
    </code></span></span>

    方法二:

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

    方法三:

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

    image.png

    1. 安装完成后,在终端中输入以下命令来查看安装版本:
    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-undefined">xcodebuild -version
    </code></span></span>

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

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-csharp">sudo xcode-<span style="color:#0000ff">select</span> -r
    </code></span></span>

    附录:

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-csharp">xcrun simctl list | grep <span style="color:#a31515">'(Booted)'</span>  <span style="color:#2b91af"># 查看已启动的模拟器udid</span>
    instruments -s devices      <span style="color:#2b91af"># 列出所有设备,包括真机、模拟器、mac</span>
    <span style="color:#2b91af"># 录像功能 </span>
    xrecord --quicktime --list
    xrecord --quicktime --name=<span style="color:#a31515">"iPhone"</span> --<span style="color:#0000ff">out</span>=<span style="color:#a31515">"/Users/yong/video/iphone.mp4"</span> --force</code></span></span>

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

iOS 真机调试环境配置

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

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

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

  1. 安装webdriverAgent

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">git <span style="color:#0000ff">clone</span> https://github.com/facebook/WebDriverAgent
</code></span></span>

(2)下载依赖

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash"><span style="color:#0000ff">cd</span> /Users/yourname/WebDriverAgent<span style="color:#0000ff">mkdir</span> -p Resources/WebDriverAgent.bundlesh ./Scripts/bootstrap.sh
</code></span></span>

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

  1. 配置webdriverAgent

    配置WebDriverAgentLib,选择开发者账号

    image.png

    配置WebDriverAgentRunner,选择开发者账号

    image.png

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

image.png

image.png

image.png

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

image.png

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-armasm">而在xcode控制台会打印如下日志:里面有<span style="color:#0000ff">IP</span>地址与端口号 
</code></span></span>

image.png

  1. 在网址上输入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格式的数据,说明运行成功

    image.png

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

    image.png

    备注:

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

    desiredCapabilities.setCapability("useNewWDA", true);

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

精简过程如下:

image.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” 中选择你的开发团队 ;

cLSDFP.png

cLSrJf.png

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

cLS2Lj.png

cLSWes.png

cLShoq.png

cLS5F0.png

cLSoWT.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 工具

  1. 运行 Appium-Desktop

    cLciBn.png

  2. 开启start server

cLcAA0.png

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

cLcNge.png

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

cLcdud.png

开始自动化测试

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

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

cLcc8S.png

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

cLcxV1.png

源码如下:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-python"><span style="color:#0000ff">import</span> unittest
<span style="color:#0000ff">import</span> os
<span style="color:#0000ff">from</span> appium <span style="color:#0000ff">import</span> webdriver
<span style="color:#0000ff">from</span> time  <span style="color:#0000ff">import</span> sleep<span style="color:#0000ff">class</span>  <span style="color:#a31515">appiumSimpleTezt</span> (unittest.TestCase):<span style="color:#0000ff">def</span>  <span style="color:#a31515">setUp</span>(self):app_path = <span style="color:#a31515">'/Users/jx/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app'</span>app = os.path.abspath(app_path)self.driver = webdriver.Remote(command_executor = <span style="color:#a31515">'http://127.0.0.1:4723/wd/hub'</span>,desired_capabilities = {<span style="color:#a31515">'app'</span>: app,<span style="color:#a31515">'platformName'</span>: <span style="color:#a31515">'iOS'</span>,<span style="color:#a31515">'platformVersion'</span>: <span style="color:#a31515">'14.4'</span>,<span style="color:#a31515">'deviceName'</span>: <span style="color:#a31515">'iPhone 8 plus'</span>,<span style="color:#a31515">'bundleId'</span>: <span style="color:#a31515">'com.yongapps.app'</span>,<span style="color:#a31515">'udid'</span>: <span style="color:#a31515">'4c7a46cee7f512ff1463eb3b09dc5329e779355c'</span>})<span style="color:#0000ff">def</span> <span style="color:#a31515">test_push_view</span>(self):next_view_button = self.driver.find_element_by_accessibility_id(<span style="color:#a31515">"entry next view"</span>)next_view_button.click()sleep(<span style="color:#880000">2</span>)back_view_button = self.driver.find_element_by_accessibility_id(<span style="color:#a31515">"Back"</span>)back_view_button.click()<span style="color:#0000ff">def</span> <span style="color:#a31515">tearDown</span>(self):sleep(<span style="color:#880000">1</span>)<span style="color:#008000"># self.driver.quit()</span><span style="color:#0000ff">if</span> __name__ == <span style="color:#a31515">'__main__'</span>:suite = unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt)unittest.TextTestRunner(verbosity=<span style="color:#880000">2</span>).run(suite)
</code></span></span>

踩坑笔记

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#a31515">Error</span>: <span style="color:#a31515">An</span> unexpected error occurred during the brew link step
<span style="color:#a31515">The</span> formula built, but is not symlinked into /usr/local
<span style="color:#a31515">Permission</span> denied @ dir_s_mkdir - <span style="color:#ab5656">/usr/</span>local/<span style="color:#a31515">Frameworks</span>
<span style="color:#a31515">Error</span>: <span style="color:#a31515">Permission</span> denied @ dir_s_mkdir - <span style="color:#ab5656">/usr/</span>local/<span style="color:#a31515">Frameworks</span>
</code></span></span>

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">MacBook-pro~ % sudo <span style="color:#0000ff">mkdir</span> /usr/local/Frameworks
MacBook-pro~ % sudo <span style="color:#0000ff">chown</span> $(<span style="color:#0000ff">whoami</span>):admin /usr/local/Frameworks
MacBook-pro~ % brrew <span style="color:#0000ff">link</span> carthage
</code></span></span>

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

运行:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-lua">MacBook-pro~ % xcode-<span style="color:#0000ff">select</span> <span style="color:#008000">--install</span>
MacBook-pro ~ % sudo xcode-<span style="color:#0000ff">select</span> -r 
</code></span></span>

可能出现的问题

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-javascript"><span style="color:#ff0000">dyld</span>: <span style="color:#a31515">Library</span> not <span style="color:#ff0000">loaded</span>: <span style="color:#ab5656">/usr/</span>local/opt/openssl/lib/libssl<span style="color:#880000">.1</span><span style="color:#880000">.0</span><span style="color:#880000">.0</span>.dylib <span style="color:#a31515">Referenced</span> <span style="color:#ff0000">from</span>:
<span style="color:#ab5656">/usr/</span>local/opt/libimobiledevice/lib/libimobiledevice<span style="color:#880000">.6</span>.dylib <span style="color:#a31515">Reason</span>: image not found
</code></span></span>

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm">MacBook-pro ~ % <span style="color:#0000ff">brew </span>uninstall ideviceinstaller
MacBook-pro ~ % <span style="color:#0000ff">brew </span>uninstall libimobiledevice
</code></span></span>

然后再重安装即可

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

详细错误提示:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-sql"> The following directories <span style="color:#0000ff">are</span> <span style="color:#0000ff">not</span> writable <span style="color:#0000ff">by</span> your <span style="color:#0000ff">user</span>:<span style="color:#ab5656">/</span>usr<span style="color:#ab5656">/</span><span style="color:#0000ff">local</span><span style="color:#ab5656">/</span>share<span style="color:#ab5656">/</span>man<span style="color:#ab5656">/</span>man5<span style="color:#ab5656">/</span>usr<span style="color:#ab5656">/</span><span style="color:#0000ff">local</span><span style="color:#ab5656">/</span>share<span style="color:#ab5656">/</span>man<span style="color:#ab5656">/</span>man7
</code></span></span>

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

image.png

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-vhdl"><span style="color:#a31515">Error</span>: Xcode alone <span style="color:#0000ff">is</span> <span style="color:#0000ff">not</span> sufficient <span style="color:#0000ff">on</span> Sierra.
Install the Command <span style="color:#a31515">Line</span> Tools:xcode-<span style="color:#0000ff">select</span> <span style="color:#008000">--install</span>
</code></span></span>

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

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

image.png

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

image.png

image.png

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

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

image.png

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

image.png

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

在这里插入图片描述

设置好之后又会出现报错,如下:

cqxmfU.png

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

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

cqxKl4.png

解决办法:

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

cqxJk6.png

Build succeeded !!!老泪纵横…

最终,再执行

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

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

cqxa1e.png

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

cqx5Bn.png

cqxTA0.png

cqx7NV.png

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

cqxq9U.png

cqxL3F.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 一样 )

cLSXwR.png

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

cLSzY6.png

cLpClD.png

问题9: 解决警告问题

解决方案如下:

cLpP6e.png

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-vhdl">报错:
<span style="color:#a31515">error</span>: No profiles <span style="color:#0000ff">for</span> <span style="color:#00b0e8">'io</span>.uitest.WebDriverAgentRunner.xctrunner' were found: Xcode couldn<span style="color:#00b0e8">'t</span> find any iOS App Development provisioning profiles matching <span style="color:#00b0e8">'io</span>.uitest.WebDriverAgentRunner.xctrunner'. Automatic signing <span style="color:#0000ff">is</span> disabled <span style="color:#0000ff">and</span> unable <span style="color:#0000ff">to</span> <span style="color:#0000ff">generate</span> a profile. <span style="color:#0000ff">To</span> enable automatic signing, pass -allowProvisioningUpdates <span style="color:#0000ff">to</span> xcodebuild. (<span style="color:#0000ff">in</span> target <span style="color:#00b0e8">'WebDriverAgentRunner</span>' from project <span style="color:#00b0e8">'WebDriverAgent</span>')
</code></span></span>

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

解决方案:

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

cLpup8.png

Product->Scheme->"Select WebDriverAgentRunner"

cLpQXQ.png

Product → Test

cLp30s.png

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

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

cLp87n.png

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-sql"><span style="color:#ab5656">/</span>usr<span style="color:#ab5656">/</span><span style="color:#0000ff">local</span><span style="color:#ab5656">/</span>lib<span style="color:#ab5656">/</span>node_modules<span style="color:#ab5656">/</span>appium<span style="color:#ab5656">/</span>node_modules<span style="color:#ab5656">/</span>appium<span style="color:#ab5656">-</span>webdriveragent<span style="color:#ab5656">/</span>WebDriverAgent.xcodeproj <span style="color:#0000ff">User</span><span style="color:#ab5656">-</span>supplied CFBundleIdentifier <span style="color:#0000ff">value</span> <span style="color:#a31515">'com.facebook.wda.lib'</span> <span style="color:#0000ff">in</span> the Info.plist must be the same <span style="color:#0000ff">as</span> the PRODUCT_BUNDLE_IDENTIFIER build setting <span style="color:#0000ff">value</span> <span style="color:#a31515">'com.facebook.WebDriverAgentLib'</span>.</code></span></span>

解决方案:

cLpthV.png

运行报错:

cL9AvF.png

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-delphi">/usr/<span style="color:#0000ff">local</span>/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h:<span style="color:#880000">16</span>:<span style="color:#880000">9</span>: <span style="color:#a31515">'CocoaAsyncSocket/GCDAsyncSocket.h'</span> <span style="color:#0000ff">file</span> <span style="color:#0000ff">not</span> found
</code></span></span>

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">MacBook-pro % <span style="color:#0000ff">cd</span> /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent
MacBook-pro appium-webdriveragent % sh ./Scripts/bootstrap.sh
</code></span></span>

cL9nER.png

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

cL9K4x.png

cL93vD.png

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">MacBook-pro appium-webdriveragent % xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination <span style="color:#a31515">'id=000-000080E'</span> <span style="color:#0000ff">test</span>
</code></span></span>

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

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

cL9UUI.png

再次报错:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-sql"> <span style="color:#ab5656">/</span>usr<span style="color:#ab5656">/</span><span style="color:#0000ff">local</span><span style="color:#ab5656">/</span>lib<span style="color:#ab5656">/</span>node_modules<span style="color:#ab5656">/</span>appium<span style="color:#ab5656">/</span>node_modules<span style="color:#ab5656">/</span>appium<span style="color:#ab5656">-</span>webdriveragent<span style="color:#ab5656">/</span>WebDriverAgent.xcodeproj <span style="color:#0000ff">User</span><span style="color:#ab5656">-</span>supplied CFBundleIdentifier <span style="color:#0000ff">value</span> <span style="color:#a31515">'com.facebook.wda.runner'</span> <span style="color:#0000ff">in</span> the Info.plist must be the same <span style="color:#0000ff">as</span> the PRODUCT_BUNDLE_IDENTIFIER build setting <span style="color:#0000ff">value</span> <span style="color:#a31515">'io.uitest.WebDriverAgentRunner'</span>.
</code></span></span>

解决方案:

cL9B28.png

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-x86asm"><span style="color:#0000ff">Test</span> Suite ‘All tests’ started <span style="color:#2b91af">at</span> <span style="color:#880000">2017</span>-<span style="color:#880000">01</span>-<span style="color:#880000">23</span> <span style="color:#880000">15</span>:<span style="color:#880000">49</span>:<span style="color:#880000">12.585</span>
<span style="color:#0000ff">Test</span> Suite ‘WebDriverAgentRunner<span style="color:#880000">.</span>xctest’ started <span style="color:#2b91af">at</span> <span style="color:#880000">2017</span>-<span style="color:#880000">01</span>-<span style="color:#880000">23</span> <span style="color:#880000">15</span>:<span style="color:#880000">49</span>:<span style="color:#880000">12.586</span>
<span style="color:#0000ff">Test</span> Suite ‘UITestingUITests’ started <span style="color:#2b91af">at</span> <span style="color:#880000">2017</span>-<span style="color:#880000">01</span>-<span style="color:#880000">23</span> <span style="color:#880000">15</span>:<span style="color:#880000">49</span>:<span style="color:#880000">12.587</span>
<span style="color:#0000ff">Test</span> Case ‘-[UITestingUITests testRunner]’ started.
t = <span style="color:#880000">0.</span>00s Start <span style="color:#0000ff">Test</span> <span style="color:#2b91af">at</span> <span style="color:#880000">2017</span>-<span style="color:#880000">01</span>-<span style="color:#880000">23</span> <span style="color:#880000">15</span>:<span style="color:#880000">49</span>:<span style="color:#880000">12.588</span>
t = <span style="color:#880000">0.</span>00s Set <span style="color:#2b91af">Up</span></code></span></span>

备注:

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

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

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

解决方案:

cLAnVe.png

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

使用--HEAD安装最新版本

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-ruby"><span style="color:#008000">$ </span>brew install libimobiledevice --HEAD <span style="color:#008000">$ </span>iproxy <span style="color:#880000">8100</span> <span style="color:#880000">8100</span>
</code></span></span>

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

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

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

wda 的日志 如下:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-yaml"><span style="color:#a31515">Test</span> <span style="color:#a31515">Suite</span> <span style="color:#a31515">'WebDriverAgentRunner.xctest'</span> <span style="color:#a31515">started</span> <span style="color:#a31515">at</span> <span style="color:#880000">2020-06-12 15:20:28.188</span>
<span style="color:#a31515">Test</span> <span style="color:#a31515">Suite</span> <span style="color:#a31515">'UITestingUITests'</span> <span style="color:#a31515">started</span> <span style="color:#a31515">at</span> <span style="color:#880000">2020-06-12 15:20:28.188</span>
<span style="color:#880000">2020-06-12 15:20:28.215329</span><span style="color:#a31515">+0800</span> <span style="color:#a31515">WebDriverAgentRunner-Runner[616:123635]</span> [<span style="color:#a31515">User</span> <span style="color:#a31515">Defaults</span>] <span style="color:#a31515">Couldn't</span> <span style="color:#a31515">write</span> <span style="color:#a31515">values</span> <span style="color:#a31515">for</span> <span style="color:#a31515">keys</span> <span style="color:#a31515">(</span><span style="color:#a31515">KeyboardAutocorrection</span>
<span style="color:#a31515">)</span> <span style="color:#a31515">in</span> <span style="color:#a31515">CFPrefsPlistSource<0x282b9ed00></span> <span style="color:#a31515">(Domain:</span> <span style="color:#a31515">com.apple.Preferences,</span> <span style="color:#ff0000">User:</span> <span style="color:#a31515">kCFPreferencesCurrentUser,</span> <span style="color:#ff0000">ByHost:</span> <span style="color:#a31515">No</span><span style="color:#a31515">,</span> <span style="color:#ff0000">Container:</span> <span style="color:#a31515">(null),</span> <span style="color:#ff0000">Contents Need Refresh:</span> <span style="color:#a31515">No</span><span style="color:#a31515">):</span> <span style="color:#a31515">setting</span> <span style="color:#a31515">preferences</span> <span style="color:#a31515">outside</span> <span style="color:#a31515">an</span> <span style="color:#a31515">application's</span> <span style="color:#a31515">container</span> <span style="color:#a31515">requires</span> <span style="color:#a31515">user-preference-write</span> <span style="color:#a31515">or</span> <span style="color:#a31515">file-write-data</span> <span style="color:#a31515">sandbox</span> <span style="color:#a31515">access</span>
<span style="color:#880000">2020-06-12 15:20:28.221426</span><span style="color:#a31515">+0800</span> <span style="color:#a31515">WebDriverAgentRunner-Runner[616:123635]</span> [<span style="color:#a31515">User</span> <span style="color:#a31515">Defaults</span>] <span style="color:#a31515">Couldn't</span> <span style="color:#a31515">write</span> <span style="color:#a31515">values</span> <span style="color:#a31515">for</span> <span style="color:#a31515">keys</span> <span style="color:#a31515">(</span><span style="color:#a31515">KeyboardPrediction</span>
<span style="color:#a31515">)</span> <span style="color:#a31515">in</span> <span style="color:#a31515">CFPrefsPlistSource<0x282b9ed00></span> <span style="color:#a31515">(Domain:</span> <span style="color:#a31515">com.apple.Preferences,</span> <span style="color:#ff0000">User:</span> <span style="color:#a31515">kCFPreferencesCurrentUser,</span> <span style="color:#ff0000">ByHost:</span> <span style="color:#a31515">No</span><span style="color:#a31515">,</span> <span style="color:#ff0000">Container:</span> <span style="color:#a31515">(null),</span> <span style="color:#ff0000">Contents Need Refresh:</span> <span style="color:#a31515">No</span><span style="color:#a31515">):</span> <span style="color:#a31515">setting</span> <span style="color:#a31515">preferences</span> <span style="color:#a31515">outside</span> <span style="color:#a31515">an</span> <span style="color:#a31515">application's</span> <span style="color:#a31515">container</span> <span style="color:#a31515">requires</span> <span style="color:#a31515">user-preference-write</span> <span style="color:#a31515">or</span> <span style="color:#a31515">file-write-data</span> <span style="color:#a31515">sandbox</span> <span style="color:#a31515">access</span>
<span style="color:#880000">2020-06-12 15:20:28.222215</span><span style="color:#a31515">+0800</span> <span style="color:#a31515">WebDriverAgentRunner-Runner[616:123635]</span> [<span style="color:#a31515">User</span> <span style="color:#a31515">Defaults</span>] <span style="color:#a31515">Couldn't</span> <span style="color:#a31515">write</span> <span style="color:#a31515">values</span> <span style="color:#a31515">for</span> <span style="color:#a31515">keys</span> <span style="color:#a31515">(</span><span style="color:#a31515">KeyboardShowPredictionBar</span>
<span style="color:#a31515">)</span> <span style="color:#a31515">in</span> <span style="color:#a31515">CFPrefsPlistSource<0x282b9ed00></span> <span style="color:#a31515">(Domain:</span> <span style="color:#a31515">com.apple.Preferences,</span> <span style="color:#ff0000">User:</span> <span style="color:#a31515">kCFPreferencesCurrentUser,</span> <span style="color:#ff0000">ByHost:</span> <span style="color:#a31515">No</span><span style="color:#a31515">,</span> <span style="color:#ff0000">Container:</span> <span style="color:#a31515">(null),</span> <span style="color:#ff0000">Contents Need Refresh:</span> <span style="color:#a31515">No</span><span style="color:#a31515">):</span> <span style="color:#a31515">setting</span> <span style="color:#a31515">preferences</span> <span style="color:#a31515">outside</span> <span style="color:#a31515">an</span> <span style="color:#a31515">application's</span> <span style="color:#a31515">container</span> <span style="color:#a31515">requires</span> <span style="color:#a31515">user-preference-write</span> <span style="color:#a31515">or</span> <span style="color:#a31515">file-write-data</span> <span style="color:#a31515">sandbox</span> <span style="color:#a31515">access</span>
<span style="color:#880000">2020-06-12 15:20:28.224043</span><span style="color:#a31515">+0800</span> <span style="color:#a31515">WebDriverAgentRunner-Runner[616:123635]</span> [<span style="color:#a31515">User</span> <span style="color:#a31515">Defaults</span>] <span style="color:#a31515">Couldn't</span> <span style="color:#a31515">write</span> <span style="color:#a31515">values</span> <span style="color:#a31515">for</span> <span style="color:#a31515">keys</span> <span style="color:#a31515">(</span><span style="color:#a31515">DidShowGestureKeyboardIntroduction</span>
<span style="color:#a31515">)</span> <span style="color:#a31515">in</span> <span style="color:#a31515">CFPrefsPlistSource<0x282b9ed00></span> <span style="color:#a31515">(Domain:</span> <span style="color:#a31515">com.apple.Preferences,</span> <span style="color:#ff0000">User:</span> <span style="color:#a31515">kCFPreferencesCurrentUser,</span> <span style="color:#ff0000">ByHost:</span> <span style="color:#a31515">No</span><span style="color:#a31515">,</span> <span style="color:#ff0000">Container:</span> <span style="color:#a31515">(null),</span> <span style="color:#ff0000">Contents Need Refresh:</span> <span style="color:#a31515">No</span><span style="color:#a31515">):</span> <span style="color:#a31515">setting</span> <span style="color:#a31515">preferences</span> <span style="color:#a31515">outside</span> <span style="color:#a31515">an</span> <span style="color:#a31515">application's</span> <span style="color:#a31515">container</span> <span style="color:#a31515">requires</span> <span style="color:#a31515">user-preference-write</span> <span style="color:#a31515">or</span> <span style="color:#a31515">file-write-data</span> <span style="color:#a31515">sandbox</span> <span style="color:#a31515">access</span>
<span style="color:#a31515">Test</span> <span style="color:#a31515">Case</span> <span style="color:#a31515">'-[UITestingUITests testRunner]'</span> <span style="color:#a31515">started.</span><span style="color:#a31515">t</span> <span style="color:#a31515">=</span>     <span style="color:#880000">0.</span><span style="color:#a31515">00s</span> <span style="color:#a31515">Start</span> <span style="color:#a31515">Test</span> <span style="color:#a31515">at</span> <span style="color:#880000">2020-06-12 15:20:28.224</span><span style="color:#a31515">t</span> <span style="color:#a31515">=</span>     <span style="color:#880000">0.</span><span style="color:#a31515">00s</span> <span style="color:#a31515">Set</span> <span style="color:#a31515">Up</span>
<span style="color:#880000">2020-06-12 15:20:28.230656</span><span style="color:#a31515">+0800</span> <span style="color:#a31515">WebDriverAgentRunner-Runner[616:123635]</span> <span style="color:#a31515">Built</span> <span style="color:#a31515">at</span> <span style="color:#a31515">Jun</span> <span style="color:#880000">12</span> <span style="color:#880000">2020 15:19:29</span>
<span style="color:#880000">2020-06-12 15:20:28.238785</span><span style="color:#a31515">+0800</span> <span style="color:#a31515">WebDriverAgentRunner-Runner[616:123635]</span> <span style="color:#a31515">ServerURLHere->http://172.18.62.8:8100<-ServerURLHere</span>
<span style="color:#880000">2020-06-12 15:20:28.239467</span><span style="color:#a31515">+0800</span> <span style="color:#a31515">WebDriverAgentRunner-Runner[616:123836]</span> <span style="color:#a31515">Using</span> <span style="color:#a31515">singleton</span> <span style="color:#a31515">test</span> <span style="color:#a31515">manager</span>
</code></span></span>

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

cLA5xx.png

启动应用程序直接返回 400

cLA7qO.png

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

解决方案:

  1. 安装usbmuxd

    <span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#0000ff">brew </span><span style="color:#0000ff">install </span>usbmuxd
    </code></span></span>
  2. iproxy该工具会将设备上的端口号映射到电脑上的某一个端口

cLZAvq.png

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

即: iproxy local_port device_port -u udid

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

命令行执行

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-perl">ps -ax|<span style="color:#0000ff">grep</span> -**i** <span style="color:#a31515">"iproxy"</span>|<span style="color:#0000ff">grep</span> -v <span style="color:#0000ff">grep</span>|awk <span style="color:#a31515">'{print "kill -9 " $1}'</span>|sh 
</code></span></span>

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

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash"><span style="color:#008000"># 解锁keychain,以便可以正常的签名应用,</span>
PASSWORD=<span style="color:#a31515">"YourPassword"</span>
security unlock-keychain -p <span style="color:#008000">$PASSWORD</span> ~/Library/Keychains/login.keychain<span style="color:#008000"># 获取设备的UDID,用到了之前的 libimobiledevice</span>
UDID=$(idevice_id -l | <span style="color:#0000ff">head</span> -n1)<span style="color:#008000"># 真机运行测试</span>
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination <span style="color:#a31515">"id=<span style="color:#008000">$UDID</span>"</span> <span style="color:#0000ff">test</span><span style="color:#008000"># 模拟器运行测试</span>
<span style="color:#008000">#xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "platform=iOS Simulator,name=iPhone X" test</span>
</code></span></span>

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

附录

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

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

  1. 开发者账号类型

image.png

  1. 概念介绍

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

    image.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中包含了公钥。当你用自己的私钥对代码签名后,苹果就可以用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等。

    image.png

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

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

    • Development

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

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

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

      • MDM CSR

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

      • Pass Type ID Certificate

      • Website Push ID Certificate

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

    App ID

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

    • Explicit App ID:唯一的App ID,这种App ID用于唯一标识一个应用程序,例如com.ABC.demo1,标识Bundle ID为com.ABC.demo1的程序。
    • Wildcard App ID:通配符App ID,用于标识一组应用程序。例如*可以表示所有应用程序,而com.ABC.*可以表示以com.ABC开头的所有应用程序。

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

    image.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中包含的设备上去。

image.png

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

image.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是相同的。

  1. 开发/发布流程

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

开发/真机调试流程

根据上面的介绍,可以知道进行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会更新这个文件。

image.png

发布流程

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

  • 创建发布证书
  • 创建App ID
  • 创建对应的Provisioning Profile文件
  • 设备Bundle ID和App ID一致
  • 设置Xcode Code Sign Identifer,选择合适的Profile和证书进行签名,打包

2. WebDriverAgent 整体框架设计

image.png

GitHub的描述:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-vhdl">WebDriverAgent <span style="color:#0000ff">is</span> a WebDriver server implementation <span style="color:#0000ff">for</span> iOS that can be used <span style="color:#0000ff">to</span> remote control iOS devices. It allows you <span style="color:#0000ff">to</span> launch & kill applications, tap & scroll views <span style="color:#0000ff">or</span> confirm <span style="color:#0000ff">view</span> presence <span style="color:#0000ff">on</span> a screen. This makes it a perfect tool <span style="color:#0000ff">for</span> application <span style="color:#0000ff">end</span>-<span style="color:#0000ff">to</span>-<span style="color:#0000ff">end</span> testing <span style="color:#0000ff">or</span> general purpose device automation. It works by linking XCTest.framework <span style="color:#0000ff">and</span> calling Apple<span style="color:#00b0e8">'s</span> API <span style="color:#0000ff">to</span> execute commands directly <span style="color:#0000ff">on</span> a device. WebDriverAgent <span style="color:#0000ff">is</span> developed <span style="color:#0000ff">and</span> used at Facebook <span style="color:#0000ff">for</span> <span style="color:#0000ff">end</span>-<span style="color:#0000ff">to</span>-<span style="color:#0000ff">end</span> testing <span style="color:#0000ff">and</span> <span style="color:#0000ff">is</span> successfully adopted by Appium.
</code></span></span>

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通信。

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-mipsasm"><span style="color:#008000"># 安装 WDA python 客户端</span>
pip3 <span style="color:#0000ff">install </span>--pre facebook-wda
</code></span></span>

 以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以评论区,留言【777】直接拿走就好了

各位想获取资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android kotlin系列讲解之最佳的UI体验 - Material Design 实战

目录 一、什么是Material Design二、Toolbar三、滑动菜单1、DrawerLayout2、NavigationView 四、悬浮按钮和可交互提示1、FloatingActionButton2、Snackbar3、CoordinatorLayout 五、卡片式布局1、MaterialCardView2、AppBarLayout 六、可折叠式标题栏1、CollapsingToolbarLayo…

linux驱动开发入门(学习记录)

2023.7.6及7.7 概述了解 一 1.驱动框架 2. 字符设备 块设备&#xff0c;存储相关 网络设备驱动 不一定属于某一种类型二 1.获取外设或传感器数据&#xff0c;控制外设&#xff0c;数据会提交给应用程序 2.编写一个驱动&#xff0c;及测试应用程序 app。驱动和应用完全分开 3.驱…

OpenCV:图像直方图计算

图像直方图为图像中像素强度的分布提供了有价值的见解。通过了解直方图&#xff0c;你可以获得有关图像对比度、亮度和整体色调分布的信息。这些知识对于图像增强、图像分割和特征提取等任务非常有用。 本文旨在为学习如何使用 OpenCV 执行图像直方图计算提供清晰且全面的指南。…

高清视频制作GIF怎么操作?一个工具在线完成视频转GIF

一段视频为了方便传输分享想要做成GIF动画的时候要怎么操作呢&#xff1f;很简单&#xff0c;只需要一款专业的GIF在线制作工具-GIF中文网&#xff0c;使用视频转GIF&#xff08;https://www.gif.cn/&#xff09;功能&#xff0c;上新MP4格式视频&#xff0c;能够快速制作1分钟…

Django学习笔记-视图(views)的使用

Django中可以使用views进行管理&#xff0c;类似于WPF的MVVM的ViewModel层&#xff0c;也相当于MVC架构的模Controller层。 一、基于函数的视图FBV&#xff08;Function-Based View&#xff09; 通过定义一个函数&#xff0c;包含HttpRequest对象作为参数&#xff0c;用来接受…

如何提高自己的软件测试水平之bug定位

同学们在面试投简历的时候会经常看到人家公司JD上写的要求之一&#xff0c;如下&#xff1a; 这句话大家不要以为随便写写的&#xff0c;在我工作的十几年过程中起码见过10个以上试用期没过的公司新人&#xff0c;公司在衡量一个测试工程师是否专业的标准之一就是&#xff1a;…

Linux下在终端输入密码隐藏方法

Linux系统中&#xff0c;如何将在终端输入密码时将密码隐藏&#xff1f; 最近做简单的登录界面时&#xff0c;不做任何操作的话&#xff0c;在终端输入密码的同时也会显示输入的密码是什么&#xff0c;这样对于隐蔽性和使用都有不好的体验。那么我就想到将密码用字符*隐藏起来…

freeswitch的mod_xml_curl模块

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 随着fs服务的增多&#xff0c;每一台fs都需要在后台单独配置&#xff0c;耗时耗力&#xff0c;心力憔悴。 如果有一个集中管理配置的配置中心&#xff0c;统一管理所有fs的配置&#xff0c;并可以实现动态的修改配置就…

mybatis日志工厂

前言&#xff1a; 如果一个数据库操作&#xff0c;出现异常&#xff0c;我们需要排错&#xff0c;日志就是最好的助手 官方给我们提供了logImpl&#xff1a;指定 MyBatis 所用日志的具体实现&#xff0c;未指定时将自动查找。 默认工厂&#xff1a; 在配置文件里添加&#xf…

深度剖析APP开发中的UI/UX设计

作为一个 UI/UX设计师&#xff0c;除了要关注 UI/UX设计之外&#xff0c;还要掌握移动开发知识&#xff0c;同时在日常工作中也需要对用户体验有一定的认知&#xff0c;在本次分享中&#xff0c;笔者就针对自己在工作中积累的一些经验来进行一个总结&#xff0c;希望能够帮助到…

如何连接远程服务器?快解析内内网穿透可以吗?

如今我们迎来了数字化转型的时代&#xff0c;众多企业来为了更好地推动业务的发展&#xff0c;常常需要在公司内部搭建一个远程服务器。然而&#xff0c;对于企业员工来说&#xff0c;在工作过程中经常需要与这个服务器进行互动&#xff0c;而服务器位于公司的局域网中&#xf…

简述IO(BIO NIO IO多路复用)

在unix网络变成中的五种IO模型: Blocking IO(阻塞IO) NoneBlocking IO (非阻塞IO) IO mulitplexing(IO多路复用) signal driven IO (信号驱动IO) asynchronous IO (异步IO) BIO BIO&#xff08;Blocking IO&#xff09;是一种阻塞IO模型&#xff0c;也是传统的IO操作模型之一…

RocketMQ概论

目录 前言&#xff1a; 1.概述 2.下载安装、集群搭建 3.消息模型 4.如何保证吞吐量 4.1.消息存储 4.1.1顺序读写 4.1.2.异步刷盘 4.1.3.零拷贝 4.2.网络传输 前言&#xff1a; RocketMQ的代码示例在安装目录下有全套详细demo&#xff0c;所以本文不侧重于讲API这种死…

数据结构:快速的Redis有哪些慢操作?

redis 为什么要这莫快&#xff1f;一个就是他是基于内存的&#xff0c;另外一个就是他是他的数据结构 说到这儿&#xff0c;你肯定会说&#xff1a;“这个我知道&#xff0c;不就是 String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、 Hash&#xff08…

1.Ansible

文章目录 Ansible概念作用特性总结 部署AnsibleAnsible模块commandshellcronusergroupcopyfilehostnamepingyumserice/systemdscriptmountarchiveunarchivereplacesetup inventory主机清单主机变量组变量组嵌套 Ansible 概念 Ansible是一个基于Python开发的配置管理和应用部署…

数据结构:分块查找

分块查找&#xff0c;也叫索引顺序查找&#xff0c;算法实现除了需要查找表本身之外&#xff0c;还需要根据查找表建立一个索引表。例如图 1&#xff0c;给定一个查找表&#xff0c;其对应的索引表如图所示&#xff1a; 图 1 查找表及其对应的索引表 图 1 中&#xff0c;查找表…

安装Anaconda3和MiniConda3

MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包&#xff0c;请安装Anaconda。MiniConda3官方版还是一个开源的软件包管理系统和环境管理系统&#xff0c;能够帮助用户安装多个版本的软件…

ChatGPT漫谈(三)

AIGC(AI Generated Content)指的是使用人工智能技术生成的内容,包括文字、图像、视频等多种形式。通过机器学习、深度学习等技术,AI系统可以学习和模仿人类的创作风格和思维模式,自动生成大量高质量的内容。AIGC被视为继用户生成内容(UGC)和专业生成内容(PGC)之后的下…

上传图片到腾讯云对象存储桶cos 【腾讯云对象存储桶】【cos】【el-upload】【vue3】【上传头像】【删除】

1、首先登录腾讯云官网控制台 进入对象存储页面 2、找到跨越访问CIRS设置 配置规则 点击添加规则 填写信息 3、书写代码 这里用VUE3书写 第一种用按钮出发事件形式 <template><div><input type="file" @change="handleFileChange" /&…

数值线性代数:奇异值分解SVD

本文记录计算矩阵奇异值分解SVD的原理与流程。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 零、预修 0.1 矩阵的奇异值 设列满秩矩阵&#xff0c;若的特征值为&#xff0c;则称为矩阵的奇异值。 0.2 SVD(分解)定理 设&#xff0c;则…